Question

Si j'ai le code Java suivant:

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

Comment puis-je convertir en C ++? Je me raccroche au passage du tableau. Voici ma tentative:

#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'est-ce que je fais mal en général?

Était-ce utile?

La solution

Vous devez lire dans le texte d'entrée dans votre grid de tableau et de le transmettre.

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

Ne faites pas ce que vous pensez qu'il fait, il essaie d'assigner un objet de type istream à grid[ i ][ j ]

cin >> grid[i][j]; 

suffit cependant.

En outre, la note en C ++ les dimensions suivent l'identifiant comme dans:

int grid[9][9];

Autres conseils

Essayez

#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 général, les tableaux sont automatiquement passés par référence, et la taille des tableaux vont après le nom du tableau pas après leur type.

Et si vous déclarez des constantes, vous devez toujours utiliser puzzle_width et puzzle_height (peut-être raccourcir leur nom cependant) et non pas des nombres magiques comme 9.

La réponse est simple à utiliser vectors au lieu de tableaux. règles de C ++ pour les tableaux de passage en tant que paramètres de fonction sont ésotériques et dérivés de C. Voici quelques-unes des questions:

  • Vous ne pouvez pas utiliser des tableaux pour longtemps sans comprendre et utiliser des pointeurs

array est pointeur subscripting subscripting. Les tableaux sont accessibles en utilisant l'arithmétique de pointeur. Les tableaux en tant que paramètres de la fonction sont des pointeurs effectivement déguisé.

  • Fonctions ne reçoivent pas d'informations sur la taille du tableau en prenant un argument de tableau

Considérez la déclaration:

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

Malheureusement, ce paramètre de tableau n'est pas un paramètre de tableau! Il est en fait un paramètre de pointeur:

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

Et un pointeur ne sait pas combien d'articles sont dans l'ordre qu'il pointe vers. En conséquence, cette fonction ne peut pas avoir les informations nécessaires pour savoir quand l'arrête tableau. Soit vous devez passer la longueur:

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

ou vous devez utiliser une valeur sentinelle pour marquer la fin du tableau. De toute façon, un tableau est pas un type encapsulé autonome comme un vector est.

  • Vous ne pouvez pas passer un tableau à deux dimensions arbitrairement de taille à une fonction

Si vous essayez de créer une fonction qui prend un tableau à deux dimensions:

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

il ne compilera pas. Le problème est que vous avez un tableau de longueur indéterminée de tableaux de durée indéterminée de ints. Le tableau extérieur ne sait pas grand ses membres (les tableaux internes) sont et ne savent donc pas comment faire défiler les en mémoire. Vous devez spécifier la taille des tableaux internes:

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

à quel point votre code est probablement pas aussi général que vous espériez que ça allait être.

Si vous utilisez vectors et vectors de vectorss, ces problèmes ne se posent pas parce que les vectors savent eux-mêmes combien de membres qu'ils ont et porter cette information avec eux.

Si vous voulez en savoir encore plus sur les tableaux et les pointeurs que je recommande article 6 de la maquette. lang.c FAQ .

Je pense que votre devrait utiliser vos constantes d'abord. Vous pouvez passer comme pointeur de valeur ainsi que sur ref pointeur (les deux 4bytes), il est aussi un pointeur sur la mémoire (il est 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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top