【问题标题】:Error with initialization of 2d arrays in C++在 C++ 中初始化二维数组时出错
【发布时间】:2021-12-28 06:03:51
【问题描述】:

所以,我将 typedef 声明为:

typedef float Matrix4[4][4];

当我尝试将其初始化为:

void getXRotationMatrix(float theta, Matrix4 ans) {

    ans = { {0,0,0,0},{1,1,1,1},{0,0,0,0},{1,1,1,1} };
}

它给出了一个错误:

初始化器值过多

但是,当我将其初始化为:

void getXRotationMatrix(float theta, Matrix4 ans) {

    float a[4][4] = { {0,0,0,0},{1,1,1,1},{0,0,0,0},{1,1,1,1} };
    ans = a;

}

它没有给出任何错误。谁能解释一下?

【问题讨论】:

  • ans = ...assignment 而不是初始化。而且您不能使用大括号括起来的列表分配给数组。

标签: c++ arrays c


【解决方案1】:

当我尝试将其初始化为:ans = { {0,0,0,0},{1,1,1,1},{0,0,0,0},{1,1,1 ,1} };

注意

ans = { {0,0,0,0},{1,1,1,1},{0,0,0,0},{1,1,1,1} };

是一个赋值而不是初始化。另一方面,

float a[4][4] = { {0,0,0,0},{1,1,1,1},{0,0,0,0},{1,1,1,1} };

是一个初始化,所以可以工作。

初始化ans 的正确方法是:

Matrix4 ans{ {0,0,0,0},{1,1,1,1},{0,0,0,0},{1,1,1,1} };

另请注意,数组赋值在 C++ 中不可能

对于ans = a;,您还必须注意(考虑)类型衰减的概念。特别是ansa 实际上都是指针,所以当你写的时候

ans = a;

您实际上是在将一个指针分配给另一个,而不是将一个数组分配给另一个。

您可以使用std::vector,如下所示:

typedef std::vector<std::vector<float>> Matrix4;
void getXRotationMatrix(float theta, Matrix4 ans) {

    ans = { {0,0,0,0},{1,1,1,1},{0,0,0,0},{1,1,1,1} };

}

【讨论】:

  • ans = a; "works",因为ans 是指向调用端数组的指针,而不是数组本身。赋值后ans 指向a,但不会改变调用端数组的任何内容。
  • @mch 是的,我知道,我已在答案末尾添加了它。
  • 我建议添加一个词,在 C 中设置 ans 的方法是 memcpy(ans, a, sizeof a);
【解决方案2】:

在 C++ 中初始化二维数组时出错

当我尝试将其初始化为:

ans = { {0,0,0,0},{1,1,1,1},{0,0,0,0},{1,1,1,1} };

问题 1:这不是初始化。那是任务。无法分配数组,但这与下一点无关。

问题 2:ans 不是数组。函数参数永远不是数组。尽管您将其编写为数组,但已将其调整为指向所述数组类型的元素的指针。而且您提供的花括号初始化列表不是用于分配指针的有效右手参数。

但是,当我将其初始化为:

ans = a;

它变得格式良好,因为a 是分配给指针的有效表达式。该数组将隐式转换为指向第一个元素的指针。

但指针是函数的本地指针,因此该函数没有任何副作用。


我建议返回而不是尝试修改参数。现在,数组不能在 C++ 中返回,但有一个简单的解决方案:您可以返回类实例,并且类可以包含数组作为成员。标准库中有此类数组包装器的类模板。它被称为std::array。示例:

std::array<float[4], 4>
getXRotationMatrix() {
    return {{
         {0,0,0,0},
         {1,1,1,1},
         {0,0,0,0},
         {1,1,1,1},
    }};
}

【讨论】:

  • 我正在尝试使用您的方法返回一个数组,但它给了我错误:C++ 函数返回不完整的类型 "std::array"
  • @thecoderenroute 你是否包含了定义std::array的标头?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 2014-06-23
  • 2020-10-30
  • 2018-08-21
  • 2021-04-04
相关资源
最近更新 更多