我目前正在尝试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_Load
和IMG_LoadTexture
都会返回null
,而使用dmd时,它们会返回指向新创建的纹理的指针...
我是否忘了别的东西(毕竟,使用dmd它甚至没有IMG_Init
)? Derelict是否仅适用于dmd(即使它只与C函数接口)?
dmd:2.065
gdc:4.9.1
编辑:
原来问题完全不同了。 IMG_LoadTexture
获取第二个参数的数据指针,但name.ptr
似乎只适用于dmd。但是,如果我尝试使用这样的硬编码参数:
IMG_LoadTexture(renderer, "../test/res/image.jpg")
它适用于dmd和gdc。
答案 0 :(得分:6)
无法保证D字符串将以0结尾。它只是偶然发生在dmd。正确的方法是使用std.string模块中的toStringz()函数。
P.S。请注意字符串文字 0终止,这就是硬编码参数有效的原因。