Difficulty copying multi dimensional static array to dynamic array.
Spacen Jasset
spacen at yahoo.co.uk
Mon Feb 25 16:17:10 PST 2008
Derek Parnell wrote:
> On Tue, 26 Feb 2008 09:39:49 +1100, Derek Parnell wrote:
>
>> On Mon, 25 Feb 2008 23:11:11 +0100, Saaa wrote:
>>
>>> Using ref should do the trick without pointers.
>
> Oh and if it's "tricks" you want ;-) this works ...
>
> import std.stdio;
> struct nastytrick(T)
> {
> T m;
> }
>
> alias float[3][5] a2D;
> alias nastytrick!(a2D) sa2D;
>
> void fillArray(ref sa2D data)
> {
> invariant int maxi = data.m.length;
> invariant int maxj = data.m[0].length;
>
> for (int i = 0; i < maxi; i++)
> for (int j = 0; j < maxj; j++)
> data.m[i][j] = i*maxj + j;
>
> }
> void main()
> {
> sa2D x; // declare static array inside its struct wrapper.
> fillArray( x );
> std.stdio.writefln("%s", x.m);
> }
>
> It seems very odd that a struct can be passed using 'ref' but a fixed
> length array can't be.
>
I don't see the mystery. Arrays are *always* passed by reference. You
can't use ref because can't change a ref to a static array (becuase it's
static?) so it doesn't actually make sense, you can [I think] with a
class object -- Chanage it's ref using "ref" keyword so that it points
to a new object) So that is all fine and makes sense as far as I can see.
My beef is returning static arrays which you can't do. You can return
dynamic ones only.
It makes this impossible:
glMatrixMultiply( mymatrix.toFloatArray16() );
Instead you have to do something like this:
float[4][4] temp;
mymatrix.toFloatArray16ByRef( temp );
glMatrixMultiply( temp );
Or
glMatrixMultiply( *temp.toFloatArrayPointer() );
toFloatArrayPointer is:
float[16] * toFloatArrayPointer()
{
static float[16] matrix;
return &matrix;
}
...and then you can use a wrapping structure and so on. But this isn't
'right' is it? or is it? Can why can I not use something like:
glMatrixMultiply( mymatrix.toFloatArray16() );
where toFloatArray16 is:
float[4][4] toFloatArray()
{
float[4][4] a;
return a; // a is returned like a struct would be. (i.e. copied onto
the stack and copied off on return. (or usually optimsed via a pointer
on the stack to the callers object perhaps - whatever dmd currently does)
}
More information about the Digitalmars-d-learn
mailing list