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*andname.ptrchar*指向要加载的图像的名称。但是当使用 gdc 编译时,IMG_Load两者IMG_LoadTexture都返回null,而使用 dmd 他们返回一个指向新创建的纹理的指针......

我是否忘记了其他事情(毕竟,即使没有 dmd 它也可以工作IMG_Init)?Derelict 是否仅适用于 dmd(即使它仅与 C 函数接口)?

dmd:2.065

全球数据中心:4.9.1

编辑 :

原来问题完全不同。IMG_LoadTexture为其第二个参数获取指向数据的指针,但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 回答