D言語でナニかやる日記。BLOGじゃあないことは確かだ。
紫の鏡紫の鏡紫の鏡紫の鏡紫の鏡紫の鏡紫の鏡
D言語
D言語関係のアンテナ
|
D言語 - MOEPHP.ORG
|
プログラミング言語 D
その他
WEB-YATAI |
The Framework. |
aDiaryアンテナ
|
K's factory mini
|
さるるメモ
August 13, 2004
■[wxD][wxD仕様] 
手作業ですることメモ:
int* の対応
int* x 等となっている部分を全て変更する。数値の取得の場合は int* か wxCoord* の2種類存在する。wxCoord は int の alias である。具体的な例を示すと、
/* wxBitmap.d line 158 */
public void GetDeviceOrigin(int* _x, int* _y) {
wxDC_GetDeviceOrigin(_instance, _x, _y);
}
を
public void GetDeviceOrigin(out int _x, out int _y) {
wxDC_GetDeviceOrigin(_instance, &_x, &_y);
}
のように変更する。自動で変換したいところだが、inout にしなければならないところや、int の配列を渡す場合があるために不可能。inout にしなければならない例を示すと、
/* wxWindow.d line 506 */
public void ScreenToClient(int* x, int* y) {
wxWindow_ScreenToClient(_instance, x, y);
}
を
public void ScreenToClient(inout int x, inout int y) {
wxWindow_ScreenToClient(_instance, &x, &y);
}
のように変更する。ぱっと見気づかないかもしれないので注意。wxc のラップ関数のソースを見ても確認できないので、wxWidgets のソースかマニュアルを確認すること。マニュアルには
Stores the screen x coordinate and receives the client x coordinate.
と書いてある。ソースには、ほぼ確実に if (x) 変数 = *x というコードがあり、それをやっていれば inout にする必要がある。
int の配列を渡す場合の例は、
/* wxDC.d line 115 */
public void DrawLines(int n, int* x, int* y, int xoffset, int yoffset) {
wxDC_DrawLines(_instance, x.length, x, y, xoffset, yoffset);
}
を、デフォルト引数とあわせて
public void DrawLines(int x, int y, int xoffset = 0, int yoffset = 0) {
assert(x.length == y.length);
wxDC_DrawLines(_instance, x.length, cast(void*)x, cast(void*)y, xoffset, yoffset);
}
と変更する。(配列の長さチェックの部分は assert にするか例外にするか迷っているので、意見募集)cast(void*) は必要ないので、面倒な場合は付加しなくて良い。
void* となっているところでも、int* の可能性があるので注意すること。
デフォルト引数への対応
wxWidgets のマニュアルから*1、デフォルト引数の情報を引張ってくる。
特に迷うところは無いだろうが、一つだけ厄介なところがあって、int* を out int に変更したせいで、 int* x = null というコードの場合、out int x = null とは書けなくなってしまったということである。その場合は、
/* マニュアルにこうあった場合 */ Example::GetPosition(int id, int* x = null, int* y = null, wxWindow parent = null)
を
public void GetPosition(int id) {
Example_GetPosition(_instance, id, null, null, null);
}
public void GetPosition(int id, out int x) {
Example_GetPosition(_instance, id, &x, null, null);
}
public void GetPosition(int id, out int x, out int y, wxWindow parent = null) {
Example_GetPosition(_instance, id, &x, &y, parent);
}
と関数を分けて書く。wxWindow parent = null は通るのでそのまま。
ほかに、wxc では必要ないであろうデフォルト引数は、最初から省いている場合もある。(例えば wxWindow::Show は Show(bool flag = true) であるが、wxc では Show(void) である)そういう場合はそのままで良い。
同じ関数名で引数が違うだけで複数ある場合
wxWidgets にはそういう関数が非常に多い。wxc ではそういうものは名前を多少変えてラッピングしてある。Create1, Create2, GetByName, GetById など。そういう場合は、出来る限りオリジナルの名前一つに統一すること。
GetByName(char name) → Get(char name) GetById(int id) → Get(int id)
static な関数
マニュアルで static と表記してある関数は public static void Function() と変更する。
マニュアルは信用しない
マニュアルはたまに間違っている(戻り値が無いはずなのに bool と書いてあったり)ので、気づいたらソースを確認すること。
void* は疑う
void* は、クラスを渡す部分かもしれないし、値を受け取るために int* になるところかもしれない。void* となっているのは wxc の ewxw_glue.h から自動化用のリストを生成したためで、3000関数以上あるそのリストは完全には void* を書き換えきれていないためである。
マニュアルにはあって wxD(wxc) には無い関数
例えば、wxDC::DrawSpline は wxc に無くて、有用(そう)でありそうなので、wxc のソースに追加した。ただし、あまり使わないであろう関数は入れる必要は無い。
これだけの作業を300ファイルやれば完成だ、ヨヾ( ゜∀゜)ノ゛
ちなみに、この作業を行ったのはまだ3ファイル on_ というわけで、手伝って欲しいのはこの作業であります。
*1:Google でクラス名をWeb全体から検索すればほぼそのクラスのマニュアルがヒットする
August 09, 2004
■[wxD] 
メモ:
- wxc関連
- wxPoint と wxSize の実装が無い
- あとで('A`) (いらないかも)
- delete してる部分で null チェックしてないので怖い
- 全部書き換えた
- wxPoint と wxSize の実装が無い
- wxD関連
- void* wxColour_CreateFromStock(int id) が _Createナントカ と引数情報同じでコンストラクタが衝突した
- static wxColour CreateFromStock(int id) とした
- _Delete というメンバ関数があって困る
- てきとうに回避
きちんと指定のクラスのデストラクタ呼ばないと不正な処理で死ぬ。しかし、デストラクタ呼ぶラッパが無い奴が多すぎるがんばるがんばらない
- void* wxColour_CreateFromStock(int id) が _Createナントカ と引数情報同じでコンストラクタが衝突した
てきとうすぎ。ところで、デフォルト引数なんて使っていいのかな。gdc ってバージョンいくつの dmd がベースなんだ…。
void 初期化() {
wxMenuBar menubar = new wxMenuBar;
...
frame.SetMenuBar(menubar);
}
とかやって、menubarが生きてけるスコープを抜けると、デストラクタで C++ の方の wxMenuBar のインスタンスを delete しちゃうことにいまさら気づいた。いちいちクラスのメンバ変数にするのは面倒だよねえ。wxWidgetsの動作についてすごい勘違いしてそうなのでソース読もう…。
wxWidgets は、マクロでごにょごにょしすぎで、Dで再現しづらいのが辛い。
追記:
on_
wxc になぜ delete のラッパが無いのか納得。wxWidgets が最期まで面倒見てくれるのか…。
if ( m_frameMenuBar )
{
delete m_frameMenuBar;
m_frameMenuBar = (wxMenuBar *) NULL;
}
しっかり delete してくれてる。なるほどなるほど。
Ozy
gdcは0.86だったと思います。dmdを新しいバージョンにしても、問題アリアリのようです。gdcについては今後のヴァージョンアップに期待して、ガシガシ作っちゃった方が良いかも!
Germinate
はじめまして、http://php.s3.to/さんの過去ログからたどってきました。
ここに書いて良いのか迷いましたが、他に連絡手段が見つかりませんでしたのでここに書き込ませて頂きますことをお許しください。
私は今、2chのread.cgiにリクエストを要求して各スレッドの>>1の書き込みを取得する、というものを作っていますが、なかなかうまくいきません。
下記のファイルを参考にしようと思ったのですが、リファラで弾かれてしまい、ダウンロードできない状態にあります。
お手数ですが、再度アップロードしていただけないでしょうか?
本当に図々しくてすみません。。
どうぞよろしくお願いします。
http://ime.nu/http://f3.aaacafe.ne.jp/~null/cache/1068092004.zip
関連記事 : http://php.s3.to/index155.html [2403 のレス13]
Germinate
あと、できれば下記のソースも見せて頂きたいのですが、、
どうぞよろしくお願いします。
http://f3.aaacafe.ne.jp/~null/gets.php
k_ahiru
http://user.script.nu/~ahiru/gets.zip はいどうぞ。ご自由にお使いくださいな。
k_ahiru
あと、1068092004.zip の中身は gets.zip です
August 07, 2004
■[wxD] 
wxc が致命的にやばいということで、そこをどうにかする。まずは wxWindow やら wxFrame やらの重要なクラスの delete 関数の実装(なぜこれが無いんだ…)
ステータスバーやらなにやらは、C++のインスタンスをいっさい delete しないのなら動く状況になった。
wxMenuBar menu_bar = new wxMenuBar(0);
wxMenu menu = new wxMenu("",0);
menu.Append(100, "&Exit", r"終了します", false);
menu_bar.Append(menu, "&File");
frame.SetMenuBar(menu_bar);
まだ使いづらい。あとでDで使いやすいように改良する。


やってみたいー。