Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-非左值数组的使用无效_C_Opengl - Fatal编程技术网

C-非左值数组的使用无效

C-非左值数组的使用无效,c,opengl,C,Opengl,我有一个矩阵结构: typedef struct Matrix { float m[16]; } Matrix; 当我尝试调用此函数时: memcpy(m->m, MultiplyMatrices(m, &translation).m, sizeof(m->m)); 我在编译时收到一个错误,它说: 错误:非左值数组的使用无效 乘法矩阵返回一个矩阵 我只有在使用gcc将文件编译成对象时才会出现此错误, 如果我使用g++编译对象,我不会得到任何错误 我甚至不知道这个错

我有一个矩阵结构:

typedef struct Matrix
{
    float m[16];
} Matrix;
当我尝试调用此函数时:

memcpy(m->m, MultiplyMatrices(m, &translation).m, sizeof(m->m));
我在编译时收到一个错误,它说:

错误:非左值数组的使用无效

乘法矩阵返回一个矩阵

我只有在使用gcc将文件编译成对象时才会出现此错误, 如果我使用g++编译对象,我不会得到任何错误

我甚至不知道这个错误是什么意思,我有一种感觉,它与存储在矩阵中的数组有关,该数组由多矩阵返回

如果您需要查看更多代码,请告诉我

此代码来自本教程:

p、 我想保持这个代码严格的iso/ansi,如果没有其他的解决方案,那么我将不得不处理它

编辑:我最终创建了一个临时矩阵,然后复制了数组

Matrix tempMatrix;

...

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

multilyMatrices()
的返回值不是左值(与任何函数的返回值一样),这意味着您不能获取其地址。计算数组(包括结构的数组成员)隐式地获取第一个元素的地址,因此不能这样做

但是,您可以使用包含
结构的简单赋值:

*m = MultiplyMatrices(m, &translation);

只要您的
struct
只包含所显示的一个元素,这是完全相同的。

memcpy(m->m,&multilymatrices(m,&translation).m[0],sizeof(m->m))使错误消失,至少对我来说是这样(GCC 4.5.2)。所以函数的返回值不是左值,所以我不能用指针指向它,但我可以用指针指向它的第一个元素?或者GCC有一个bug?此时您已经取消了对数组中第一个元素的引用,这是一个左值。。。然后可以正确地获取该元素的地址。基本上,不能将运算符的地址应用于右值,但可以将其应用于左值。数组隐式转换为指向该数组的指针是因为数组是左值。如果你从一个函数返回一个右值(这是经常发生的),那么隐式转换就不会发生,因为右值没有内存地址(它们是CPU寄存器中包含的临时值,而不是内存)。@Jason:谢谢。我从来没有完全理解过临时对象的规则。@Jason:实际上,在下一个序列点之后访问函数返回值是未定义的行为,在调用
memcpy()
之前,这里有一个序列点。@JosephQuinsey:是的,似乎是这样。返回值现在有效,直到完整表达式结束,而不仅仅是下一个序列点。