4

現在、 DerelictSDL2 (D の SDL2 ライブラリへのバインディング) を試しており、JPG 画像を正常に読み込んでウィンドウに表示するコードを作成しました。つまり、dmd でコンパイルした場合です。gdc (およびコード変更なし) を試してみると、コンパイルはできますが、実行時にイメージが読み込まれません。

私は正しいことをしたと信じています:

SDL_Init(SDL_INIT_VIDEO)

それから

IMG_Init(IMG_INIT_JPG)

そしてその後のどこか

this.data = IMG_LoadTexture(Window.renderer, name.ptr)

ここWindow.rendererで (明らかに)SDL_Renderer*name.ptrは、char*ロードするイメージの名前を指しています。しかし、gdc でコンパイルするとIMG_LoadIMG_LoadTextureどちらも を返しnullますが、dmd では、新しく作成されたテクスチャへのポインタを返します...

私は何か他のことを忘れましたか(結局のところ、dmdを使用すると、なくても機能しましたIMG_Init)?Derelict は dmd でしか動作しませんか (C 関数とのみインターフェイスしている場合でも)?

dmd: 2.065

gdc: 4.9.1

編集 :

問題がまったく異なることがわかりました。IMG_LoadTexture2 番目の引数にデータへのポインターを使用しますがname.ptr、dmd でのみ機能するようです。ただし、次のようなハードコードされた引数を試してみると:

IMG_LoadTexture(renderer, "../test/res/image.jpg")

dmd と gdc の両方で動作します。

4

1 に答える 1

6

D 文字列が 0 で終了するという保証はありません。それはdmdで偶然に起こります。正しい方法は、std.string モジュールの toStringz() 関数を使用することです。

ps 文字列リテラルは0 で終わることに注意してください。そのため、ハードコードされた引数が機能します。

于 2014-07-28T15:29:28.450 に答える