首先请为我的英语道歉。 让我们分别定义一维和二维(多)维数组,如下所示:
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 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 等标准容器或使用原始指针方法提供解决方案。 请绑定(bind)数组概念。 感谢大家的聆听。 请提供干净的答案。
最佳答案
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
关于c++ - 在 (C/C++) 中将一维数组分配为二维(多)维数组的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37337801/