On Wednesday, 24 October 2012 at 09:03:25 UTC, Jacob Carlborg wrote:
On 2012-10-24 09:54, Jakob Bornecrantz wrote:
Hey everybody.

How are you supposed to pass static arrays to C functions? I'm asking because I'm getting conflicting info from how DMD works and on IRC.

The below example prints:
test1 0x7fff857c1db0
test2 0x7fff857c1db0
test3 (nil)
test4 0x7fff857c1db0


D:
void main()
{
        float[3] arr;
        test1(arr);
        test2(&arr[0]);
        test3(0, arr);
        test4(0, &arr[0]);
}

extern(C):
void test1(float[3] arr);
void test2(float *arr);
void test3(int, float[3] arr);
void test4(int, float *arr);


C:
#include <stdio.h>

void test1(float arr[3]) { printf("test1 %p\n", &arr[0]); }
void test2(float arr[3]) { printf("test2 %p\n", &arr[0]); }
void test3(int anything, float arr[3]) { printf("test3 %p\n", &arr[0]); } void test4(int anything, float arr[3]) { printf("test4 %p\n", &arr[0]); }

That seems weird. Since static arrays are passed by value in D you need to send a reference:

Yeah I'm wondering if this isn't a bug.


extern (C) void test1(ref float[3] arr);

float[3] arr;
test1(arr);

BTW, do not ever use "&arr[0]", use "arr.ptr" instead to get the pointer of the array.

Right you are, thats what you get when mixing C and D code.


http://dlang.org/interfaceToC.html

Search for "Passing D Array Arguments to C Functions".

Thanks for the info.

Cheers, Jakob.


Reply via email to