繁体   English   中英

发送可变大小的2D数组以在C ++中运行

[英]Sending variable size 2D array to function in C++

我正在尝试编写一个函数,该函数接受可变大小的数组并打印出来。 但是我在编译时在函数声明参数列表中有问题。

错误是:

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;
}

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

我看到的问题

  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获得该信息。

首先是int b[r][r]; 可变长度数组 ,在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;
    }
}

[N][M]的2D数组在内存中的布局与[N*M]的1D数组相同。

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( &b[0][0], r, r)调用它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM