dsdl-2dmdgdcderelict3

dmd and gdc compiling code differently?


I am currently trying out DerelictSDL2 (a binding to the SDL2 library for D) and I've written a code that successfully loads a JPG image and displays it in a window. That is, when it's compiled with dmd. When I try with gdc (and no code modification), it does compile but it won't load the image at runtime.

I believe I did things right :

SDL_Init(SDL_INIT_VIDEO)

then

IMG_Init(IMG_INIT_JPG)

and somewhere after that

this.data = IMG_LoadTexture(Window.renderer, name.ptr)

where Window.renderer is (obviously) the SDL_Renderer* and name.ptr is a char* pointing to the name of the image to load. But when compiling with gdc, IMG_Load and IMG_LoadTexture both return null, while with dmd they return a pointer to the newly created texture...

Did I forget something else (after all, with dmd it worked even without IMG_Init) ? Does Derelict only works with dmd (even if it's only interfacing to C functions) ?

dmd : 2.065

gdc : 4.9.1

EDIT :

Turns out the problem is completely different. IMG_LoadTexture takes a pointer to data for its second argument but name.ptr seems to only work with dmd. However If I try with a hard-coded argument like this :

IMG_LoadTexture(renderer, "../test/res/image.jpg")

it works with both dmd and gdc.


Solution

  • there is no guarantee that D string will be 0-terminated. it just happens by chance with dmd. the correct way is to use toStringz() function from std.string module.

    p.s. please note that string literals are 0-terminated, that's why hardcoded arguments works.