matrix ist vom Typ "char**". Matrix ist also ein pointer auf pointer auf char. malloc() gibt zwar void* zurück, aber wenn ich hier explizit auf (char**) caste, heist, dass, dass ich mir hier Gedanken gemacht habe, was ich hier eigentlich von malloc will.Duff hat geschrieben:Kannst du mir diese Zeile mal erklären?schorsch_76 hat geschrieben: EDIT:
Zeile 28: matrix=(char**)malloc(zeile * sizeof(int *));
Wie viele Zeilen willst du den reservieren? Hier ist zeile noch 0. Oder schlimmer: Irgendein grosser Wert. Initialisiere immer erst deine Variablen.
(Vorallem, warum ich char** schreiben muss. Danke.
Wenn du den gdb startest und an der stelle von malloc einen breakpoint setzt, dann ein "inspect zeile" dort machst, wirst du sehen, dass im Debugbuild zeile noch 0 ist. ABER: Im Releasebuild ist das nicht garantiert. Also sollte man bei der Deklarationd er Varaible diese immer initialisieren.
Du kannst das ganze auf verschiedene Arten anpacken.Duff hat geschrieben:Dass mit den Zeilen verstehe ich noch.schorsch_76 hat geschrieben: EDIT2:
Vermutlich bist du beim ermitteln der Zeilen/Spalten etwas unsicher gewesen oder weist nicht wie man das macht. Deshalb hier mein Beispiel für dich:Code: Alles auswählen
// Ermittle Anzahl der Zeilen / maximale anzahl der spalten char c = 0; j = 0; while ((c = fgetc(f)) != EOF) { // zeile if (c=='\n') { j = 0; zeile++; } if (j > spalte) { spalte = j; } j++; } fseek(f,0,SEEK_SET); // Setze filepointer auf begin
Aber wie meinst du das mit den Spalten?
Die Spalten sollen doch als char Array gespeichert werden, oder zähle ich so die Anzahl der Elemente und muss im Array noch das abschließende Terminierungszeichen '\0' anhängen?
Sorry für die vielen Fragen, aber habe noch nicht so ganz den Durchblick!
Hoffe, dass dies bald kommt...
a) Mein Ansatz:
Hier ermittle ich erst die Anzahl der Zeilen und gleichzeitig die maximale Anzahl der Spalten (j). Dadurch kann ich beim malloc() für die jeweilige neue Spalte sicher sein, dass ich genug RAM reserviert habe. Kein Bedarf für realloc, ABER mehr Speicherverbrauch.
b) Weitere Möglichkeit: Gleichzeitiges Lesen aus dem File und reservieren des benötigten Speichers für die Zeile:
Lass das mit der Maximalen Anzahl der Spalten weg. Reserviere beim Erzeugen der jeweiligen Spalte char[100]. List du jetzt bsp. das 101 Zeichen einer Zeile, machst du ein realloc() mit bsp 200 bytes und liest danach weiter. Vorteil: Weniger Speicherverbrauch als die Variante a) aber mehr Programmieraufwand.
Das mit den Fragen ist kein Problem Deshalb nennt man das hier ja auch Forum
In C++ würde ich hier das folgende schreiben:Meillo hat geschrieben:
char** entspricht char[][].
Aber in C castet man die Rückgabe von malloc() üblicherweise nicht -- im Gegensatz zu C++.
Code: Alles auswählen
matrix = new char**[zeile];
Wäre die Variante mit malloc() ohne cast exakt dem Standard würde der gcc mit "gcc main.c -Wall" nicht eine warnung ausspucken
Gruß
schorsch