【问题标题】:C++ Passing Dynamic Array Determined by ParameterC++ 传递由参数确定的动态数组
【发布时间】:2014-12-30 15:41:09
【问题描述】:

这个函数在这里被问过几次,但我对一个特定的案例感兴趣。是否可以通过附加参数定义传递的数组的大小?

举个例子,假设我想要一个函数来打印一个二维数组。但是,我的数组可能每次都没有相同的尺寸。如果我可以有其他参数来定义该数组的大小,那将是理想的。我知道我可以根据需要轻松地将n 切换为此处的数字,但如果我有更复杂的函数和单独的头文件,那么每次出现不同大小的数组时去编辑头文件似乎很愚蠢。以下结果为error: use of parameter 'n' outside function body...,我理解但想找到一些解决方法。我也尝试了g++ -std=c++11,但仍然是同样的错误。

#include <iostream>
using namespace std;

void printArray(int n, int A[][n], int m) {
    for(int i=0; i < m; i++){
        for(int j=0; j<n; j++) {
            cout << A[i][j] << " ";
        }
        cout << endl;
    }
}

int main() {

    int A[][3] = {
        {1,2,3},
        {4,5,6},
        {7,8,9},
        {10,11,12}
    };

    printArray(3, A, 4);

    return 0;
}

据推测,这可以通过 C99 完成,并且在 this question 中也提到过,但我不知道如何使用 C++。

【问题讨论】:

  • 这在标准 C++ 中是不可能的。 VLA 是仅 C 的功能,或非标准编译器扩展。 Link to related question

标签: c++ arrays variable-length-array


【解决方案1】:

这行得通:

template<size_t N, size_t M>
void printArray( int(&arr)[M][N] ) {
  for(int i=0; i < M; i++){
    for(int j=0; j < N; j++) {
      std::cout << A[i][j] << " ";
    }
    std::cout << std::endl;
  }
}

如果您愿意将代码放在头文件中。作为奖励,它会为您推断出NM

【讨论】:

  • 这在主文件中效果很好,但是当我把它放在标题中时我遇到了麻烦。它抱怨没有声明“M”和“N”。我错过了什么吗?
  • @cdeterman 函数的主体必须在头文件中。您可能需要#include &lt;cstddef&gt; 才能获得size_t,或者如果2^32 大小的数组足够大,则将size_t 替换为unsigned
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 2014-12-21
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多