【问题标题】:Sending variable size 2D array to function in C++将可变大小的二维数组发送到 C++ 中的函数
【发布时间】:2015-12-09 15:33:40
【问题描述】:

我正在尝试编写一个函数,它接受可变大小的数组并打印它。但是我在编译时遇到了函数声明参数列表的问题。

错误是:

cannot convert ‘int (*)[(((sizetype)(((ssizetype)r) + -1)) + 1)]’ to ‘int**’ for argument ‘1’ to ‘void printHalf(int**, int, int)’
  printHalf( b, r, r);

代码:

#include <iostream>

using namespace std;

void printHalf( int **a, int row, int col ) {  // Problem is here.
    for( int i=0; i < row; i++) {
        for( int j=0; j < col; j++) {
            if( i <= j) {
                cout << a[i][j] << " ";
            }
        }
        cout << endl;
    }
}

int main() {
    int r;
    cout << "No. of rows: ";
    cin >> r;
    int b[r][r];

    for( int i=0; i < r; i++) {
        for( int j=0; j < r; j++) {
            cin >> b[i][j];
        }
    }

    printHalf( b, r, r);
    return 0;
}

是什么导致了这个错误,我如何将各种数组传递给函数?

【问题讨论】:

  • @coincoin 我认为你应该在 C++ 中使用 new[] 而不是 malloc()
  • 我认为你不应该使用,而是使用std::vector
  • 不要用C++写C代码
  • 当然是我的错,我确定这是一个 C 问题... :)

标签: c++ arrays function multidimensional-array compiler-errors


【解决方案1】:

[N][M] 的二维数组与[N*M] 的一维数组在内存中的布局相同。

void printHalf( int *a, int row, int col ) {  // Problem is here.
    for( int i=0; i < row; i++) {
        for( int j=0; j < col; j++) {
            if( i <= j) {
                cout << a[i*col+j] << " ";
            }
        }
        cout << endl;
    }
}

然后你可以用printHalf( &amp;b[0][0], r, r)调用它。

您的基本误解是数组和指针之间的关系。数组不是指针。 int** 可以被视为int* 的数组,这不是你所拥有的。 b[0] 为您提供int[r]。这与int* 不同。 b[0][0] 让您获得第一个 int

【讨论】:

  • 你会想要a[i*col+j]
  • 感谢您给我面向 C 的答案,但我猜 vector 是 c++ 的方式
【解决方案2】:

我看到的问题

  1. C++ 不允许声明可变长度数组。因此,

    int b[r][r];
    

    错了。

  2. 一维数组衰减为指针,但二维数组不会衰减为指向指针的指针。即使您正确定义了b,例如:

    int b[10][10];
    

    您不能将b 用作需要int** 的函数的参数。

解决方案

我建议使用std::vector

std::vector<std::vector<int>> b(r, std::vector<int>(r));

相应地更改函数printHalf

void printHalf( std::vector<std::vector<int>> const& b ) { ... }

您不需要rowcol 作为参数,因为可以从std::vector 获得这些信息。

【讨论】:

    【解决方案3】:

    首先int b[r][r];variable length array,在 C++ 中不是标准的。如果您需要一个可以在运行时调整大小的容器,那么我建议您使用std::vector

    std::vector<std::vector<int>> data(r, std::vector<int>(r, 0)); // create vector and set all elements to 0
    

    那么你的打印功能就变成了

    void printHalf(const std::vector<std::vector<int>>& data) {
        for( std::size_t i=0; i < data.size(); i++) {
            for( std::size_t j=0; j < data[i].size(); j++) {
                if( i <= j) {
                    cout << a[i][j] << " ";
                }
            }
            cout << endl;
        }
    }
    

    【讨论】:

    • 使用引用来避免复制许多数据可能会很好。 void printHalf(std::vector&lt;std::vector&lt;int&gt;&gt; data) -> void printHalf(const std::vector&lt;std::vector&lt;int&gt;&gt;&amp; data)
    • 我还建议仅使用扁平/线性 vector&lt;int&gt; 而不是嵌套向量 vector&lt;vector&lt;int&gt;&gt;
    • @coincoin 这是一个很好的建议,我会在生产代码中使用它。我不想将它呈现给 OP,因为我已经改用向量,并且想让代码看起来尽可能接近原始代码。
    猜你喜欢
    • 2017-07-26
    • 1970-01-01
    • 2017-04-19
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多