Discussion:
extern (C) function call with const char * type will sometimes generate seg fault or core dump.
dysmondad via Digitalmars-d-learn
2014-10-16 03:18:49 UTC
Permalink
Since I've added this call, my program will sometimes but not
always either generate a core dump or a seg fault. It seems that
the issue is with the const char * parameter.

I don't have a good grasp of the difference between the way D and
C work for char * types. The call to loadTexture uses a literal
for the file name, i.e. "resources/ball.png".

// d lang bindings for C function
alias void SDL_Renderer;
alias void SDL_Texture;
extern (C) SDL_Texture * IMG_LoadTexture(SDL_Renderer * renderer,
const char * file);

// d lang call to extern (C) function
SDL_Texture* loadTexture( SDL_Renderer * ren, const char * file )
{
SDL_Texture * loadedImage = IMG_LoadTexture( ren, file );
return loadedImage;
}
Ali Çehreli via Digitalmars-d-learn
2014-10-16 06:56:19 UTC
Permalink
Since I've added this call, my program will sometimes but not always
either generate a core dump or a seg fault. It seems that the issue is
with the const char * parameter.
I don't have a good grasp of the difference between the way D and C work
for char * types. The call to loadTexture uses a literal for the file
name, i.e. "resources/ball.png".
// d lang bindings for C function
alias void SDL_Renderer;
alias void SDL_Texture;
extern (C) SDL_Texture * IMG_LoadTexture(SDL_Renderer * renderer, const
char * file);
// d lang call to extern (C) function
SDL_Texture* loadTexture( SDL_Renderer * ren, const char * file )
{
SDL_Texture * loadedImage = IMG_LoadTexture( ren, file );
return loadedImage;
}
I wouldn't expect to see strings represented as 'const char *' on D
side. The more convenient and safer option is to use 'string' on the D
side and pass it through toStringz() before calling C.

The D function now takes 'string' and calls toStringz() on it:

SDL_Texture* loadTexture( SDL_Renderer * ren, string file )
{
SDL_Texture * loadedImage = IMG_LoadTexture( ren, file.toStringz);
return loadedImage;
}

However, note the lifetime issue:

http://dlang.org/phobos/std_string.html#.toStringz

Ali
Mike Parker via Digitalmars-d-learn
2014-10-16 07:54:47 UTC
Permalink
Since I've added this call, my program will sometimes but not always
either generate a core dump or a seg fault. It seems that the issue is
with the const char * parameter.
I don't have a good grasp of the difference between the way D and C work
for char * types.
Strings in C are arrays of chars ending with the nul terminator. Strings
in D are not required to be nul terminated. String literals in D *are*
nul terminated. When passing a string to a C function that takes const
char*, use toStringz as Ali showed in his post.


---
This email is free from viruses and malware because avast! Antivirus protection is active.
http://www.avast.com
Mike Parker via Digitalmars-d-learn
2014-10-16 07:55:37 UTC
Permalink
Post by Mike Parker via Digitalmars-d-learn
Since I've added this call, my program will sometimes but not always
either generate a core dump or a seg fault. It seems that the issue is
with the const char * parameter.
I don't have a good grasp of the difference between the way D and C work
for char * types.
Strings in C are arrays of chars ending with the nul terminator. Strings
in D are not required to be nul terminated. String literals in D *are*
nul terminated. When passing a string to a C function that takes const
char*, use toStringz as Ali showed in his post.
Forgot to mention -- toStringz in std.string will add the nul terminator
if it is not already there.


---
This email is free from viruses and malware because avast! Antivirus protection is active.
http://www.avast.com
dysmondad via Digitalmars-d-learn
2014-10-17 04:31:13 UTC
Permalink
Post by Mike Parker via Digitalmars-d-learn
Post by Mike Parker via Digitalmars-d-learn
Since I've added this call, my program will sometimes but not always
either generate a core dump or a seg fault. It seems that the issue is
with the const char * parameter.
I don't have a good grasp of the difference between the way D and C work
for char * types.
Strings in C are arrays of chars ending with the nul
terminator. Strings
in D are not required to be nul terminated. String literals in D *are*
nul terminated. When passing a string to a C function that
takes const
char*, use toStringz as Ali showed in his post.
Forgot to mention -- toStringz in std.string will add the nul
terminator if it is not already there.
---
This email is free from viruses and malware because avast!
Antivirus protection is active.
http://www.avast.com
Thank you very much. Because of your help, my application has far
fewer seg faults and core dumps.

Now, if I can just figure out why the SDL_RenderPresent call is
having problems. I suspect that has more to do with the way I'm
using the library than the calling convention.

Loading...