Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
October 16, 2014 extern (C) function call with const char * type will sometimes generate seg fault or core dump. | ||||
---|---|---|---|---|
| ||||
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; } |
October 16, 2014 Re: extern (C) function call with const char * type will sometimes generate seg fault or core dump. | ||||
---|---|---|---|---|
| ||||
Posted in reply to dysmondad | On 10/15/2014 08:18 PM, dysmondad wrote: > 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 |
October 16, 2014 Re: extern (C) function call with const char * type will sometimes generate seg fault or core dump. | ||||
---|---|---|---|---|
| ||||
Posted in reply to dysmondad | On 10/16/2014 12:18 PM, dysmondad wrote: > 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 |
October 16, 2014 Re: extern (C) function call with const char * type will sometimes generate seg fault or core dump. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | On 10/16/2014 4:54 PM, Mike Parker wrote: > On 10/16/2014 12:18 PM, dysmondad wrote: >> 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 |
October 17, 2014 Re: extern (C) function call with const char * type will sometimes generate seg fault or core dump. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | On Thursday, 16 October 2014 at 07:55:24 UTC, Mike Parker wrote:
> On 10/16/2014 4:54 PM, Mike Parker wrote:
>> On 10/16/2014 12:18 PM, dysmondad wrote:
>>> 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.
|
Copyright © 1999-2021 by the D Language Foundation