arrays && functions && pointers

MM MM_member at pathlink.com
Sun Jun 18 18:11:37 PDT 2006


In C I used to do stuff like:

void foo (TILE (*tiles)[TILEW][TILEH]){
(*tiles)[0][0].z++; //random operation :)
}

But as I see in your (very complete :) explanation I can just do:

Void foo (TILE tiles[TILEW][TILEH]){
tiles[0][0].z++;
}

This is not slower? I ask this because this foo will be an excessively used
function in the game loop ;)

btw. How do I reset all the data of a rectangular array?
something like:
tiles[][]=0;


>Are you referring to something like (in C):
>
>void foo(char *string) {}
>char array[100];
>foo(array);
>
>In this case C automatically passes a pointer to the first element of the  
>array, rather than copying the entire array.
>
>> How is this done in D?
>
>In D and array is a pseudo reference pseudo value type. It is in reality a  
>struct in the form:
>
>struct array {
>   int length;
>   void *data;
>}
>
>or similar where "data" refers to the actual content of the array. Passing  
>the array passes a copy of the structure (like a value type) but does not  
>cause a copy of the data (like a reference type). This is fast and  
>efficient enough that there is no reason not to just pass it, much as you  
>do in C, eg.
>
>void foo(char[] string) {}
>char[100] array;
>foo(array);
>
>note that the above "array" is a fixed/static array of 100 characters, but  
>it can be passed as a dynamic array [] of variable length because the  
>function gets a copy of the structure which in turn refers to the original  
>static data.
>
>Therefore..
>
>If you pass an array as "in" (the default method) any modifications you  
>make to the array length or to the data pointer (by assigning a new array  
>slice to it or similar) will not be propagated back to the array you  
>passed to the function as they only happen to the copy you get inside the  
>function. However, any changes you make to the data to which the array  
>refers does propagate, because there is only 1 copy of it. eg.
>
>void foo(char[] string) {
>   string.length = 5;    //does not propagate
>   string = string[1..$] //does not propagate
>   string[0] = 'a';      //does propagate (actually modifies 2nd char  
>(index 1) of external array)
>}
>
>However..
>
>If you pass an array as "inout" or "out" then you do not get a copy of the  
>structure but you get the actual structure itself, so when/if you change  
>the length or data pointer you're change the array which you passed  
>directly and you will see the changes propagate.
>
>void foo(inout char[] string) {
>   string.length = 5;    //does propagate
>   string = string[1..$] //does propagate
>   string[0] = 'a';      //does propagate
>}
>
>Meaning..
>
>You cannot pass a fixed/static array as "inout" or "out" to a function  
>expecting a dynamic char[] because you cannot modify a fixed/static array  
>length or data pointer, you'll get an error like this if you try to pass  
>one.
>   cast(char[])(test) is not an lvalue
>
>In short, just pass your D arrays to functions as is, whether they're  
>fixed or dynamic.
>
>Regan





More information about the Digitalmars-d-learn mailing list