Frage

Wenn ich habe den folgenden Java-code:

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

Wie konvertiere ich dies in C++?I get hung up on passing the array.Hier ist mein Versuch:

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

Was mache ich falsch im Allgemeinen?

War es hilfreich?

Lösung

Sie müssen in dem Eingabetext in Ihrem Array grid lesen und weitergeben.

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

Ist das nicht, was Sie denken, es tut, wird versucht, ein Objekt vom Typ istream zu grid[ i ][ j ]

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

jedoch genügt.

Beachten Sie auch, in C ++ die Dimensionen folgen der Kennung wie in:

int grid[9][9];

Andere Tipps

Versuchen

#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 der Regel werden Arrays automatisch als Referenz übergeben und Array-Größen gehen nach dem Namen des Arrays nicht nach ihrer Art.

Und wenn Sie Konstanten erklärt, sollten Sie immer puzzle_width und puzzle_height (vielleicht ihre Namen verkürzen obwohl) und nicht die magischen Zahlen wie 9.

Die Antwort ist ganz einfach verwenden, vectors anstelle von arrays.C++'s Regeln für die übergabe von arrays als Parameter der Funktion sind esoterischen und stammen von C.Hier sind einige der Fragen:

  • Sie können keine arrays verwenden für lange Zeit ohne Verständnis und mit Zeigern

Array subscripting ist Zeiger subscripting.Arrays zugegriffen werden, mithilfe von Zeiger-Arithmetik.Arrays als Parameter der Funktion sind eigentlich Zeiger in Verkleidung.

  • Funktionen, die nicht bekommen, Informationen über die array-Größe, wenn man einen array-argument

Betrachten Sie die Erklärung:

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

Leider array-parameter ist kein array-parameter!Es ist eigentlich ein Zeiger-parameter:

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

Und ein Zeiger nicht wissen, wie viele Elemente in der Reihenfolge zeigt es an.Als Ergebnis dieser Funktion können Sie nicht über die erforderlichen Informationen, um zu wissen, Wann das array gestoppt.Sie müssen entweder übergeben Sie die Länge:

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

oder Sie brauchen, um einen sentinel-Wert zu markieren das Ende der Reihe.Entweder Weg, ein array ist nicht eine selbst-enthalten, eingekapselt wie ein Datentyp vector ist.

  • Sie können sich nicht über eine beliebig große zwei-dimensionales array an eine Funktion

Wenn Sie versuchen, erstellen Sie eine Funktion, die ein zwei-dimensionales array:

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

es wird nicht kompiliert.Das problem ist, Sie haben eine unbestimmte Reihe von unbestimmter Länge von arrays inten.Das äußere array nicht weiß, wie groß seine Mitglieder (die inneren arrays) sind und daher nicht wissen, wie Sie Schritt durch Sie im Gedächtnis.Müssen Sie die Größe des inneren arrays:

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

an welcher Stelle Ihr code ist wahrscheinlich nicht so allgemein wie Sie gehofft hatten, es würde zu sein.

Wenn Sie vectors und vectors vectorss, diese Probleme entstehen nicht, weil die vectors selbst wissen, wie viele Mitglieder Sie haben und tragen diese Informationen mit Ihnen.

Wenn Sie noch mehr darüber erfahren möchten, arrays und Verweise, die ich empfehlen § 6 comp.lang.c FAQ.

Ich denke, Ihr sollte Ihre Konstanten verwenden, in erster Linie. Sie können als Wertzeiger sowie ref auf Zeiger übergeben (beide 4bytes), auch er ist ein Zeiger auf Speicher (es valueble ist).

#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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top