我目前正在尝试 DerelictSDL2(绑定(bind)到 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 函数接口(interface))?

dmd : 2.065

全局开发中心:4.9.1

编辑:

结果发现问题完全不同。 IMG_LoadTexture 使用指向数据的指针作为第二个参数,但 name.ptr 似乎只适用于 dmd。但是,如果我尝试使用这样的硬编码参数:
IMG_LoadTexture(renderer, "../test/res/image.jpg")
它适用于 dmd 和 gdc。

最佳答案

不能保证 D 字符串将以 0 结尾。它只是偶然发生在 dmd 上。正确的方法是使用 std.string 模块中的 toStringz() 函数。

附言请注意,字符串文字 是以 0 结尾的,这就是硬编码参数起作用的原因。

关于dmd 和 gdc 编译代码的方式不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24997268/

10-10 12:30