【问题标题】:Is there a way I can initialize a VLA within a function in Microsoft Visual Studio 2019 (C++)?有没有办法可以在 Microsoft Visual Studio 2019 (C++) 的函数中初始化 VLA?
【发布时间】: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;

}

我收到以下错误:

  1. 在 int8_t outputMatrix[outputRows][outputCols]; 行中,引用变量 outputRows 和 outputCols 时出现“E0028 - 表达式必须具有常量值”的双重错误。
  2. 在同一行中,还有另一个双重错误“C2131 - 表达式未计算为常量”
  3. 在 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


【解决方案1】:

如果您可以接受第三方库,您可以尝试使用此库: VLA for C++

然后你可以这样写代码:

#include "dynarray.hpp"

vla::dynarray<vla::dynarray<int8_t>> reshape(vla::dynarray<vla::dynarray<int8_t>> &inputMatrix,
                                             int outputRows, int outputCols)
{
    int inputRows = inputMatrix.size();
    int inputCols = inputMatrix[0].size();
    int ii = 0; int jj = 0;
    vla::dynarray<vla::dynarray<int8_t>> outputMatrix(outputRows, outputCols);
    outputMatrix = inputMatrix; // assign value only, size will not be changed.

    return outputMatrix;
}

甚至更好:

vla::dynarray<int8_t, 2> reshape(vla::dynarray<int8_t, 2> &inputMatrix,
                                 int outputRows, int outputCols)
{
    int inputRows = inputMatrix.size();
    int inputCols = inputMatrix[0].size();
    int ii = 0; int jj = 0;
    vla::dynarray<int8_t, 2> outputMatrix(outputRows, outputCols);
    outputMatrix = inputMatrix; // assign value only, size will not be changed.

    return outputMatrix;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多