簡體   English   中英

無法將二維數組傳遞給 C++ 中的輔助函數

[英]Cannot pass 2d array into a helper function in c++

當我創建一個輔助函數來打印當前的二維數組時,我正在學習 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]。 甚至鑄造我的輸入板,這會導致其他錯誤。

如果要將二維數組傳遞給函數,則有一種特殊的語法。 不幸的是,其他前 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 用於您的類型定義,那么它會變得相當直觀。

如果您對指針不是很滿意,那么有一些簡單的方法可以完成任務

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

我在為一個班級做項目時遇到了這個問題。 為了解決這個問題,我創建了一個雙指針數組,然后使用將它傳遞給函數來操作它。

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.

最后不要忘記刪除數組以避免內存泄漏。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM