аргументы — C ++ Передача 2D-массивов

Я пытаюсь создать игру тральщика, которая загружает доску из плоского файла (нет, это не случайно). В соответствии с инструкциями присваивания я должен передать 2d-массив в функцию загрузки, которая затем проанализирует файл, переданный в качестве аргумента командной строки.

В любом случае, моя проблема — передать 2D-массив. Как правильно это делать? Ниже приведен код, который у меня есть до сих пор:

#include <iostream>

using namespace std;

struct Tile
{
bool mine, visible;
int danger;
};

bool loadBoard( Tile **board, string filename );

const int gridSize = 6;

int main( int argc, char* argv[] )
{
Tile board[ gridSize ][ gridSize ];

loadBoard( board, argv[ 1 ] );

system("PAUSE");
return EXIT_SUCCESS;
}

bool loadBoard( Tile **board, string filename ) {

}

-1

Решение

Поскольку вы используете C ++, почему бы не использовать

std::vector<std::vector<Tile>>

в предпочтение к массиву в стиле C?

Поскольку вам, кажется, нужно использовать массивы в стиле C, вы можете использовать подход, предложенный arpanchaudhury, или вы можете передать Tile* и делать что-то вроде

static void loadBoard(Tile *board, int rows, int cols, string filename) {
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
Tile* tile = &board[(row*gridSize)+col];
// populate Tile
}
}
}
3

Другие решения

Если вы хотите передать 2d-массив, укажите количество столбцов в массиве.

bool loadBoard( Tile board[][size], string filename ) {}

хотя предпочтительнее использовать векторы вместо простых массивов, так как вам не нужно указывать заранее определенный размер

2

Пока вы используете C ++ …

#include <iostream>
using namespace std;

struct Tile
{
bool mine, visible;
int danger;
};

// load a square board of declared-size.
template<size_t N>
void loadboard( Tile (&board)[N][N], const std::string& filename)
{
// load board here.
cout << "Loading from file: " << filename << endl;
for (size_t i=0;i<N;++i)
{
cout << "board[" << i << "]: [ ";
for (size_t j=0;j<N;++j)
{
// load element board[i][j] here
cout << j << ' ';
}
cout << ']' << endl;
}
cout << endl;
}

int main()
{
Tile board[6][6];
loadboard(board, "yourfilename.bin");   // OK dims are the same

Tile smaller[3][3];
loadboard(smaller, "anotherfile.bin");  // OK. dims are the same

// Tile oddboard[5][6];
// loadboard(oddboard, "anotherfile.bin"); // Error: dims are not the same.

return 0;
}

Выход

Loading from file: yourfilename.bin
board[0]: [ 0 1 2 3 4 5 ]
board[1]: [ 0 1 2 3 4 5 ]
board[2]: [ 0 1 2 3 4 5 ]
board[3]: [ 0 1 2 3 4 5 ]
board[4]: [ 0 1 2 3 4 5 ]
board[5]: [ 0 1 2 3 4 5 ]

Loading from file: anotherfile.bin
board[0]: [ 0 1 2 ]
board[1]: [ 0 1 2 ]
board[2]: [ 0 1 2 ]

Конечно, есть, вероятно, «конкретные инструкции», чтобы не использовать функцию шаблонов языка. Опять же, держу пари, что эти инструкции не включают в себя то, что пользователи SO решают и вашу проблему, поэтому я не собираюсь особо оценивать те, которые будут строго соблюдаться в ближайшее время.

1
По вопросам рекламы [email protected]