Thread overview
setting statically sized multi-dimensional arrays
Jan 22, 2008
Spacen Jasset
Jan 22, 2008
Ary Borenszweig
Jan 22, 2008
Spacen Jasset
Jan 22, 2008
Hoenir
Jan 22, 2008
Hoenir
Jan 22, 2008
Bill Baxter
Jan 22, 2008
Hoenir
Jan 22, 2008
Bill Baxter
Jan 22, 2008
Hoenir
January 22, 2008
I have function below where I try to set a float[4][4] using array syntax. This doesn't work. Am I doing it wrongly, or is this not supported in dmd version 1? I seem to remember seeing something about this but can't remember where.



void MakeRotationAboutX(float[4][4] m, float angle)
{
    m[] = [[1f, 0, 0, 0],
           [0, cos(angle * PI / 180), sin(angle * PI / 180), 0],
           [0, -sin(angle * PI / 180), cos(angle * PI / 180), 0],
           [0, 0, 0, 1]];
}

main.d:501: Error: cannot implicitly convert expression
..lots of stuff..
of type float[][4u] to float[4u]
Command /usr/bin/rebuild returned with code 256, aborting.
January 22, 2008
Spacen Jasset escribió:
> I have function below where I try to set a float[4][4] using array syntax. This doesn't work. Am I doing it wrongly, or is this not supported in dmd version 1? I seem to remember seeing something about this but can't remember where.
> 
> 
> 
> void MakeRotationAboutX(float[4][4] m, float angle)
> {
>     m[] = [[1f, 0, 0, 0],
>            [0, cos(angle * PI / 180), sin(angle * PI / 180), 0],
>            [0, -sin(angle * PI / 180), cos(angle * PI / 180), 0],
>            [0, 0, 0, 1]];
> }
> 
> main.d:501: Error: cannot implicitly convert expression
> ..lots of stuff..
> of type float[][4u] to float[4u]
> Command /usr/bin/rebuild returned with code 256, aborting.

Try putting the "f" suffix on the first zeros in the second, third and foruth rows, too. It works for me:

import std.math;

void MakeRotationAboutX(float[4][4] m, float angle)
{
    m[] = [[1f, 0, 0, 0],
           [0f, cos(angle * PI / 180), sin(angle * PI / 180), 0],
           [0f, -sin(angle * PI / 180), cos(angle * PI / 180), 0],
           [0f, 0, 0, 1]];
}
January 22, 2008
Spacen Jasset schrieb:
> void MakeRotationAboutX(float[4][4] m, float angle)
> {
>     m[] = [[1f, 0, 0, 0],
>            [0, cos(angle * PI / 180), sin(angle * PI / 180), 0],
>            [0, -sin(angle * PI / 180), cos(angle * PI / 180), 0],
>            [0, 0, 0, 1]];
> }
why don't you use an extra function for the conversion of deg to rad? it will get inlined by the compiler so there's no efficiency loss.

btw you rotate clockwise, is this intented?
January 22, 2008
Oh and yet another thing: angle is in degrees, why is it a float?
January 22, 2008
Hoenir wrote:
> Oh and yet another thing: angle is in degrees, why is it a float?

Maybe he wants better than 1:360 precision?

--bb
January 22, 2008
Hoenir wrote:
> Spacen Jasset schrieb:
>> void MakeRotationAboutX(float[4][4] m, float angle)
>> {
>>     m[] = [[1f, 0, 0, 0],
>>            [0, cos(angle * PI / 180), sin(angle * PI / 180), 0],
>>            [0, -sin(angle * PI / 180), cos(angle * PI / 180), 0],
>>            [0, 0, 0, 1]];
>> }
> why don't you use an extra function for the conversion of deg to rad? it will get inlined by the compiler so there's no efficiency loss.
> 
> btw you rotate clockwise, is this intented?

Unless he's using row vectors and  v' = v * R
Or storing the matrix in column major format for use with Fortran and/or OpenGL (most likely).

--bb
January 22, 2008
Bill Baxter schrieb:
> Maybe he wants better than 1:360 precision?
I didn't consider that, thanks for your answer :)
January 22, 2008
Bill Baxter schrieb:
> Unless he's using row vectors and  v' = v * R
> Or storing the matrix in column major format for use with Fortran and/or OpenGL (most likely).
Ah I see, I read it like a normal matrix on paper.
January 22, 2008
Ary Borenszweig wrote:
> Spacen Jasset escribió:
>> I have function below where I try to set a float[4][4] using array syntax. This doesn't work. Am I doing it wrongly, or is this not supported in dmd version 1? I seem to remember seeing something about this but can't remember where.
>>
>>
>>
>> void MakeRotationAboutX(float[4][4] m, float angle)
>> {
>>     m[] = [[1f, 0, 0, 0],
>>            [0, cos(angle * PI / 180), sin(angle * PI / 180), 0],
>>            [0, -sin(angle * PI / 180), cos(angle * PI / 180), 0],
>>            [0, 0, 0, 1]];
>> }
>>
>> main.d:501: Error: cannot implicitly convert expression
>> ..lots of stuff..
>> of type float[][4u] to float[4u]
>> Command /usr/bin/rebuild returned with code 256, aborting.
> 
> Try putting the "f" suffix on the first zeros in the second, third and foruth rows, too. It works for me:
> 
> import std.math;
> 
> void MakeRotationAboutX(float[4][4] m, float angle)
> {
>     m[] = [[1f, 0, 0, 0],
>            [0f, cos(angle * PI / 180), sin(angle * PI / 180), 0],
>            [0f, -sin(angle * PI / 180), cos(angle * PI / 180), 0],
>            [0f, 0, 0, 1]];
> }


It still fails with the same error, I did try adding the 'f' suffix, and it's probably needed, but that didn't fix it.

I have:

On windows:
Digital Mars D Compiler v1.015
Copyright (c) 1999-2007 by Digital Mars written by Walter Bright


And on linux:

gdc (GCC) 4.1.3 20070831 (prerelease gdc 0.25, using dmd 1.021) (Ubuntu 0.25-4.1.2-16ubuntu1)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.