题
如果我有以下 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
s。外部数组不知道其成员(内部数组)有多大,因此不知道如何在内存中逐步遍历它们。您需要指定内部数组的大小:
void inc_all(int myarray[][10]);
此时您的代码可能并不像您希望的那样通用。
如果你使用 vector
沙 vector
的 vectors
s,这些问题不会出现,因为 vector
他们自己知道他们有多少成员并随身携带该信息。
如果您仍然想了解有关数组和指针的更多信息,我推荐 comp.lang.c 常见问题解答第 6 部分.
我觉得你应该先全部使用常量。可以传递为值指针以及指针上REF(4字节两者),还是在存储器中的指针(它是valueble)。
#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);
}