Thread overview
Call of C function breaks memoty layout
Jan 24, 2020
Andrey
Jan 24, 2020
drug
January 24, 2020
Hello,
I'm trying to bind C library for Tcl/Tk in D code. There is a function called "Tcl_CreateInterp()" which I declared as extent(C). When I call this function then layout of memory become broken - one of my global wstring variables loses it's value.
I don't know why it is happens. If I comment the call - I get normal execution.

May be somebody had faced with such problem. What to do?

My code:
> struct Tcl_Interp;
> extern (C)
>{
>    Tcl_Interp* Tcl_CreateInterp() nothrow;
>}
January 24, 2020
On 1/24/20 8:37 AM, Andrey wrote:
> Hello,
> I'm trying to bind C library for Tcl/Tk in D code. There is a function called "Tcl_CreateInterp()" which I declared as extent(C). When I call this function then layout of memory become broken - one of my global wstring variables loses it's value.
> I don't know why it is happens. If I comment the call - I get normal execution.
> 
> May be somebody had faced with such problem. What to do?
> 
> My code:
>> struct Tcl_Interp;
>> extern (C)
>> {
>>    Tcl_Interp* Tcl_CreateInterp() nothrow;
>> }

Not used Tcl in a long time, never via D.

Have a look at https://wiki.tcl-lang.org/page/D for some instruction maybe?

-Steve
January 24, 2020
On 1/24/20 4:37 PM, Andrey wrote:
> Hello,
> I'm trying to bind C library for Tcl/Tk in D code. There is a function called "Tcl_CreateInterp()" which I declared as extent(C). When I call this function then layout of memory become broken - one of my global wstring variables loses it's value.
> I don't know why it is happens. If I comment the call - I get normal execution.
> 
> May be somebody had faced with such problem. What to do?
> 
> My code:
>> struct Tcl_Interp;
>> extern (C)
>> {
>>    Tcl_Interp* Tcl_CreateInterp() nothrow;
>> }
I don't know if it is the reason but Tcl_Interp definitely should be extern(C) too in general
January 24, 2020
On 1/24/20 8:37 AM, Andrey wrote:
> Hello,
> I'm trying to bind C library for Tcl/Tk in D code. There is a function called "Tcl_CreateInterp()" which I declared as extent(C). When I call this function then layout of memory become broken - one of my global wstring variables loses it's value.
> I don't know why it is happens. If I comment the call - I get normal execution.
> 
> May be somebody had faced with such problem. What to do?
> 
> My code:
>> struct Tcl_Interp;
>> extern (C)
>> {
>>    Tcl_Interp* Tcl_CreateInterp() nothrow;
>> }


There's also this:  https://code.dlang.org/packages/tcltk

-Steve
January 24, 2020
On 1/24/20 9:58 AM, drug wrote:
> On 1/24/20 4:37 PM, Andrey wrote:
>> Hello,
>> I'm trying to bind C library for Tcl/Tk in D code. There is a function called "Tcl_CreateInterp()" which I declared as extent(C). When I call this function then layout of memory become broken - one of my global wstring variables loses it's value.
>> I don't know why it is happens. If I comment the call - I get normal execution.
>>
>> May be somebody had faced with such problem. What to do?
>>
>> My code:
>>> struct Tcl_Interp;
>>> extern (C)
>>> {
>>>    Tcl_Interp* Tcl_CreateInterp() nothrow;
>>> }
> I don't know if it is the reason but Tcl_Interp definitely should be extern(C) too in general

It shouldn't matter if you are passing an opaque pointer what the struct layout actually is.

-Steve