Top  > 雑記帳  > キーワード別  > C++

C++に関する雑記

  2002年04月12日(金)   TortoiseCVS
SynEditのフォーラムに書いてあったTortoiseCVSというツールを入れてみました。SynEditの設定は次の通りです。 
 
Protocol: Internet (Unix pserver) 
Server: cvs.SynEdit.sourceforge.net 
Repository Directory: /cvsroot/synedit 
User Name: anonymous 
 
はじめ「Make New Module」をしたらimportするにはpassword付きでログオンしないとダメだよ、というメッセージが出ました。よく考えたら「Make New Module」はサーバー側に新しいModuleを作る機能なのでできなくて当然です。 
 
「CheckOut」を行なったところ、やはりpasswordが...というメッセージが出ますが、ソースを持ってくることができました。最新版のチェックには「Update」を使うようです。 
 
最新のSynEdit.pasのソースを少し見てみるとどうもwordwrapを実装しようとしているようです。 
 
【今日の日経平均】 10,962 -184

  2002年04月11日(木)   CVS
今読んでいるSynEditのソースは2001/10/25付けのバージョンですが、Source ForgeのCVSで管理されているソースは結構頻繁にアップデートされているようです。 
 
【今日の日経平均】 11,147 -71

  2002年04月09日(火)   プロパティ
今日はSynEdit.pasのPaintとクリップボード回りを読んでみました。 
時間がとられた部分は、クリップボードからのPasteのルーチンです。自分の形式のデータを受け付けるところはいいのですが、普通のCF_TEXTをもらった場合、 
 
SelText := Clipboard.AsText; 
 
一発で済ませています。これがよくわかりませんでした。よく見るとSelTextはプロパティとして定義されており、そのwriteで指定されたSetSelTextExternal()というプロシージャに内容が渡っているのでした。 
 
あとちょっと気になったのは、PasteをするPasteFromClipboard()というプロシージャの中で、GlobalLock()に対するGlobalUnlock()が見当たらないことです。気のせいでしょうか。 
 
【今日の日経平均】 11,114 -238

  2002年04月04日(木)   dynamic or virtual
昨日のSynEditの件はdynamicをvirtualに替えたらインストールできました。ただコンポーネントの中でvirtualを使っていいのかどうかははっきりしません。 
 
今日はimagestation.comが落ちているようです。 
 
【今日の日経平均】 11,379 -21

  2002年04月03日(水)   SynEdit
Dev-C++のエディタ部分にSynEditというDelphiのコンポーネントが使われていて、それがソース公開されているようなのでダウンロードしてBCB5にインストールしようとしてみました。 
 
まず最新版のSynEditのPackageをインストールしようとすると、「Dsgnintfがないよ」と言われてしまいました。探してみるとどうやらBorlandフォルダのSourceのToolsAPIの下にdsgnintf.pasというのがあったので、それをライブラリフォルダ指定に追加してやると、そこは通りました。 
 
次にSynEditPlugins.pasで「dynamic class methodなんて使えないよ」というエラーで止まりました。Object Pascalの$DEFINEのからみがよくわからないのですが、どうやらこの最新版はDelphi6用になっているようです。 
 
そこで古い1.03というSynEditをダウンロードしてきて入れてみるとこれは素直に入りました。1.03のソースを見るとそこにはSynEditPlugins.pasがありませんでした。 
 
でも沢山追加されたコンポーネントをざっと見ても、使い方が全然わかりません。 
 
【今日の日経平均】 11,400 +196

  2002年03月27日(水)   windres
wxWindowsに日本語を表示させるために、リソース・ファイルのSTRINGTABLEとLoadString() APIを使ってみました。 
 
結論からいうとリソースコンパイラwindres(version 2.11.92)では、「表」のように「\」(=0x5c)が入っていない文字列ならOKでした。 
RCファイルはCP932(=シフトJIS)で書きました。バイナリエディタで作成された.oファイルの中をのぞいてみるとちゃんとUTF-16になっていました。 
 
ちょっと気になってwindresのソースを落としてきて見てみました。どうも中ではMultiByteToWildChar()のAPIを使っているので、CP932が通るようです。また、「表」の0x5cをはじいているのは、lexのところでした。 
 
とすると入力ファイルをUTF-8にすればlexのところは通りそうです。あとはMultiByteToWildChar()を迂回して、自前のUTF-8-->UTF-16変換ルーチンを入れ込めばいいはずです。bisonとかflexのセッティングをするのが面倒なのでやりませんが。 
 
また、リソースコンパイラをbrc32.exeにしてresファイルを作り、それをwindresにかける手も考えましたが、それには一つネックがあります。wxWindowsのRCファイルは#includeで"wx/msw/wx.rc"のような「/」をパスの区切りで使っています。GoRcというリソースコンパイラの場合もinclude directoryの指定は環境変数で逃げたとしても、やはり同じ理由でひっかかりそうです。 
 
いろいろからみがあってストレートには行かないですね。 
 
【今日の日経平均】 11,323 +115

  2002年03月25日(月)   wxStringとUnicode
サンプルのminimalをUnicodeでコンパイルしようとしているのですが、うまくいきません。minimal.cppに 
 
#define UNICODE 
#define _UNICODE 
 
として、リテラルをすべて_T()で囲んでコンパイルすると、リンクのところで、 
 
undefined reference to wxString::InitWith(unsigned wchar_t const *, unsigned int, unsigned int) 
 
と言われてしまいます。string.hを見るとInitWith()は 
 
void InitWith(const wxChar *psz, size_t nPos = 0, size_t nLen = wxSTRING_MAXLEN); 
 
となっており、wxCharは _TCHARをへてwchar_tになっているはずなのですが。minimal.cppの#define UNICODEと#define _UNICODEをはずすと_T()があってもなくても正常にコンパイルできるので、感じとしてはリンクするライブラリの方がwxUSE_UNICODEを識別せずにwxCharをcharとしているように見えます。 
 
でも、ライブラリを構築する前にsetup.hを 
 
#define wxUSE_UNICODE 1 
 
と書き換えています。いろいろ考えてみたのですが、今のところまだ原因がわかりません。 
 
【今日の日経平均】 11,261 -83

  2002年03月23日(土)   Dev-C++とwxWindows
Dev-C++ 5には新しくwxWindowsのテンプレート機能がついていたので、昨日のminimalでそれを試してみました。 
 
結論から言うとDev-C++が自動的に生成するmakefileではうまくコンパイルできず、三つの点を手修正するとうまく動きました。 
 
リソース・ファイルの名前 
----------------------------------------------------- 
Dev-C++ではminimal.rcをminimal.oとしてコンパイルしようとするため、そのままではminimal.cppからできるminimal.oと衝突してしまいます。そこでminimal.rcをminimal_rc.rcとリネームしました。 
 
windres 
----------------------------------------------------- 
Dev-C++が生成するwindresの行は次のようなものです。 
 
$(WINDRES) -i "minimal_rc.rc" -I rc -o "minimal_rc.o" 
 
しかしminimal_rc.rcの中には「#include "wx/msw/wx.rc"」が含まれ、wx.rcの中には「"wx/msw/hand.cur"」という行があるのでwindresにincludeフォルダの位置を指示しなければなりません。Dev-C++の設定画面でいろいろと試してみたのですが、どうも反映してくれないようです。そこで自動作成されるmakefile.winをコピーしてmakefile.myとし、その中で 
 
$(WINDRES) -i "minimal_rc.rc" -I rc --include-dir "c:\wx2\include" -o "minimal_rc.o" 
 
と「--include-dir」オプションを追加しました。 
 
WINVER 
----------------------------------------------------- 
minimal.cppにDev-C++のテンプレートを見て 
 
#define __WXMSW__ 
#define __GNUWIN32__ 
 
を付け加えました。Dev-C++のテンプレートではをインクルードしていましたが、元のminimal.cppにはそれがなかったので、とりあえず、入れるのをやめました。するとコンパイルはできるのですが、exeを実行するとエラーで動きません。wxWindowsのmakefileを見ながら調べてみると、make時のgccのコンパイルオプションに 
 
-DWINVER=0x0400 
 
をつければいいことがわかりました。またminimal.cppにをincludeさせればWINVERのdefineをmake時につけなくても大丈夫でした。 
 
で、気になるexeのサイズはwxWindowsでstrip後のものが1006K、今回のmakefile.myで作ったものが1005Kでした。gccをかける時に-sオプションが指定されているので、stripがかかっているのでしょう。 
 
本日の自転車の走行距離は10kmでした。

  2002年03月22日(金)   wxWindows再び
Dev-C++ 5のGUIテンプレートのところにwxWindowsがあったのが気になって、結局wxWindowsを試してみることにしました。バージョンは2.2.9のものです。 
 
インストール 
--------------------------------------------------------- 
まずsetupの入ったzipファイルをダウンロードしてきてそれを展開します。ドキュメントを読むとMinGWでコンパイルするには、"/"をパスの区切りとして識別できるcpやrmが必要で、それはextra.zipというファイルをftpでダウンロードしなさい、と書いてあります。どうやらこれはremstarというサーバーにあるようなのですが、そこにつながらなかったのでミラー・サイトを探してそこからダウンロードしました。 
makefileを見るとbisonやflexは使っていないようなので、cpとrmだけをDev-C++のbinフォルダに解凍しました。 
あとはドキュメントに従ってmake -f makefile.g95を行なうと、(かなり時間がかかりましたが)いくつかのlibが作成されました。libwx.aはドキュメントでは48Mぐらいと書いてありましたが、実際には6.34Mでした。 
 
サンプルプログラム 
--------------------------------------------------------- 
minimalというメニューとAboutダイアログだけが出るサンプルプログラムをコンパイルしてみました。実行も問題ありませんでした。しかし、作成されたminimal.exeのサイズを見ると1.7Mもあります。makefileを見ても-O2で最適化されており、デバッグオプションもつけてないようです。ドキュメントには、サイズが気になるならstripコマンドで小さくしろ、と書いてあります。Dev-C++のbinフォルダにstrip.exeがあったので実行してみましたが、それでも1006Kです。 
-O4に変えてmakeしてみてもサイズは変わりませんでした。 
ちなみに同じようなプログラムをBCBで作って、リリースモードで作成してみると419Kでした。 
ドキュメントを見るとVC++だとminimalが300K以下で作れると書いてあったのですが、MinGWとの組み合わせだとこうなってしまうのでしょうか。何か見落としがあるのかもしれませんが、結局「BCBがあるのならBCBで作った方がよさそう」ということを確認しただけになってしまいました。 
あとextra.zipの中にあったrmですが、makeでcleanをかけようとするとCreateProcessのエラーということで動きませんでした。 
 
【今日の日経平均】 11,345 -181

  2002年03月20日(水)   Dev-C++ 5
Dev-C++ 5(4.9.1.0)のbetaがリリースされたのでダウンロードしてみました。 
 
Compile 
-------------------------------------------------------- 
4.01の時のプロジェクトをコンパイルしてみると、makeで「makefileのタイム・スタンプが変だよ」というwarningが出ました。いろいろ試してみましたが、結局、Compile OptionsのところにCompile Delayという設定があって、これで200 millisecondぐらいdelayさせることによりwarningは出なくなりました。 
 
Debug 
-------------------------------------------------------- 
BCBのようにソース・ウィンドウでbreakpointを設定する方式になっていました。「Integrated debugging」という機能だそうです。でも何故かデフォルトではbreakpointを設定した行の表示が黒反転になっていてソースが隠れてしまいます。Editor Propertiesで色を設定してあげないといけませんでした。debug機能そのものはNext StepとStep Overしかなく、4.01でInsight 5を使っていた時の方が使いやすかったと思います。まあまだbetaの出はじめですから、きっと変わってゆくのでしょう。 
 
その他 
-------------------------------------------------------- 
同梱のMinGWが2.95.3-6になっていました。sstreamもちゃんと入っています。 
 
【今日の日経平均】 11,526 -266


さらに過去へ >