【问题标题】:Cant's pass a 2D array to a function in C++无法将二维数组传递给 C++ 中的函数
【发布时间】:2021-12-15 05:49:15
【问题描述】:

我正在关注有关此主题的互联网教程,但我遇到以下情况:

我有一个具有以下签名的函数:

void func(long& rows, long& columns, int array[][columns]);

我正在尝试使用这样的功能:

int matrix[5][4] = {0,  -1,  2,  -3,
                    4,  -5,  6,  -7,
                    8,  -9,  10, -11,
                    12, -13, 14, -15,
                    16, -17, 18, -19};

long rows = 5;
long columns = 4;

func(rows, columns, matrix);
^--- 'No matching function for call to 'func''

有什么问题?为什么不能调用函数?

【问题讨论】:

  • 您正在尝试使用variable-length array。这些是 C 语言的一个特性,在 C++ 中不支持。 C++ 中动态大小的数组拼写为std::vector
  • 问题是这不是有效的 C++。 C++ 中的所有数组都有一个固定的、恒定的大小,并且您正试图将一个数组传递给一个函数,该函数的大小由另一个参数指定。 C++ 根本无法以这种方式工作。
  • 您可以使用模板,将矩阵的大小作为参数。请注意,您不能在 C++ 中传递数组!您所能做的就是传递指向它们的指针或引用。如果大小不是编译时常量,请使用矩阵类(如std::vector,但为 2D)。

标签: c++ arrays pointers multidimensional-array


【解决方案1】:

可变长度数组不是标准的 C++ 特性。

您可以通过以下方式声明函数和数组

const size_t columns = 4;

void func( size_t rows, const int array[][columns]);

//...


int matrix[][columns] = { {  0,  -1,   2,  -3 },
                          {  4,  -5,   6,  -7 },
                          {  8,  -9,  10, -11 },
                          { 12, -13,  14, -15 },
                          { 16, -17,  18, -19 } };

func( sizeof( matrix ) / sizeof( *matrix ),  matrix);

//...

void func( size_t rows, const int array[][columns] )
{
    std::cout << rows << columns << array[0][1];
}

请注意,由于列数是众所周知的,因此将其传递给函数是没有意义的。而且通过引用传递行数和列数是没有意义的。

【讨论】:

    【解决方案2】:

    您是否真的在程序中定义了func? 以下源代码编译并为我工作正常

    #include <iostream>
    
    #define ROW 5
    #define COLUMN 4
    
    void func(long &rows, long &columns, int array[][COLUMN]);
    
    int main()
    {
        int matrix[ROW][COLUMN] = {0, -1, 2, -3,
                              4, -5, 6, -7,
                              8, -9, 10, -11,
                              12, -13, 14, -15,
                              16, -17, 18, -19};
    
        long rows = 5;
        long columns = 4;
    
        func(rows, columns, matrix);
        return 0;
    }
    
    void func(long &rows, long &columns, int array[][COLUMN])
    {
        std::cout << rows << columns << array[0][1];
    }
    

    【讨论】:

    • 您正在为列使用定义的值,与原始问题不同。问题不在于函数定义。
    • 两个反对意见:使用宏而不是常量。在代码中留下幻数,而不是用它们的符号占位符替换它们。
    猜你喜欢
    • 2021-05-27
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多