【发布时间】:2021-04-18 17:51:37
【问题描述】:
我实际上是在尝试编写一个充当 np.reshape 的函数,但使用的是 C++。我想获取一个输入矩阵,定义输出矩阵的维度,并让代码创建一个适当大小的输出数组。我在 Microsoft Visual Studio 2019 中工作,并已更改为 ISO C++ 17 标准。我知道 C++ 不是为支持可变长度数组而设计的,但我正在努力寻找一种解决方法。
int8_t reshape(int8_t **inputMatrix, int outputRows, int outputCols) {
int inputRows = sizeof(inputMatrix) / sizeof(inputMatrix[0]);
int inputCols = sizeof(inputMatrix[0]);
int ii = 0; int jj = 0;
int8_t outputMatrix[outputRows][outputCols];
for (int i = 0; i < inputRows; i++) {
for (int j = 0; j < inputCols; j++) {
outputMatrix[ii][jj] = inputMatrix[i][j];
jj++;
if (jj == outputCols) {
jj = 0;
ii++;
}
}
}
return outputMatrix;
}
我收到以下错误:
- 在 int8_t outputMatrix[outputRows][outputCols]; 行中,引用变量 outputRows 和 outputCols 时出现“E0028 - 表达式必须具有常量值”的双重错误。
- 在同一行中,还有另一个双重错误“C2131 - 表达式未计算为常量”
- 在 outputMatrix[ii][jj] = inputMatrix[i][j]; 行中出现错误“C3863 - array type 'int8_t [outputRows][outputCols]' is not assignable "
在此代码的最终目的中,使用 malloc/calloc 是可以的,但我无法做到这一点。
【问题讨论】:
-
std::vector是 VLA 的解决方法。 -
既然你想要一个矩阵,here's a simple and efficient one.
-
顺便说一句,您用于计算
inputRows和inputColls的代码是错误的。sizeof(inputMatrix)将评估为指针的大小,而不是您期望看到的大小。sizeof(inputMatrix[0]也会计算出指针的大小。 -
另请注意,返回原始数组非常非常困难。 Arrays decay 指向指针,因此您最终会返回一个指向超出范围的数组的指针,一旦函数返回就不再有效。当调用者得到指针时,已经没有数组了。
-
Visual C++(和 ISO C++)中没有 VLA,因此无法初始化它们。
标签: c++ visual-studio function variable-length-array