如果我有以下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);
}
我一般做错了什么?
答案 0 :(得分:5)
您需要将输入文本读入数组grid
并将其传递给它。
grid[i][j] = cin >> grid[i][j];
不执行您认为的操作,它会尝试将istream
类型的对象分配给grid[ i ][ j ]
cin >> grid[i][j];
然而,足够了。
另外,请注意,在C ++中,维度遵循标识符:
int grid[9][9];
答案 1 :(得分:2)
尝试
#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这样的幻数。
答案 2 :(得分:2)
简单的答案是使用vector
而不是数组。 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 */
或者您需要使用sentinel值来标记数组的结尾。无论哪种方式,数组都不是像vector
那样的自包含封装数据类型。
如果您尝试创建一个采用二维数组的函数:
void inc_all(int myarray[][]); /* XXX won't compile! */
它不会编译。问题是你有一个不确定长度数组int
s的不确定长度数组。外部数组不知道其成员(内部数组)有多大,因此不知道如何在内存中单步执行它们。您需要指定内部数组的大小:
void inc_all(int myarray[][10]);
此时您的代码可能不像您希望的那样通用。
如果您使用vector
和vector
的{{1}} s,则不会出现这些问题,因为vectors
他们自己知道他们拥有多少成员并携带与他们的信息。
如果您仍想了解有关数组和指针的更多信息,我建议section 6 of the comp.lang.c FAQ。
答案 3 :(得分:0)
我认为你应该首先使用你的常数。你可以传递值指针和ref指针(两个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);
}