Я пытаюсь создать игру тральщика, которая загружает доску из плоского файла (нет, это не случайно). В соответствии с инструкциями присваивания я должен передать 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 ) {
}
Поскольку вы используете 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
}
}
}
Если вы хотите передать 2d-массив, укажите количество столбцов в массиве.
bool loadBoard( Tile board[][size], string filename ) {}
хотя предпочтительнее использовать векторы вместо простых массивов, так как вам не нужно указывать заранее определенный размер
Пока вы используете 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 решают и вашу проблему, поэтому я не собираюсь особо оценивать те, которые будут строго соблюдаться в ближайшее время.