Domanda

Se ho il seguente codice 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();
}

Come posso convertire questo per C ++? Io ti appeso sul passare l'array. Qui è il mio tentativo:

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

Che cosa sto facendo di sbagliato in generale?

È stato utile?

Soluzione

Hai bisogno di leggere nel testo di input nel vostro grid array e trasmetterla.

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

non fa quello che pensi lo fa, cerca di assegnare un oggetto di tipo istream a grid[ i ][ j ]

cin >> grid[i][j]; 

tuttavia è sufficiente.

Inoltre, nota in C ++ le dimensioni seguono l'identificatore come in:

int grid[9][9];

Altri suggerimenti

Prova

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

In generale, gli array vengono automaticamente passati per riferimento, e le dimensioni di matrice andare dopo il nome della matrice non dopo il loro tipo.

E se avete dichiarato costanti, è necessario utilizzare sempre puzzle_width e puzzle_height (forse accorciare i loro nomi però) e numeri non magici come 9.

La risposta più semplice è quello di utilizzare vectors invece di array. regole C ++ 's per gli array di passaggio come parametri di funzione sono esoterica e derivato da C. Qui ci sono alcuni dei problemi:

  • Non è possibile utilizzare le matrici a lungo senza la comprensione e l'utilizzo di puntatori

Array subscripting è puntatore subscripting. Gli array sono accessibili usando l'aritmetica dei puntatori. Array come parametri di funzione sono in realtà puntatori in incognito.

  • Funzioni non ottengono informazioni sulla dimensione della matrice durante l'assunzione di un argomento array

Si consideri la dichiarazione:

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

Purtroppo, che il parametro di matrice non è un parametro array! In realtà è un parametro pointer:

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

E un puntatore non sa quanti articoli sono nella sequenza che punti a. Come risultato di questa funzione non può avere le informazioni necessarie per sapere quando la matrice si arresta. Si sia necessario passare la lunghezza:

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

o è necessario utilizzare un valore sentinella per segnare la fine della matrice. In entrambi i casi, una matrice non è un tipo di dati incapsulato indipendente come un vector è.

  • non può superare un arbitrariamente dimensioni array bidimensionale ad una funzione

Se si tenta di creare una funzione che prende un array bidimensionale:

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

non si compila. Il problema è che hai una serie lunghezza indeterminata di array di lunghezza indeterminata ints. La matrice esterno non sa gran suoi membri (gli array interni) sono e quindi non sa come al passaggio attraverso di loro in memoria. È necessario specificare la dimensione delle matrici interne:

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

a questo punto il codice non è probabilmente così generale come speravate che stava per essere.

Se si utilizza vectors e vectors di vectorss, questi problemi non sorgono perché gli stessi vectors sapere quanti membri hanno e portare le informazioni con loro.

Se si vuole ancora saperne di più su vettori e puntatori vi consiglio la sezione 6 del comp. lang.c FAQ .

Credo che la vostra dovrebbe usare i vostri costanti prima di tutto. È possibile passare come indice del valore nonché ref sul puntatore (entrambi 4bytes), inoltre è un puntatore sulla memoria (è 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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top