在(C / C ++)中将单维数组指定为两(多)维数组的元素

时间:2016-05-20 04:09:49

标签: 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定义为以下代码片段,

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或使用原始指针方法。 请绑定数组概念。 谢谢大家的倾听。 请提供干净的答案。

4 个答案:

答案 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