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?

Foi útil?

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 vectors 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 ints. 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 vectorareia vectors de vectorss, esses problemas não surgem porque o vectorS 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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top