如何将以下java函数转换为C ++?

时间:2010-02-26 20:43:22

标签: 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);
}

我一般做错了什么?

4 个答案:

答案 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]);

此时您的代码可能不像您希望的那样通用。

如果您使用vectorvector的{​​{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);
}