www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Call of C function breaks memoty layout

reply Andrey <saasecondbox yandex.ru> writes:
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;
}
Jan 24 2020
next sibling parent Steven Schveighoffer <schveiguy gmail.com> writes:
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
Jan 24 2020
prev sibling next sibling parent reply drug <drug2004 bk.ru> writes:
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
Jan 24 2020
parent Steven Schveighoffer <schveiguy gmail.com> writes:
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
Jan 24 2020
prev sibling parent Steven Schveighoffer <schveiguy gmail.com> writes:
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
Jan 24 2020