Como posso converter a seguinte função java em C++?
Pergunta
Se eu tiver o seguinte código 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();
}
Como posso converter isso para C++?Eu fico preso em passar o array.Aqui está minha tentativa:
#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);
}
O que estou fazendo de errado em geral?
Solução
Você precisa ler no texto de entrada em sua matriz grid
e passe adiante.
grid[i][j] = cin >> grid[i][j];
Não faz o que você acha que faz, tenta atribuir um objeto do tipo istream
para grid[ i ][ j ]
cin >> grid[i][j];
No entanto, é suficiente.
Além disso, observe em C ++ as dimensões seguem o identificador como em:
int grid[9][9];
Outras dicas
Tentar
#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);
}
Em geral, as matrizes são passadas automaticamente por referência, e os tamanhos das matrizes vão após o nome da matriz, não após o tipo.
E se você declarou constantes, sempre deve usar o Puzzle_width e o Puzzle_Height (talvez reduza seus nomes) e não números mágicos como 9.
A resposta simples é usar vector
s em vez de matrizes. As regras de C ++ para passar as matrizes como parâmetros de função são esotéricas e derivadas de C. Aqui estão alguns dos problemas:
- Você não pode usar matrizes por muito tempo sem entender e usar ponteiros
A assinatura da matriz é a assinatura do ponteiro. As matrizes são acessadas usando aritmética do ponteiro. Matrizes como parâmetros de função são realmente ponteiros disfarçados.
- As funções não obtêm informações sobre o tamanho da matriz ao fazer um argumento de matriz
Considere a declaração:
void inc_all(int myarray[]); /* increments each member of the array */
Infelizmente, esse parâmetro de matriz não é um parâmetro de matriz! Na verdade, é um parâmetro de ponteiro:
void inc_all(int *myarray); /* Exactly the same thing! */
E um ponteiro não sabe quantos itens estão na sequência em que aponta. Como resultado, essa função não pode ter as informações necessárias para saber quando a matriz para. Você precisa passar o comprimento:
void inc_all(int *myarray, size_t len); /* size_t rather than int */
Ou você precisa usar um valor Sentinel para marcar o final da matriz. De qualquer maneira, uma matriz não é um tipo de dados encapsulado independente como um vector
é.
- Você não pode passar por uma matriz bidimensional de tamanho arbitrariamente para uma função
Se você tentar criar uma função que faça uma matriz bidimensional:
void inc_all(int myarray[][]); /* XXX won't compile! */
não vai compilar. O problema é que você tem uma matriz de comprimento indeterminada de matrizes de comprimento indeterminado de int
s. A matriz externa não sabe o tamanho de seus membros (as matrizes internas) e, portanto, não sabe como passar por eles na memória. Você precisa especificar o tamanho das matrizes internas:
void inc_all(int myarray[][10]);
Nesse ponto, seu código provavelmente não é tão geral quanto você esperava que fosse.
Se você usar vector
areia vector
s de vectors
s, esses problemas não surgem porque o vector
S eles mesmos sabem quantos membros eles têm e carregam essas informações com eles.
Se você ainda quiser aprender mais sobre matrizes e ponteiros, eu recomendo Seção 6 do Comp.lang.c FAQ.
Eu acho que você deveria usar suas constantes antes de tudo.Você pode passar como ponteiro de valor, bem como ref no ponteiro (ambos de 4 bytes), também é um ponteiro na memória (é valioso).
#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);
}