Thread overview
Static arrays passed by value..?
Aug 07, 2010
simendsjo
Aug 07, 2010
Lionello Lunesu
Aug 07, 2010
Simen kjaeraas
Aug 07, 2010
BCS
Aug 08, 2010
simendsjo
August 07, 2010
The spec for array says:
	Static arrays are value types. Unlike in C and D version 1, static arrays are passed to functions by value. Static arrays can also be returned by functions.

I don't get the "static arrays are passed to functions by value" part.

Here I am passing in a static and dynamic array. Both are passed by value, and the function can modify the array of both

	{
		void func(int[] arr, void* ptr) {
			arr[0] = 9;
			assert(&arr != ptr);
		}

		int[3] a = [1,2,3];
		func(a, &a);
		assert(a == [9,2,3]); // changed..
		
		int[] b = [1,2,3];
		func(b, &b);
		assert(b == [9,2,3]);
	}
August 07, 2010
On 2010-08-07 9:26, simendsjo wrote:
> The spec for array says:
> Static arrays are value types. Unlike in C and D version 1, static
> arrays are passed to functions by value. Static arrays can also be
> returned by functions.
>
> I don't get the "static arrays are passed to functions by value" part.
>
> Here I am passing in a static and dynamic array. Both are passed by
> value, and the function can modify the array of both
>
> {
> void func(int[] arr, void* ptr) {
> arr[0] = 9;
> assert(&arr != ptr);
> }
>
> int[3] a = [1,2,3];
> func(a, &a);
> assert(a == [9,2,3]); // changed..
>
> int[] b = [1,2,3];
> func(b, &b);
> assert(b == [9,2,3]);
> }

When you use "int[]" as the parameter type, the array is passed by reference as a slice of the original array. If you write the function like this:

fund(int[3] arr, void* ptr) {...}

Now the array is passed by value and a copy is made.
August 07, 2010
simendsjo <simen.endsjo@pandavre.com> wrote:

> The spec for array says:
> 	Static arrays are value types. Unlike in C and D version 1, static arrays are passed to functions by value. Static arrays can also be returned by functions.
>
> I don't get the "static arrays are passed to functions by value" part.
>
> Here I am passing in a static and dynamic array. Both are passed by value, and the function can modify the array of both
>
> 	{
> 		void func(int[] arr, void* ptr) {
The problem is here    ^^

What your function signature is saying, is 'pass arr to me as if a
dynamic array'. If you want to pass a static array, define the function
like this, and you will see magic at work:
    void func( int[3] arr, void* ptr ) {

> 			arr[0] = 9;
> 			assert(&arr != ptr);
> 		}
>
> 		int[3] a = [1,2,3];
> 		func(a, &a);

This call is equivalent to func( a[], &a );. Since your function says
to treat the array as dynamic, a slice is created from your static array.

> 		assert(a == [9,2,3]); // changed..
> 		
> 		int[] b = [1,2,3];
> 		func(b, &b);
> 		assert(b == [9,2,3]);
> 	}


-- 
Simen
August 07, 2010
Hello simendsjo,

> The spec for array says:
> Static arrays are value types. Unlike in C and D version 1, static
> arrays are passed to functions by value. Static arrays can also be
> returned by functions.
> 
> I don't get the "static arrays are passed to functions by value" part.
> 
> Here I am passing in a static and dynamic array. Both are passed by
> value, and the function can modify the array of both

What that is saying is that "if the type of the function arg is a static array..." not "if the value passed to the function is a static array..."

An example of a function taking a static array is:

void Fn(int[5] arr){ ... }

-- 
... <IXOYE><



August 08, 2010
On 08.08.2010 01:52, BCS wrote:
> What that is saying is that "if the type of the function arg is a static
> array..." not "if the value passed to the function is a static array..."

Yes, it would help to read the spec a bit closer :)