February 26, 2018 Re: Translating C "static arrays" into D? | ||||
---|---|---|---|---|
| ||||
On Mon, Feb 26, 2018 at 06:25:42PM +0000, Atila Neves via Digitalmars-d wrote: [...] > There's a common misconception in C that arrays and pointers are the same thing - they're not. This comes about because of the dubious C feature whereby arrays decay into pointers in function calls. Somewhat related to this, a little known feature of C is pointers to arrays. In your example, that's what y and z are. They have funky syntax and look like function pointers, unless they're obscured with a typedef as in your example. > > You can pass a double array of any size to x, or a pointer to double, but y and z are constrained to be pointers to arrays of size 1. Exemplified: > > typedef double mytype[1]; > void func1(mytype x); > void func2(mytype* x); > > int main() { > double arr1[1]; > double arr2[2]; > double* ptr; > > func1(arr1); // fine > func1(arr2); // fine > func1(ptr); // fine > > func2(&arr1); // fine > func2(&arr2); // oops - won't compile > } Ouch. After working with C for more than 20 years, this one still escaped me. :-( How I hate C array semantics... On Mon, Feb 26, 2018 at 01:33:58PM -0500, Steven Schveighoffer via Digitalmars-d wrote: [...] > If you declare mytype as: > > alias mytype = double[1]; > > Then you can use it pretty much anywhere. The only exception is when it's the exact type of a parameter. In that case, use ref: > > extern(C) void someFunc(ref mytype x, mytype *y, mytype **z); [...] Nice, that's also the solution I eventually converged on. T -- Let's eat some disquits while we format the biskettes. |
Copyright © 1999-2021 by the D Language Foundation