C / C++」カテゴリーアーカイブ

CUDAコンパイラはマクロに弱い。

覚え書き。(突っ込み入ったので、語弊がないように一部書き直し。

 

弱いんだかなんだか、評価は出来ませんが、
とりあえず、CUDA コンパイラ(nvcc) はマクロ展開に際して非常によろしくない挙動を取ります。

 

CUDAコンパイラは糞。マクロを正常に展開しない。 – 簡潔で覚えやすいタイトルを3秒で思いつく程度の能力
詳細については上記リンクの記事を参照して頂ければとおもいます。

とりあえず、

HWND hwnd = CreateWindow(lpClassName,  // CLASS NAME

                          lpWindowName, //WINDOWNAME

というような、引数が複数行にわたって記述される場合で、コメントを1行コメントなんぞ付けたりすると、
マクロが良い感じで展開してくれないよ-。ということ。

 

C コンパイラというから、きっと、全部コメントは /* */ だろ!ということで、
NVIDIAの中の人がかなり手を抜いているような気がしてなりません。

 
/* ~ */ で括れば、とりあえず、コメントの範囲はわかるし! みたいな。うん。
なんかそんなこと考えたら余程ステキな仕様な気がしてきた。うん。

ま・・まぁ、とりあえず、
ユーザはコメントを /* */ で書いて、
NVIDIAの中の人にはマクロ展開部分をきっちり作ってもらって。と。

 

でも、C99 って1行コメント使えるよなぁ・・。
Cでも使える時代が到来しているのに・・。むぅ。

MFC と WIN_VER

うーん。MFC には相当の裏がありそうだなぁ・・。 ・・。ども Mimura です。

STEP_M のフォントサイズ問題で悩んでいたのですが、
ソースコードは一緒なのに、なんでコンパイルした結果が違うのさ。と。

MFCは奥が深いです。Microsoft のパンドラの箱。のような気もしないでもないですが、
どうなんでしょうか。
少なくとも、SDKプログラミングばっかりやってた自分には、ちょっと謎です。

Vista の動作結果ではほぼ変わらないのですが、
XPで動かすとすばらしく変わります。なんで。と思うほど。

(同じソースコードですが、頭に WIN_VER 指定をかけてあります。)

 

現在公開中のもの (WIN_VER = 0x600 (Windows Vista))

image

XP 宣言したもの(WIN_VER = 0x501 (Windows XP or 2003))

image

なんでこー。ツールチップのサイズがここまで変わってくるのさー!!

・・そんなわけで、最初の修正の時にはツールチップのフォント取得部分がおかしいんだろう。
と思って、フォント設定をシステムフォントから取得するようにしましたが、

まさか、本当の答えは WIN_VER だったとは。
・・。挙動が変わられても困ります。本当に。

MFC怖いなぁ。と思った今日この頃です。

(Microsoft さん。教えてもらえるとありがたいです。このあたりについて・・。
あ。あれですか。 .NET つかえ! っていうことですか。多分そうですか。)

GetMessage の書き方について。

GetMessage について何かおもしろい使い方がないかな・・。と調べてみましたら、
おもしろい記述が見つかりました。

GetMessage はメッセージループの部分に書かれており、大抵は

while (GetMessage(&msg, NULL, 0, 0)){
         TranslateMessage(&msg);
         DispatchMessage(&msg);
}

という風に書かれています。

私がいつも見に行く解説サイトを見直してみてもそうでしたし、
過去に書いたソースコードもそうなっていました。

 

ですが、 MSDN の GetMessage 関数の説明を見てみますと、
MSDN:GetMessage 関数

エラーが発生した場合、-1 が返ります。

たとえば、hWnd パラメータで無効なウィンドウハンドルを指定した場合や、
lpMsg で無効なポインタを指定した場合は、エラーが発生します。

拡張エラー情報を取得するには、 関数を使います。

ということで。
そして、英語版MSDNではこんな感じのサンプルが上がっていました。

BOOL bRet; 
while((bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) { 
         if (bRet == -1) {
              // handle the error and possibly exit
        }
        else
       {
             TranslateMessage(&msg);
             DispatchMessage(&msg);
       }
}

うーむ・・。
GetMessage の戻り値は BOOL のはずでは・・? と。思ってしまったり。

でも、BOOL って結局 int になってますから、 型としてはあっているんでしょうけど。

 

にしても・・。 BOOL だったら、 == 0 or != 0 でせう。と。
まぁー・・。そんな感じで。

適当な覚え書き。 HSP で PARAFORMAT2

なんでこうC++ で書かなかったのだと思うところではありますが、

しょうがないのでSDKのRichedit.h に書いてあったのをHSP風に解釈

 

———————————————————- (Richedit.h より抜粋。 持ってきて良いのかは疑問だけど。)

typedef struct _paraformat2
{
    UINT    cbSize;
    DWORD    dwMask;
    WORD    wNumbering;
    WORD    wReserved;
    LONG    dxStartIndent;
    LONG    dxRightIndent;
    LONG    dxOffset;
    WORD    wAlignment;
    SHORT    cTabCount;
    LONG    rgxTabs[MAX_TAB_STOPS];
     LONG    dySpaceBefore;            // Vertical spacing before para           
    LONG    dySpaceAfter;            // Vertical spacing after para           
    LONG    dyLineSpacing;            // Line spacing depending on Rule       
    SHORT    sStyle;                    // Style handle                           
    BYTE    bLineSpacingRule;        // Rule for line spacing (see tom.doc)   
    BYTE    bOutlineLevel;            // Outline Level                       
    WORD    wShadingWeight;            // Shading in hundredths of a per cent   
    WORD    wShadingStyle;            // Byte 0: style, nib 2: cfpat, 3: cbpat
    WORD    wNumberingStart;        // Starting value for numbering               
    WORD    wNumberingStyle;        // Alignment, Roman/Arabic, (), ), ., etc.
    WORD    wNumberingTab;            // Space bet 1st indent and 1st-line text
    WORD    wBorderSpace;            // Border-text spaces (nbl/bdr in pts)   
    WORD    wBorderWidth;            // Pen widths (nbl/bdr in half twips)   
    WORD    wBorders;                // Border styles (nibble/border)       
} PARAFORMAT2;

———————————————————-

参照:MSDN – PARAFORMAT2 Structure()

http://msdn.microsoft.com/en-us/library/bb787942(VS.85).aspx

 

宣言 HSP変数 メンバ名 オフセット サイズ
UNIT cbSize pfm2(0) cbSize 0 4
DWORD dwMask pfm2(1) dwMask 4 4
WORD wNumbering
WORD wReserved
上位ワード
下位ワード

pfm2(2)

wNumbering
wReserved
8
10
2
2
LONG    dxStartIndent pfm2(3) dxStartIndent 12 4
LONG    dxRightIndent pfm2(4) dxRightIndent 16 4
LONG    dxOffset pfm2(5) dxOffset 20 4
WORD wAlignment
SHORT cTabCount
上位ワード
下位ワード

pfm2(6)

wAlignment
cTabCount
24
26
2
2
LONG    rgxTabs[MAX_TAB_STOPS] pfm2(7) ~ pfm2(38) rgxTabs 28 128
LONG    dySpaceBefore pfm2(39) dySpaceBefore 156 4
LONG    dySpaceAfter pfm2(40) dySpaceAfter 160 4
LONG    dyLineSpacing pfm2(41) dyLineSpacing 164 4
SHORT    sStyle
BYTE  bLineSpacingRule
BYTE  bOutlineLevel
上位ワード
上位バイト
下位バイト

下位ワード

pfm2(42)

sStyle
bLineSpacingRule
bOutlineLevel
168
170
171
2
1
1
WORD    wShadingWeight
WORD    wShadingStyle
上位ワード
下位ワード

pfm2(43)

wShadingWeight
wShadingStyle
172
174
2
2
WORD    wNumberingStart
WORD    wNumberingStyle
上位ワード
下位ワード

pfm2(44)

wNumberingStart
wNumberingStyle
176
178
2
2
WORD    wNumberingTab
WORD    wBorderSpace
上位ワード
下位ワード

pfm2(45)

wNumberingTab
wBorderSpace
180
182
2
2
WORD    wBorderWidth
WORD    wBorders
上位ワード
下位ワード

pfm2(46)

wBorderWidth
wBorders
184
186
2
2

 

適当に書いてみましたが、こんな感じかな・・?

あっていればいいけれど。

 

んー・・。それより前に疑問なのが、

PARAFORMAT2 構造体をHSPで使う人って居るのかなぁ・・。なんて。

もしかして自分だけかも?なんて思いますが、

一応需要があったらいいなー。と

 

HSPで書く人への補足

cbSize は 188 バイト。

それと、ワード・バイトの書き込みは、

wpoke とか poke とか使うと楽かも。

逆は wpeek と peek

 

そんなわけで、一応書いてみると、

 

dim pfm2,47

pfm2(0)=188

 

ってなかんじで。

 

そんなわけで、

・間違いを発見した人

-> すぐに教えてください。

・これを見て書く人

-> 少しでも生かせれば幸いです。

Windows Live Messenger への曲通知。

ふと。

フリーソフトの H2k6 を使っている友人から

「曲通知したい」と。

作ってみました。

 

なかなか簡単なシステムで。わかりやすかったです。

最初はタイトルバーから取得しようかとも思っていたのですが、

見てみれば、再生時にコマンドラインを指定してプログラムを実行するオプションがあるじゃないですか。

 

ということで、これを使って・・。

http://mimumimu.net/software/#wlmis

Windows Live Messenger Music Info Sender.

つくってみました。

 

2010/02/13 
ここのページに飛んでくる人が多いのに、ダウンロードリンクを的確に指していなかったので、

上記リンクを現在の物に変更しました。

 

1.ダウンロードして、H2k6 と同じフォルダに send.exe を置く。

2.オプション -> 設定 -> トリガーに以下のように設定

演奏開始時 : send.exe %tagTitle%\0%tagArtist%

演奏停止時 : send.exe

 

これで再生時に通知されて表示され、

止めたときに消えます。

 

そして・・。

いちおーこのプログラム、

取っても単純で、

send.exe に続いて (曲名)\0(アーティスト)

を送りつけるだけで動きます。

新しいソフトウェアのサポートや

既存のソフトウェアに曲通知機能を付けたり。引数指定で起動できればどんなプログラムでも利用可能です。

 

—————————-

今回使用させていただきました 「H2k6」のダウンロード先

http://hogehoge2006.genin.jp/

 

————————————————————

P.S.

プログラマーの皆さんにいろいろと。

まず引数についてですが、チェックは何もやってません。(うわぁ。

あと、(曲名)と(アーティスト)のあいだの\0 ですが、

これは 0x0000 の \0 ではありません。

0x5c,0x30 の \0 です。

もっと言えば、 \0 ではなくて \\0 になりますね。

単刀直入に言えばただの文字の「\0」です。NULLとかじゃなく。

 

そして、もっと恥ずかしいことを言えば、

この通知のプログラムを組んだことのある方はもう説明書きを見たときに、

「こいつ・・・何手抜きしているんだ」と内心思っていたと思います。

そうなんです。

内部的に曲名とアーティスト名の区切りは \\0 で行うようになってるんです。

本当は曲名とアーティスト名を指定するときに、もっと優しく指定できるようにすべきなのかも知れませんが、

実際の所、このように引数を指定すると、実に内部構造が楽なんです。

そのまま与えて、あとは適当に設定すればいいんですから。

んー・・。手抜き過ぎるかな・・。