c ++: передать 2d-массив по ссылке? - PullRequest
0 голосов
/ 18 марта 2020

Я возвращаюсь в c ++ и испытываю трудности с выяснением, как передать 2D-массив в функцию. Приведенный ниже код является моей текущей попыткой, я смог передать векторные строки по ссылке, используя:

vector<string> g_dictionary;
getDictionaryFromFile(g_dictionary, "d.txt");
...
void getDictionaryFromFile(vector<string> &g_dictionary, string fileName){..}

Но когда я пытаюсь сделать то же самое с моим 2d-массивом, как показано ниже, я получить ошибку в строке "solve_point (boardEx);" указанная ссылка типа char & не может быть инициализирована значением типа boardEx [5] [4]

#include <stdio.h>   
#include <string>
using namespace std;

void solve_point(char* &board){ 
    printf("solve_point\n");
    //board[2][2] = 'c';
}

int main(){
    char boardEx[5][4];
    solve_point(boardEx);
}

Ответы [ 3 ]

2 голосов
/ 18 марта 2020

Тип char*& является ссылкой на указатель. «2d» массив распадается на указатель на массив.

Для вашего массива boardEx он будет распадаться на тип char(*)[4], который должен соответствовать типу, который принимает ваша функция:

void solve_point(char (*board)[4]) { ... }

Или вы можете использовать шаблоны для определения размеров массива

template<size_t M, size_t N>
void solve_point(char (&board)[M][N]) { ... }

Или использовать std::array:

std::array<std::array<char, 5>, 4> boardEx;

...

void solve_point(std::array<std::array<char, 5>, 4> const& board) { ... }

Или использовать std::vector:

std::vector<std::vector<char>> boardEx(5, std::vector<char>(4));

...

void solve_point(std::vector<std::vector<char> const& board) { ... }

Учитывая редактирование вопроса, решение с использованием std::vector является единственным переносимым и стандартным возможным решением.

0 голосов
/ 18 марта 2020

Вы можете объявить функцию, которая принимает массив либо по значению, либо по ссылке.

Например (по значению)

void solve_point( char ( *board )[4] ){ 
    printf("solve_point\n");
    //board[2][2] = 'c';
}

int main(){
    char boardEx[5][4];
    solve_point(boardEx);
}

Или (по ссылке)

void solve_point(char ( &board )[5][4] ){ 
    printf("solve_point\n");
    //board[2][2] = 'c';
}

int main(){
    char boardEx[5][4];
    solve_point(boardEx);
}

В обоих случаях вы можете получить доступ к элементу массива с помощью выражения, подобного этому

board[i][j] = 'c';

Имейте в виду, что если у вас есть многомерный массив, например, такой

T a[N1][N2][N3];

где T - некоторый спецификатор типа, тогда вы можете переписать объявление следующим образом

T ( a[N1] )[N2][N3];

Теперь, чтобы получить указатель на элементы массива, просто замените ( a[N1] ), например, на ( *pa )

T ( *pa )[N2][N3] = a;

Чтобы получить ссылку на массив, перепишите его объявление как

T ( a )[N1][N2][N3];

и замените ( a ) на ( &ra ), например

T ( &ra )[N1][N2][N3] = a;

Если вы хотите написать функцию, которая принимает двухмерные массивы разных размеров по ссылке, тогда вы можете написать

template <typename T, size_t M, size_t N>
void solve_point( T ( &board )[M][N] ){ 
    //...
}

int main(){
    char boardEx[5][4];
    solve_point(boardEx);
}
0 голосов
/ 18 марта 2020

Ссылка на 2D-массив, подобный вашей, может быть определена с помощью:

char (&ref)[5][4] = boardEx;

Вы можете изменить функцию, чтобы использовать тот же синтаксис.

void solve_point(char (&board)[5][4]){ 
    printf("solve_point\n");
    //board[2][2] = 'c';
}

Для динамически размещаемый массив, будет лучше использовать std::vector.

int width = 7;
int height = 9;
char boardEx[width][height];

, поддерживаемый некоторыми компиляторами в качестве расширения, но это не стандарт C ++. Вместо этого используйте:

int width = 7;
int height = 9;
std::vecotr<std::vector<char>> boardEx(width, std::vector(height));

Обновите solve_point соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...