2 Stimmen

Fehler beim Füllen von Arrays

Ich kann nicht verstehen, was in meinem Programm falsch ist. Ich habe solche Eingabedaten:

01000
11110
01000

Ich möchte es in speichern: vector< vector<int> > matrix;

vector< vector<int> > fillMatrix(vector< vector<int> > matrix, int height, int width, ifstream &read)
{
    // Make 2d-array [matrix]
    matrix.resize(width);
    for (int i=0; i < width; ++i)
        matrix[i].resize(height);

    // Fill it up with data
    for (int i=0; i < height; ++i)
    {
        std::string tempLine;
        std::getline(read, tempLine);
        for (int j=0; j < tempLine.length(); ++j)
        {
            // This shows right information
            //std::cout << tempLine[j] << "  -  " << (int)(tempLine[j] - '0') << "\n";
            matrix[i][j] = (int)(tempLine[j] - '0');
        }
    }

    return matrix;
}

matrix = fillMatrix(matrix, 3, 5, ifstreamHandle);

Und nun die Funktion, die die Matrix anzeigt:

void showMatrix(vector< vector<int> > matrix, int width, int height)
{
    // Show the matrix
    for (int i=0; i < height; ++i)
    {
        for (int j=0; j < width; ++j)
        {
            std::cout << matrix[i][j];
        }
        std::cout << "\n";
    }
}

showMatrix(matrix, 5, 3);

Und das Ergebnis von showMatrix ist:

01000
11100
01000

In der zweiten Reihe fehlt eine "1". Was ist los?

3voto

Elalfer Punkte 5186

Zunächst einmal sind Sie in Ihrem Code nicht konsistent

for (int i=0; i < width; ++i)
...
for (int i=0; i < height; ++i)

Sie erstellen also eine Matrix wie matrix[i].resize(3) für i = 0..4 sondern schreiben Sie in sie mit matrix[i][j] donde i = 0..2 y j=0..4

3voto

moinudin Punkte 125641

Wenn Sie den Vektor initialisieren, haben Sie Breite und Höhe verkehrt herum. Wenn Sie später aus den letzten beiden Spalten lesen, werden die Ergebnisse undefiniert sein.

matrix.resize(width);
for (int i=0; i < width; ++i)
    matrix[i].resize(height);

sollte sein

matrix.resize(height);
for (int i=0; i < height; ++i)
    matrix[i].resize(width);

Ihr fillMatrix Funktion hat width y height in einer anderen Reihenfolge als in der, in der Sie sie später in showMatrix . Ich würde empfehlen, die Reihenfolge zu vertauschen fillMatrix um es gleich zu halten wie in showMatrix .

Achten Sie darauf, dass Sie jede Zeile bis zur tempLine.length , die größer sein kann als width was zu einer Ausnahme führen wird. Sie könnten auch einfach die Breite und Höhe aus dem Vektor in showMatrix anstatt diese als Argumente zu verwenden. Und wie @Charles sagt, sollten Sie den Vektor wirklich per Referenz übergeben, um zu vermeiden, dass eine Kopie erstellt wird. Das Vektorargument in fillMatrix ist derzeit ziemlich nutzlos, da man sie zurückgeben muss, es sei denn, man verwandelt sie in eine Referenz und macht die Funktion void .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X