有没有办法在 Microsoft Visual Studio 2019 (C++) 的函数中初始化 VLA?

问题描述

我本质上是在尝试编写一个充当 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 - 数组类型 'int8_t [outputRows][outputCols]' 不可分配"

在这代码的最终目的中,使用 malloc/calloc 是可以的,但我没能做到这一点。

解决方法

如果您可以接受第三方库,您可以尝试使用此库: 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 outputCols)
{
    int inputRows = inputMatrix.size();
    int inputCols = inputMatrix[0].size();
    int ii = 0; int jj = 0;
    vla::dynarray<int8_t,2> outputMatrix(outputRows,size will not be changed.

    return outputMatrix;
}