On Sun, Jun 26, 2011 at 5:00 PM, Alex_Dovhal <span dir="ltr"><<a href="mailto:alex_dovhal@yahoo.com">alex_dovhal@yahoo.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im">"Robert Clipsham" <<a href="mailto:robert@octarineparrot.com">robert@octarineparrot.com</a>> wrote:<br>
> On 26/06/2011 20:54, Alex_Dovhal wrote:<br>
>> I'd like to call C functions and use C variables in D module.<br>
>> D calls C functions just fine, but how can I use C variables?<br>
><br>
> extern(C) extern int myCVar;<br>
<br>
</div>Thanks for answer. I've already tried that, it doesn't work for some reason:<br>
<br>
* file unit2.d:<br>
<div class="im">module unit;<br>
import std.stdio;<br>
</div>extern(C) int func();<br>
<div class="im">extern(C) extern int c_var;<br>
<br>
</div><div class="im">void main()<br>
{<br>
    func();<br>
    writeln("In D");<br>
    writefln("c_var = %d", c_var);<br>
    writefln("&c_var = %x", &c_var);<br>
}<br>
<br>
</div>Result:<br>
<div class="im">In C<br>
c_var = 1234<br>
</div>&c_var = 470200<br>
In D<br>
object.Error: Access Violation<br>
----------------<br>
426DA4<br>
426C1B<br>
405BEB<br>
4057E7<br>
451099<br>
----------------<br>
<br>
<br>
Found workaround, but it's extreme hack:<br>
<br>
*file test.c<br>
<div class="im">#include <stdio.h><br>
int c_var;<br>
</div>//int* ref_c_var()<br>
//{<br>
//    return &c_var;<br>
//}<br>
<br>
#define REF_DECL(type, name) type* ref_ ## name () {return &name;}<br>
<br>
REF_DECL(int, c_var)<br>
<div class="im"><br>
int func()<br>
{<br>
    c_var = 1234;<br>
    printf("In C\n");<br>
    printf("c_var = %d\n", c_var);<br>
    printf("&c_var = %x\n", &c_var);<br>
    return 0;<br>
}<br>
<br>
</div>*file: unit1.d:<br>
<div class="im">module unit;<br>
import std.stdio;<br>
<br>
</div>extern(C) int func();<br>
<br>
string C_VAR(string type, string name)<br>
{<br>
    return<br>
        "extern (C) "~ type ~ "* ref_" ~ name ~ "();"~<br>
        " " ~ "ref " ~ type ~ " " ~ name ~"(){return *ref_"~name~"();}";<br>
}<br>
<br>
mixin(C_VAR("int", "c_var"));<br>
<div><div></div><div class="h5"><br>
void main()<br>
{<br>
    func();<br>
    writeln("In D");<br>
    writefln("c_var = %d", c_var);<br>
    writefln("&c_var = %x", &c_var);<br>
}<br>
<br>
<br>
</div></div></blockquote></div><br><div><br></div><div>It works for me like this:</div><div><br></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>extern(C){</div>

<div>   __gshared int c_var;</div><div>   int func();</div><div>}</div></div></blockquote>