Pregunta

Si tengo el siguiente 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();
}

¿Cómo puedo convertir esto en C ++? Yo se colgó en que pasa la matriz. Aquí está mi intento:

#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);
}

¿Qué estoy haciendo mal en general?

¿Fue útil?

Solución

Es necesario leer en el texto de entrada en la matriz grid y transmitirlo.

grid[i][j] = cin >> grid[i][j];

no hace lo que usted cree, que trata de asignar un objeto de tipo istream a grid[ i ][ j ]

cin >> grid[i][j]; 

Sin embargo es suficiente.

También, nota en C ++ las dimensiones siga el identificador como en:

int grid[9][9];

Otros consejos

Trate

#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);
}

En general, las matrices se pasan automáticamente por referencia, y tamaños de matriz ir después el nombre de la matriz no después de su tipo.

Y si usted declaró constantes, se debe utilizar siempre puzzle_width y puzzle_height (tal vez acortar sus nombres y números, aunque) no mágicos como 9.

La respuesta simple es vectors usar en lugar de matrices. reglas C ++ 's para pasar matrices como parámetros de la función son esotéricos y derivado de C. Éstos son algunos de los temas:

  • No se pueden utilizar matrices de tiempo sin entender y utilizar punteros

subíndice de matriz es subscripting puntero. Las matrices se accede utilizando la aritmética de punteros. Matrices como parámetros de la función son en realidad punteros en el encubrimiento.

  • Funciones no reciben información sobre tamaño de la matriz cuando se toma un argumento de matriz

Considere la declaración:

void inc_all(int myarray[]); /* increments each member of the array */

Por desgracia, ese parámetro array no es un parámetro indexado! En realidad es un parámetro de puntero:

void inc_all(int *myarray); /* Exactly the same thing! */

Y un puntero no sabe cuántos elementos hay en la secuencia que apunta a. Como resultado de esta función no puede tener la información necesaria para saber cuando la matriz se detiene. O hay que hacer pasar la longitud:

void inc_all(int *myarray, size_t len); /* size_t rather than int */

o si necesita usar un valor centinela para marcar el final de la matriz. De cualquier manera, una matriz no es un tipo de datos encapsulados autónomo como un vector es.

  • No se puede pasar una matriz de dos dimensiones arbitrariamente de tamaño a una función

Si intenta crear una función que toma una matriz de dos dimensiones:

void inc_all(int myarray[][]); /* XXX won't compile! */

que no se compilará. El problema es que hay una matriz de longitud indeterminada de matrices de longitud indeterminada de ints. La matriz exterior no sabe cómo grande sus miembros (las matrices internas) son y por lo tanto no sabe cómo al paso a través de ellos en la memoria. Es necesario especificar el tamaño de las matrices internas:

void inc_all(int myarray[][10]);

momento en el cual el código probablemente no es tan general como usted esperaba que iba a ser.

Si utiliza vectors y vectors de vectorss, no se plantean estos problemas porque los propios vectors saber cuántos miembros que tienen y llevar esa información con ellos.

Si aún desea obtener más información sobre matrices y punteros recomiendo 6 del borrador. lang.c FAQ .

Creo que no debes utilizar sus constantes en primer lugar. Puede pasar como puntero de valor, así como en la ref puntero (ambos 4bytes), también es un puntero en la memoria (es 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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top