无法将2d数组传递给c ++中的辅助函数

时间:2019-12-30 05:00:03

标签: c++ arrays xcode multidimensional-array parameters

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

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]。甚至浇铸我的输入板也会导致其他错误。

3 个答案:

答案 0 :(得分:2)

如果要将2d数组传递给函数,则有特殊的语法。不幸的是,其他前两个答案不能完全正确回答。

您可以按引用或指针传递。数组维数必须是编译时间常数。这是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作为类型定义,那么它会变得非常直观。

答案 1 :(得分:1)

如果您对指针不太满意,那么可以通过一些简单的方法来完成任务

1.在将数组传递给函数之前,您必须先定义 2d数组大小默认值,以使函数看起来好像不知道大小。

#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.使用 vector 。将您的板子变成矢量。

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

答案 2 :(得分:0)

我在为一个班级做项目时遇到了这个问题。要解决此问题,我制作了一个双指针数组,然后使用将其传递给函数进行操作。

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.

不要忘记最后删除阵列,以免造成内存泄漏。希望这会有所帮助。