无法将二维数组传递给 C++ 中的辅助函数

Posted

技术标签:

【中文标题】无法将二维数组传递给 C++ 中的辅助函数【英文标题】:Cannot pass 2d array into a helper function in c++ 【发布时间】:2019-12-30 05:00:03 【问题描述】:

当我创建一个辅助函数来打印当前棋盘(二维数组)时,我正在学习 c++ 并实现生命游戏。我似乎无法将数组传递给函数,因为我收到错误“候选函数不可行:第三个参数没有从 'char [rows][cols]' 到 'char (*)[cols]' 的已知转换。”如果有帮助,我将使用 Xcode 作为 ide。

void printArray(int rows, int cols, char board[rows][cols])
    for(int r = 0; r < rows; r++)
        for(int c = 0; c < cols; c++)
            cout << board[r][c];
            cout << " ";
        
        cout << "\n";
    


int main()
     char board[5][5];
    for(int r = 0; r < 5; r++)
        for(int c = 0; c < 5; c++)
            board[r][c] = 0;
        
    
    printArray(5, 5, board);
    return 0;

我尝试将参数切换到不同的东西,例如 char **board、char board[][cols]、char (*board)[cols]。甚至投射我的输入板会导致其他错误。

【问题讨论】:

这能回答你的问题吗? Passing a 2D array to a C++ function 你应该首先避免使用内置数组。如果您使用std::vector,则不会出现此问题。 @J.Doe 我已经试过了,但没用 @walnut 是的,我现在意识到自己的错误,但我想我还是想办法安息吧。 您在此处使用的技巧void printArray(int rows, int cols, char board[rows][cols]) 在 C 中有效,并可能在 C++ 中进行扩展,但要在 C++ 中完全兼容,所有数组维度都必须是常量。 【参考方案1】:

如果您想将二维数组传递给函数,则有一种特殊的语法。不幸的是,其他前 2 个答案没有完全正确回答。

您可以通过引用或指针传递。数组维度必须是编译时常量。这是 C++ 的要求。

请看:

constexpr size_t NumberOfRows = 3;
constexpr size_t NumberOfColumns = 4;

// Typedef for easier usage
using IntMatrix2d = int[NumberOfRows][NumberOfColumns];

//Solution 1 ------
// Pass by reference
void function1(int(&matrix)[NumberOfRows][NumberOfColumns])  

// Pass by pointer
void function2(int(*m)[NumberOfRows][NumberOfColumns])  

//Solution 2 ------
// Pass by reference
void function3(IntMatrix2d& matrix) 

// Pass by pointer 
void function4(IntMatrix2d* matrix) 


int main()

    // Solution 1
    // Handwritten matrix. Dimension is compile time constant
    int matrix1[NumberOfRows][NumberOfColumns];

    // Pass by reference
    function1(matrix1);

    // Pass by pointer
    function2(&matrix1);

    // Solution 2 -----
    IntMatrix2d matrix2;

    // Pass by reference
    function3(matrix2);

    // Pass by pointer
    function4(&matrix2);

    return 0;

如果你 typedef 或使用 using 来定义你的类型,那么它会变得相当直观。

【讨论】:

【参考方案2】:

如果您对指针不太满意,那么有一些简单的方法可以完成任务 1. 在将数组传递给函数之前,您必须在默认情况下定义二维数组大小,以便函数似乎不知道大小。

#include <iostream>

const std::size_t rows=5;
const std::size_t cols=5;

void printArray(char board[rows][cols]) 
    for (int r = 0; r < rows; r++) 
        for (int c = 0; c < cols; c++) 
            std::cout << board[r][c];
            std::cout << " ";
        
        std::cout << "\n";
    


int main() 
    char board[rows][cols];
    for (int r = 0; r < rows; r++) 
        for (int c = 0; c < cols; c++) 
            board[r][c] = '0';
        
    
    printArray(board);
    return 0;

2. 使用矢量。将您的电路板设为矢量。

#include <iostream>
#include <vector>
void printArray(std::vector<std::vector<char>> &board) 
    for (int r = 0; r < board.size(); r++) 
        for (int c = 0; c < board[0].size(); c++) 
            std::cout << board[r][c];
            std::cout << " ";
        
        std::cout << "\n";
    


int main() 
    std::vector<std::vector<char>> board(rows, std::vector<char>(cols, '0'));
    printArray(board);

【讨论】:

【参考方案3】:

我在为一个班级做项目时遇到了这个问题。为了解决这个问题,我创建了一个双指针数组,然后将它传递给函数来操作它。

int** createArr()

    int** pixels = 0;
    pixels = new int*[numrows];

    for (int row = 0; row < numrows; row++)
    pixels[row] = new int[numcols];

            for (int col = 0; col < numcols; col++)
                ss >> pixels[row][col];

            
    
    return pixels;


int** newArr = createArr(); //calls function to create array

func(newArr); //where func is a function that modifies the array.

不要忘记最后删除数组以避免内存泄漏。希望这会有所帮助。

【讨论】:

要完成这个答案,您应该添加销毁逻辑,因为从数组数组中正确释放所有内存并非易事。 解决方案不应该引入比它解决的问题更多的问题。 new[] 在用户代码中...真的!??

以上是关于无法将二维数组传递给 C++ 中的辅助函数的主要内容,如果未能解决你的问题,请参考以下文章

无法将二维字符数组传递给函数(C++)

如何将 C# 中的二维数组传递给 C++ DLL?

将二维数组传递给 C++ 函数

将二维数组指针传递给c ++中的函数[重复]

将二维数组从 C# 传递到 C++

将二维双数组从 C# 传递到 C++ 函数