c++ - 在 (C/C++) 中将一维数组分配为二维(多)维数组的元素

标签 c++ c arrays visual-c++ multidimensional-array

首先请为我的英语道歉。 让我们分别定义一维和二维(多)维数组,如下所示:

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/

相关文章:

c++ - C++ 的哪些特性在编译时特别占用资源?

iphone - 使用 QT C++ 编写跨平台手机应用的现实

c - 如何在不使用 strtok 的情况下在 C 中拆分字符串

求平均值的C程序,代码有什么问题?

php - 来自 textarea 的数组没有为 MySQL 查询(UTF8?)正确地换行?

c++ - WaitForSingleObject 在 XP 中获取他的信号量,但在 Vista 中没有

c# - 使用 DLLImport 时异常如何工作

无法释放 C 中的内存 - 动态结构和数组

java - 在 JAVA 中用零初始化一个二维数组

java - 在数组中使用文本文件。文本文件有 15 行,名称和 4 个分数重复 3 次。无法获取数组来抓取文本数据