我目前正在尝试 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_Load
和 IMG_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/