请先为我的英语道歉。 让我们分别输入单个和两个(多)维数组,如下所示:
typedef float VERTREX[3];
typedef VERTREX TRIANGLE[3];
然后说我已经初始化了一些VERTEX数组,
VERTREX v1 = { 1, 2, 3 };
VERTREX v2 = { 2, 2, 3 };
VERTREX v3 = { 1, 2, 1 };
以数学方式假设由三个顶点组合定义的三角形,因此我将Triangle定义为以下代码片段,
TRIANGLE tr;
当我要将每个 VERTEX (单维数组)元素分配到 TRIANGLE (数组/二维数组的数组)时出现问题,如下面的代码所示,
tr[0] = v1; // error C2106: '=' : left operand must be l-value(in Visual C++ compiler)
tr[1] = v2; // error C2106:
tr[2] = v3; // error C2106:
此外,我也无法继续创建三角形阵列。
TRIANGLE tr[4]; // creating array of Triangles
因此可以预期相同的行为。 如果有人有想法/解决方案如何将单维数组指定为二(多)维数组的元素请回复。请不要提供标准容器的解决方案,如std :: vector或使用原始指针方法。 请绑定数组概念。 谢谢大家的倾听。 请提供干净的答案。
答案 0 :(得分:3)
typedef
是别名。他们没有定义新类型。
TRIANGLE tr;
tr[0] = v1;
类似于:
VERTEX temp;
temp = v1;
如果删除typedef
并使用实际类型,则相当于:
float v1[3] = { 1, 2, 3 };
float temp[3];
temp = v1;
在C / C ++中不允许这样做。你不能分配给那样的数组。
您需要逐个复制元素,或使用memcpy
。
for (int i = 0; i < 3; ++i )
tr[0][i] = v1[i];
或
memcpy(tr[0], v1, sizeof(v1));
当您使用TRIANGLE
的数组时,您必须使用类似的策略将TRIANGLE
复制到数组的元素。
由于这些大小是在编译时定义的,因此我强烈建议使用std::array
。
这是一个简单的程序:
#include <iostream>
#include <array>
using VERTEX = std::array<float, 3>;
using TRIANGLE = std::array<VERTEX, 3>;
int main()
{
VERTEX v1 = { 1, 2, 3 };
VERTEX v2 = { 2, 2, 3 };
VERTEX v3 = { 1, 2, 1 };
TRIANGLE tr;
tr[0] = v1;
TRIANGLE trArray[4];
trArray[0] = tr;
std::cout << v1[0] << " " << v1[1] << " " << v1[2] << std::endl;
}
以及输出:
1 2 3
答案 1 :(得分:1)
如果你真的需要使用typedef,你可以这样做:
typedef float VERTREX[];
typedef float* TRIANGLE[3];
int main() {
VERTREX v1 = { 1, 2, 3 };
VERTREX v2 = { 2, 2, 3 };
VERTREX v3 = { 1, 2, 1 };
TRIANGLE tr;
tr[0] = v1;
tr[1] = v2;
tr[2] = v3;
TRIANGLE triangle[4];
return 0;
}
但我强烈建议使用std :: array方法。它不容易出错和误用。用户不会知道VERTREX或TRIANGLE是数组。
答案 2 :(得分:1)
typedef float VERTREX[3];
typedef VERTREX* TRIANGLE[3];
int main()
{
VERTREX v1 = { 1, 2, 3 };
VERTREX v2 = { 11, 21, 13 };
VERTREX v3 = { 1, 12, 41 };
TRIANGLE tr;
tr[0] = &v1;
tr[1] = &v2;
tr[2] = &v3;
tr[3] = &v3; --(1)// Concept(Array size) violation - Expect Runtime error
std::cout << (*(&v3))[2] << std::endl;
std::cout << (*tr[2])[2] << std::endl;
system("Pause");
return 0;
}
//使用警告级别4编译Visual C ++(v.120),如果我们删除第(1)行,则无警告,此处输出: 41 41
答案 3 :(得分:0)
所有答案都是正确的,但我会尝试简化该错误的解释。即使看起来很复杂,也很简单:
导致整个错误只是因为您无法分配到数组:
int array[5];
int another_array[5];
array = another_array; //error, can't assign to array
现在,让我们尝试使用多维数组:
int array_of_array[5][2];
int regular_array[2];
array_of_array[0] = regular_array; // error can't assign to array