PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ - Matrizen


BofD
2004-09-09, 18:24:28
Hi,
ich habe folgendes Problem. Mein Programm soll eine Matrix unbekanner Größe verarbeiten. Ich habe also die Matrix folgendermaßen initialisiert:
// Matrix anlegen und initialisieren
bool **matrix;
matrix = new bool*[anzahl];
for(int i = 0; i < anzahl; i++)
{
matrix[i] = new bool[anzahl];
for(int j = 0; j < anzahl; j++)
matrix[i][j] = false;
}
wobei die Variable anzahl die größe festlegt. Wie ihr seht kommt dabei eine Matrix mit "Höhe" und "Breite" = anzahl raus. Bis dahin klappt alles gut, ich kann Daten in die Matrix schreiben aber wenn ich die Matrix auf dem Bildschirm ausgeben will gibts Probleme. Code:
// Matrix ausgeben
for (int i = 0; i < anzahl; i++)
{
for (int j = 0; j < anzahl; j++)
cout<<matrix[i][j]<<" ";
cout<<"\n"<<endl;
}
}
Resultat ist, dass zwei Zeilen richtig ausgegeben werden und dann kommt eine Fehlermeldung von wegen Zugriffsverletzung beim Lesen ...

Was ist falsch an meinem Code?
- Breath of Death

*edit* ein verschlucktes "[i]" eingefügt

antigonos
2004-09-09, 18:49:57
Also ich habe es mir nur mal kurz angeschaut, aber müsste es beim Erzeugen statt:

matrix = new bool[anzahl];

nicht

matrix[i] = new bool[anzahl];

heißen? Vielleicht hast du es ja auch schon gefunden :wink:

BofD
2004-09-09, 18:53:01
ups, da steht auch das [i] aber der vbcode hat das wohl irgendwie "verstekt". mal kurz ändern

antigonos
2004-09-09, 19:15:21
Dann fällt mir auch erstmal nichts mehr ein. Schon mal in den Debugger geschaut? Dann siehst du ja, ob die Struktur kaputt ist oder ob die Ausgabe nicht will.

D-Swat
2004-09-09, 19:15:42
Sicher, das das Problem in diesem Code Abschnitt entsteht?
Ich hab den Code von dir grade mal getestet und er funktioniert ohne Probleme.
(Visual Studio .NET 2003 )

Tom Servo
2004-09-09, 19:18:53
Nur mal so geraten (bin aus C++ irgendwie total raus):

cout << (matrix[i]) [j]

edit:
Das ist es wohl nicht. Das Problem ist, dass der Code offenbar gar keinen Fehler hat (siehe unten). Denke mal, dass du da beim Ausdrucken einen falschen Pointer benutzt. Ist wahrscheinlich zu kompliziert geschrieben.


#include <iostream>
using namespace std;

const int anzahl = 3;

typedef int matrix_type;
#define matrix_value(n, m) ((n) * (m))

void f()
{
// Matrix anlegen und initialisieren
int **matrix;
matrix = new matrix_type*[anzahl];

for(int i = 0; i < anzahl; i++)
{
matrix[i] = new matrix_type[anzahl];
for(int j = 0; j < anzahl; j++)
matrix[i][j] = matrix_value(i, j);
}

// Matrix ausgeben
for (int i = 0; i < anzahl; i++)
{
for (int j = 0; j < anzahl; j++)
cout<<matrix[i][j] << " ";
cout<<"\n"<<endl;
}
}

int main()
{
f();
}


Ausgabe:


$ ./test14.exe
0 0 0

0 1 2

0 2 4

BofD
2004-09-09, 20:25:24
Ok, der Fehler scheint wirklich nicht an dieser Stelle zu sein. Nur an dieser Stelle, also bei der Ausgabe, kam immer die Fehlermeldung. Dann mal gucken * denk * hmm.. die Änderung der Matrix birgt einige Fehlerquellen. Hier mal der Code:

char zeile[20];
for(int i = 0; i < anzahl; i++)
{
strcpy(zeile, " ");
datei.getline(zeile, 20);
{
int j=3;
while(zeile[j] != ' ')
{
matrix[zeile[0] - 97][zeile[j]-97] = true;
j++;
}
}
}
Die Zeilen in der Datei sehen immer so aus: "a->bcf" oder "c->fg". Diese Zeilen stellen Beziehungen in einem Netz dar. Die erste Zeile soll heißen "Knoten A hat eine gemeinsame Kante(Verbindung) mit Knoten B, C und F". Diese Verbindungen will ich in der Matrix speichern. Ein "true" in matrix[0][1] soll dann symbolisieren, dass eine Verbindung zwischen A und B besteht.

Es ist in gewisser Weise "wahrscheinlich", dass der Fehler in der Zeile "matrix[zeile[0] - 97][zeile[j]-97] = true;" steckt. Zur Erläuterung: 97 ist der ascii-Wert von "a". Ist nen bissel kompliziert aber ich hoffe es ist klar worum es geht.

D-Swat
2004-09-09, 20:37:12
Du schreibst über den gültigen Speicherbereich hinaus.
while(zeile[j] != ' ') läuft solange, bis irgendwo eine Speicherstellen ungleich ' ' kommt.
Dies muss nicht Zwansläufig bei zeile[19] sein.

Edit:
Bei deinem Code bekomm ich eine Speicherverletzung.
Bei folgendem funktioniert es jedoch.


char zeile[7] = "a->bcd";
for( int i = 0; i < anzahl; ++i )
{
int posX = zeile[0] - 97;
for( int j = 3; j < strlen(zeile); ++j )
{
int posY = zeile[j] - 97;
matrix[posX][posY] = true;
}
}


(zeile[7] hab ich so gemacht, weil ich net extra ne datei anlegen wollte)

BofD
2004-09-10, 16:59:46
So funktioniert jetzt. War letztlich nur ne falsche Klammerung. Aber trotzdem DANKE fürs Helfen.