Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C - invalid use of non-lvalue array

Tags:

c

opengl

I have a matrix struct:

typedef struct Matrix
{
    float m[16];
} Matrix;

When I try to call this function:

memcpy(m->m, MultiplyMatrices(m, &translation).m, sizeof(m->m));

I get an error at compile time saying:

error: invalid use of non-lvalue array

MultiplyMatrices returns a Matrix.

I only get this error if I use gcc to compile the file into an object, if I use g++ to compile the object I get no error.

I am not even sure what the error means, I have a feeling it has to do with the array stored in the Matrix returned by MultiplyMatrices.

If you need to see more code let me know.

This code is from this tutorial: OpenGL Book Chapter 4

p.s. I would like to keep this code strict iso/ansi, if there is no other solution however, then I'll just have to deal with it.

EDIT: I ended up going with creating a temporary Matrix then copying the array.

Matrix tempMatrix;

...

tempMatrix = MultiplyMatrices(m, &translation);
memcpy(m->m, tempMatrix.m, sizeof(m->m));
like image 699
reynman Avatar asked Jul 11 '11 03:07

reynman


1 Answers

The return value of MultiplyMatrices() is not an lvalue (like the return value of any function), which means that you can't take its address. Evaluating an array (including an array member of a structure) implicitly takes the address of the first element, so you can't do that.

You can, however, use simple assignment of the containing struct:

*m = MultiplyMatrices(m, &translation);

As long as your struct only contains the one element as you have shown, this is exactly the same.

like image 135
caf Avatar answered Nov 10 '22 17:11

caf