1

次のDコードを実行すると、奇妙なSDLエラーが発生します。

import std.string;
import derelict.sdl2.sdl;

pragma(lib, "DerelictUtil");
pragma(lib, "DerelictSDL2");

int main(){
        DerelictSDL2.load();
        if(SDL_Init(SDL_INIT_VIDEO) < 0){
        throw new Exception(format("Error initalizing SDL: %s", SDL_GetError()));
        } 
        return 0;
}

これはSDL_GetError()から以下を返します

object.Exception@min.d(12): Error initalizing SDL: 7F2802391940
----------------
./min(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x1c) [0x434284]
./min(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x433bfe]
./min(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x3b) [0x4342cb]
./min(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x2a) [0x433bfe]
./min(main+0xd1) [0x433b89]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed) [0x7f28023b776d]
----------------

Mercurialから構築された最新バージョンのSDL2に対してこれを実行しています。dコードはdmdv2.060でコンパイルされます。番号7F2802391940はガベージのようですが、事前にSDL_ClearErrorを呼び出すと、同様の16進エラーメッセージが生成されます。

4

1 に答える 1

2

7F2802391940おそらくエラーメッセージのアドレスです(nullで終了する文字列として保存されます)。Dのformat関数はそれらを理解しない(つまり、他のポインターと同じように扱う)ので、text(SDL_GetError())(インポートすることを忘れないでくださいstd.conv)を使用して明示的にD文字列に変換します。

于 2012-08-15T19:54:00.200 に答える