投稿

6月, 2010の投稿を表示しています

cpplint.pyのプチハック

最近、よくつかうツールにGoogleからオープンソースで公開されているcpplint.py。 関心に思うのはHeaderファイルのガードでラベルがほぼ正確に提案されること。 なぜこんなことができるかとソースを覗いたら、予想通りリポジトリのフォルダーを基準にしていた。 ただ.gitも対応しているのか少し気になったが、それも探しているようであった。 考えることは皆同じであるw .svnを優先に探し.gitや.hgを探している。

QStringとUtf-8

MFCからQtへの移植で注意しなければならないのは、 CStringをQStringへダイレクトに置換してはいけないこと。 実は、ローケールを設定しても、 QStringはもともとある日本語をUTF16に変換した際、 クセがある。 1 パス指定である「\」これを、 「/」には変えず、日本語に存在しない似た「¥」に変換してしまう。 2 utf-8のファイルはQByteArrayへ読み込むこと、 これもQStringへ読み込む際、意図しない日本語コードへ、 変換されてしまう。 その後、toLocal8Bit()で戻しても、 ムダである。 FormatやTRACE()などでも、そのままでは動作しない。 前者はsprintfではなくargへ。 後者はいちいちtoLocal8Bit().constData()などを、 つけなければならない。

クロスプラットフォームの鬼門 wchar_t

Unicode wchar_tの説明を読むと、これさえあれば各OSで動くと希望的観測を、 つい、してしまうのが、プログラマーの悲しさです。 むろん、うまくいくわけではなく、 wchar_tは Unix系では4バイト Windows系では2バイト です。 これがクロスプラットフォームで泣かせます。 Qtなどはこれにハマらないよう設計を工夫しているのが使っているとわかります。 したがって、WindowsのプログラマーはLPTSTRとかTCHARを使っていれば大丈夫というのは迷信に過ぎないのです。 参考:   wchar_t: Unsafe at any size http://en.wikipedia.org/wiki/Wide_character

QtとMFC Serialize互換について

MFCからQtを移植する再、問題になるのはファイル関係です。 MFCとQt、Serializeフィイルの互換性を維持するには、ちょとした工夫が必要です。 *Little Endianにします。 e.g.  ar.setByteOrder(QDataStream::LittleEndian); *CStringとQString。 MFC CStringは長さをかなり持てる機能があります。 その部分を読み込んでQStringへ入れるにはMFCのソースを参考にすると良いでしょう。 通常はQStringの最大値まで使うことはないのでコンバーターを作成すれば互換性を維持できます。 *COleDateTime(CTime)とQDateTime これもコンバーターを作成することにより解決可能です。 上記などを一気に移植するにはQDataStreamを継承したクラスがあると便利です。 CArchiveクラスのようにIsStore()などを作成することにより、もとのソースに対して少ない変更で移行可能です。 この継承したクラスにはEndianの自動変更、QString、QByteArrayやQStringListなどのインターフェースを作成すると使いかっても良くなります。

QtとAndroid

QtアプリをAndroid上で実行するには、 Qt For Android を今のところ活用します。 ただしQtGUIを組み込むと10MBほどになり、 3MBほどが現在のAndroidアプリの平均的な限度だとすると、 大きすぎるようです。 参考  Qt on Android ep 2 ボクの場合はGUIをAndroid GUI javaで書き、アニメーションエンジンと言語解析部分をQt(Nativeなので場所によっては10倍以上高速)にします。 したがって、QtCoreさえあればよく、必要に応じてQNetwork,QXml等を組み込む予定で、この場合は参考のリンク先内に書かれているように3.5MBほどになるそうです。 QtはNDKを通して使いますが、描画の速度によっては、QADKを使うことになるでしょう。ただし、QADKを使うとNDKに対して変更されているため正式なアプリとは認められない可能性があるため見極めが必要です。

MFCとQtとGoogle Test

MFCアプリをQtへ移植する際、Google Testを活用しながらだと、 足場を固めつつ前へすすめるので便利です。 ボクは以下のように活用しています。   DLLに対しては外部console MFCアプリからQtを利用しつつテストする。 結果はconsoleへ出力。 EXEに対しては内部にUnit testを組み込んで以下のようにWinApp::InitInstaince()内からコールし、テスト。 結果はOsanpo project内にGTestOutput.xmlが出力される。 時にはGuitarを利用する。       {// Google Test 10-06-02         int argc=2;         char *comm="Mfc2Qt.exe";         char *comm1="--gtest_output=xml:GTestOutput.xml";         char *argv[3];         argv[0]=comm;         argv[1]=comm1;         argv[2]=0;         testing::InitGoogleTest(&argc, argv);          int nRetCode=RUN_ALL_TESTS();         if( nRetCode ){             return false;         }     }