Как преобразовать следующую функцию Java в C++?
Вопрос
Если у меня есть следующий код Java:
int[][] readAPuzzle()
{
Scanner input = new Scanner(System.in);
int[][] grid = new int[9][9];
for (int i=0; i<9; i++)
for (int j=0; j<9; j++)
grid[i][j] = input.nextInt();
return grid;
}
public static void main(String[] args) {
// Read a Sudoku puzzle
int[][] grid = readAPuzzle();
}
Как я могу преобразовать это в C++?Я зацикливаюсь на передаче массива.Вот моя попытка:
#include <iostream>
using namespace std;
const int puzzle_width = 9;
const int puzzle_height = 9;
void readAPuzzle(int (&grid)[puzzle_height][puzzle_width])
{
for(int i = 0; i < 9; i++)
for(int j = 0; j < 9; j++)
grid[i][j] = cin >> grid[i][j];
return;
}
int main()
{
int[9][9] grid;
readAPuzzle(grid);
}
Что я делаю не так вообще?
Решение
Вам нужно прочитать входной текст в массив grid
и передать это дальше.
grid[i][j] = cin >> grid[i][j];
Не делает то, что вы думаете, он пытается присвоить объекту тип istream
к grid[ i ][ j ]
cin >> grid[i][j];
однако хватает.
Также обратите внимание, что в C++ размеры следуют за идентификатором, например:
int grid[9][9];
Другие советы
Пытаться
#include <iostream>
using namespace std;
const int puzzle_width = 9;
const int puzzle_height = 9;
void readAPuzzle(int grid[puzzle_height][puzzle_width])
{
for(int i = 0; i < 9; i++)
for(int j = 0; j < 9; j++)
cin >> grid[i][j];
}
int main()
{
int grid[9][9];
readAPuzzle(grid);
}
Как правило, массивы автоматически передаются по ссылке, а размеры массивов указываются после имени массива, а не после его типа.
И если вы объявили константы, вам всегда следует использовать Puzzle_width и Puzzle_height (хотя, возможно, сократите их имена), а не магические числа, такие как 9.
Простой ответ — использовать vector
s вместо массивов.Правила C++ для передачи массивов в качестве параметров функции являются эзотерическими и заимствованы из C.Вот некоторые из проблем:
- Вы не можете долго использовать массивы, не понимая и не используя указатели.
Подписка к массиву — это подписка к указателю.Доступ к массивам осуществляется с помощью арифметики указателей.Массивы как параметры функции на самом деле являются замаскированными указателями.
- Функции не получают информацию о размере массива при приеме аргумента массива.
Рассмотрим декларацию:
void inc_all(int myarray[]); /* increments each member of the array */
К сожалению, этот параметр массива не является параметром массива!На самом деле это параметр указателя:
void inc_all(int *myarray); /* Exactly the same thing! */
А указатель не знает, сколько элементов находится в последовательности, на которую он указывает.В результате эта функция не может иметь информацию, необходимую для определения момента остановки массива.Вам либо нужно передать длину:
void inc_all(int *myarray, size_t len); /* size_t rather than int */
или вам нужно использовать контрольное значение, чтобы отметить конец массива.В любом случае массив не является автономным инкапсулированным типом данных, например vector
является.
- Вы не можете передать в функцию двумерный массив произвольного размера.
Если вы попытаетесь создать функцию, которая принимает двумерный массив:
void inc_all(int myarray[][]); /* XXX won't compile! */
он не скомпилируется.Проблема в том, что у вас есть массив неопределенной длины из массивов неопределенной длины int
с.Внешний массив не знает, насколько велики его элементы (внутренние массивы), и поэтому не знает, как перемещаться по ним в памяти.Вам необходимо указать размер внутренних массивов:
void inc_all(int myarray[][10]);
в этот момент ваш код, вероятно, не будет таким общим, как вы надеялись.
Если вы используете vector
песок vector
s из vectors
s, эти проблемы возникают не потому, что vector
Они сами знают, сколько у них членов, и носят эту информацию с собой.
Если вы все еще хотите узнать больше о массивах и указателях, я рекомендую раздел 6 FAQ по comp.lang.c.
Я думаю, вам следует в первую очередь использовать константы.Вы можете передать как указатель значения, так и ссылку на указатель (оба 4 байта), а также это указатель на память (он имеет значение).
#include <iostream>
using namespace std;
const int puzzle_width = 9;
const int puzzle_height = 9;
void readAPuzzle(int grid[puzzle_height][puzzle_width])
{
for(int i = 0; i < puzzle_height; i++)
for(int j = 0; j < puzzle_width; j++)
cin >> grid[i][j];
}
int main()
{
int grid[puzzle_height][puzzle_width];//I think your need to do this
readAPuzzle(grid);
}