Passing static arrays to C

Jakob Bornecrantz wallbraker at gmail.com
Wed Oct 24 02:55:01 PDT 2012


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.




More information about the Digitalmars-d mailing list