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