Feeds:
文章
留言

Archive for 2008 年 02 月

C++ Builder 6.0 專案樣板

你是否也和我一樣覺得,每次新增一個專案都要手動引入 boost 的 include/lib 路徑很麻煩,再找不到 IDE 的設定之下,我找好從檔案尋找,在

C:Program FilesBorlandCBuilder6Bin 目錄下有一個 default.bpr,這就是每次新增專案時的專案樣板,如果你要讓專案每次都自動引入 boost Library 可如下修改設定:

<INCLUDEPATH value="&quot;C:Program FilesBorlandCBuilder6Projects&quot;;$(BCB)include;$(BCB)includevcl;C:Program FilesBorlandCBuilder6;C:Boost_CB6includeboost-1_34_1"/>
<LIBPATH value="&quot;C:Program FilesBorlandCBuilder6Projects&quot;;$(BCB)libobj;$(BCB)lib;C:Boost_CB6lib"/>

以後新增專案就不用這麼麻煩了 ^O^

你當然也可以修改樣板其他設定符合你的開發需要,不過,C++ Builder 應該有對應工具或選項才對,請知道的人告訴我一下~

另外,該目錄除了剛剛談到的樣板之外還有

default.bmk — makefile 樣板

deflib.bmk — makefile 樣板, library 用

Read Full Post »

C++ 寫 Console 程式常常需要解析命令列參數,可是在 STL 並沒有提供好用的類別可供使用,之前一直很想整理一個負責此功能的類別,直到今天迫不得以抽空測試 boost 提供的 program_option 類別,以解我的 C++ 長期解析命令列參數的麻煩,以下是一個簡單的範例,針對常用的無參數、int 參數和字串參數作解析,對於不支援的參數則自動忽略,範例如下:

//—————————————————————————
#include <boostprogram_options.hpp>
#include <string>
#include <iostream>
#pragma hdrstop
//—————————————————————————

#pragma argsused
int main(int argc, char* argv[]){
    using std::string;
    using std::cout;
    using std::endl;

    namespace po = boost::program_options;
    po::options_description desc("My Commnad Line");
    desc.add_options()
        ("help,h", "help message")
        ("author,a", "Author")
        ("string,s", po::value<string>(),"run as client and connect to the specified IP")
        ("int,i", po::value<int>(), "the number of concurrent connections")
    ;

    po::variables_map vm;
    try{
        po::store( po::command_line_parser(argc, argv).options(desc).allow_unregistered().run(), vm);
        po::notify(vm);

        if (vm.count("author")) {
          cout << "Author: Chui-Wen Chiu" << endl;
          cout << "Blog: http://chuiwenchiu.spaces.live.com" << endl;
        }

        // -h or –help
        if (vm.count("help")) {
          cout << desc << endl;
          return 1;
        }

        // -s "123 456 789" or –string="123 456 789"
        if(vm.count("string")) {
          string sip = vm["string"].as<string>();
          cout << "string: " << sip << endl;
          // connect to server…
        }

        // -i 1 or –int=1
        if(vm.count("int")) {
          int t = vm["int"].as<int>();
          cout << "int: " << t << endl;
          // connect to server…
        }
    }catch(boost::program_options::invalid_command_line_syntax&){
        cout << "參數語法錯誤" << endl;
        cout << desc << endl;
    }catch(boost::bad_lexical_cast&){
        cout << "參數型別錯誤" << endl;
        cout << desc << endl;
    }catch(…){
        cout << "ERROR" << endl;
    }

    return 0;
}
//—————————————————————————

雖然 boost::program_option 有提供便利的參數型別轉換,不過,我覺得設計的並不好用,所以,我個人還是覺得全部設定為字串參數,然後自己透過 boost::lexical_cast 轉換型別(program_option 內部自動完成此步驟),可以比較容易掌握 boost::bad_lexical_cast Exception 的發生。

另外,網路上有人提到 getopt 也常被用來解析命令列參數,不過沒有時間測試,未來有需要再來看看~

Read Full Post »

Box.net 是一個相當不錯的網路硬碟服務,可允許你上傳圖片且提供瀏覽功能,但是瀏覽只在上方提供上下頁面切換,對於看漫畫時常需要翻頁來說相當不便,於是,我利用 Greasemonkey 這個 firefox 擴充套件寫了一下簡單的 script (box.user.js)來添加上下頁面切換的快速鍵,如下:

// ==UserScript==
// @name            Box.net add shortcut
// @namespace        http://chuiwenchiu.spaces.live.com/
// @author            Chui-Wen Chiu <cwchiu@hotmail.com>
// @include        http://www.box.net/shared/*
// @description        Alert Message
// ==/UserScript==
document.body.setAttribute(‘onkeydown’, ‘if (event.keyCode == 80) {box_gallery.slideshow("prev");document.getElementById("next_photo").scrollIntoView()}else if (event.keyCode == 78) { box_gallery.slideshow("next");document.getElementById("next_photo").scrollIntoView() }’ );

如果你也有同樣的需要也安裝了Greasemonkey ,將上述script copy&paste 到記事本,並存成 box.user.js,然後拖曳到 firefox 即可安裝,馬上享受利用 p 和 n 快速看漫畫的樂趣 ^O^

Read Full Post »

.NET 的字串 Split 和 Join

PHP 有兩個相當好用的字串函數:explode 和 implode,主要用於 Array 和 String 之間的轉換,如下:

$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

$array = array(‘lastname’, ’email’, ‘phone’);
$comma_separated = implode(",", $array);
echo $comma_separated; // lastname,email,phone

今天撰寫 .NET 程式剛好需要這兩個函數,還好 .NET 已經有內建,不過功能沒有 PHP 的這麼強大,他限定只能接受 String[],用法如下:

String pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
String[] pieces = pizza.Split(new char[]{’ ‘});
Debug.WriteLine(pieces[0]);// piece1
Debug.WriteLine(pieces[1]);// piece2

String[] array = new String[]{"lastname", "email", "phone"};
String comma_separated = String.Join(",", array);
Debug.WriteLine(comma_separated); // lastname,email,phone

Read Full Post »

今天用 DirectSound 測試程式出現如下訊息

"C:WINDOWSassemblyGACMicrosoft.DirectX1.0.2902.0__31bf3856ad364e35Microsoft.DirectX.dll’ 正在 OS 載入器鎖定內嘗試 Managed 執行。請勿嘗試在 DllMain 或影像初始設定函式內部執行 Managed 程式碼,因為這樣做可能導致應用程式停止回應。"

程式沒什麼特別,就是一行 DevicesCollection myDevices = new DevicesCollection(); 就掛了,網路上找到 [1] 提供將 MDA 關閉來處理,也就是關記 "Debug | Exceptions | Managed Debugging Assistants | LoaderLock"

20080223

[2] 對這個問題有更多的討論,據該文所述,問題發生的原因是 .NET 2.0 使用了 MDX 1.1 Assemblies 的關係,所以,最終就是等微軟解決,否則用上述的解法或是退回 VS2003 開發….

參考資料
[1] huwk, "Visual Studio 2005 遇到的錯訊與排除方法"
[2] http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=114707&SiteID=1
[3] The ZBuffer, "Why do I get a ‘LoaderLock’ Error when debugging my Managed DirectX application"

Read Full Post »

昨天寫了 C# 版本的批次壓縮程式,今天嘗試用 Ruby 改寫,順便練習 Ruby 語法,完整程式如下:

#
# 批次壓縮子目錄
#
# @author    Chui-Wen Chiu
# —————————-
path = "d:\CVS\"
winrar = "c:\program files\winrar\winrar.exe"
d = Dir.new( path )
d.each  {|name|

    fullname = path + name
    if File.directory?(fullname ) == false || name==’.’ || name==’..’
        next
    end   

    # 壓縮目錄   
    system winrar, "a", "#{fullname}.rar", fullname
    next    
}

由於程式很簡單就不解釋,不過我原先使用 exec 取代 system 時,只會執行一次外部程式就終止,不知是何原因?

Read Full Post »

C# + WinRAR 批次壓縮目錄

今天想要將 CVS 目錄下的各專案壓縮成獨立壓縮檔,一時找不到工具,

只好自己寫了一個簡單的程式,將 d:\CSV 下的子目錄個別壓縮成" 目錄名稱.rar"

主要利用下面的 winrar 命令列指令

winrar a RAR檔名 目錄

C# 的用途只是迭代出目錄下的子目錄,並呼叫 Winrar 完成工作,下面是完整程式

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.IO;

namespace BatchRar {
    class Program {
        static void Main(string[] args) {
            String path = "d:\cvs\";
            DirectoryInfo di = new DirectoryInfo( path);
            foreach (DirectoryInfo d in di.GetDirectories()) {
                String cmd = String.Format(" a "{1}{2}.rar" "{0}"", d.FullName, path, d.Name);
                Process proc = new Process();
                proc.StartInfo = new ProcessStartInfo("winrar.exe", cmd);
                proc.Start();
                proc.WaitForExit();

            }        

       }
    }
}

Read Full Post »

« Newer Posts - Older Posts »