unerklärlicher Rogrammabsturz in Zusammenhang mit 2dim dyn. Array & Dateioperation
-
Hallo,
ich habe ein riesiges Problem und hoffe, hr könnt mir dabei helfen.
ich muss etwas ausholen:
Ich programmiere mit Dev-C++ 4.9.9.2
dort habe ich als Projekt eine C Konsolenanwendung ausgewählt.
zu Beginn des Programms lese ich Zeichen aus einer Textdatei ein, die sog. Tupeln (x,y) zugeordnet werden sollen. Die Textdatei sieht z.B. so aus:2 3 4 1 2
Das bedeutet dann, dass ich 2 Tupel hab: (3,4) und (1,2).
Mein programm erstellt ein 2-dimensionales dynamisches Integer Array:liste = (int **)malloc(anzahl * sizeof(int)); for(i = 0; i < 2; i++) { liste[i] = (int *)malloc(2 * sizeof(int)); }
soweit alles ok.
ich kann auch alle Zeichen der Datei dem Array zuordnen:// ZUWEISUNG for (i = 0; i < anzahl; i++) { zahl1 = strtol(restfehler, &restfehler, 10); zahl2 = strtol(restfehler, &restfehler, 10); printf("%i. Tupel: ( %d | %d ) \n", i, zahl1, zahl2); liste[0][i] = zahl1; liste[1][i] = zahl2; printf("%i. Tupel: ( %d | %d ) \n", i, liste[0][i], liste[1][i]); }
Die Zeilen "zahl1 = strtol(restfehler, &restfehler, 10);" bedeuten dabei, daß eine Umwandlung der eingelesenen Zeichen nach Integer erfolgt, sodass sie im Integer-Array gespeichert werden können.
Funktioniert soweit auch alles.Jetzt kommt aber der Haken:
nach diesem Programmaschnitt folgt folgender Code:// KOPIEREN eingabedatei = fopen ("liste.ein", "rb"); ausgabedatei = fopen ("liste.aus", "wb"); while ((z = fgetc(eingabedatei)) != EOF) { fputc(z, ausgabedatei); } fclose(eingabedatei); fclose(ausgabedatei);
ein Programm stürzt genau bei
fputc(z, ausgabedatei);
ab.
Steht der Kopiernen-Block VOR dem Zuweiungs-Block gehts gut. Aber ich brauch den Kopieren-Block definitiv danach!
Noch eine Beobachtung:
Das Programm stürzt nicht ab (auch in meiner gewollten Reihenfolge), wenn ich im Zuweisungsblock stattliste[0][i] = zahl1; liste[1][i] = zahl2;
folgendes schreibe
liste[0][0] = zahl1; liste[1][0] = zahl2;
aber das macht ja leider wenig Sinn.
Vielleicht ist es aber eine Hilfe für Euch...Würde mich über Antworten sehr freuen, da ich das Programm schon morgen abben muss.
Danke
-
Es geht mit Null im Index, aber nicht mit i.
Ich tippe darauf, daß i zu groß geworden ist.liste = (int **)malloc(anzahl * sizeof(int));
malloc gibt an sich Zeiger zurück, und nicht Zeiger auf Zeiger.
Wenn dir die Zeile keine Warnung beim Compilen ergibt, dann muß
das daran liegen, daß du liste als *int *** festgelegt hast.
(Hast du doch, oder?)Mehrdimensionale Arrays sind in C, wenn ich mich recht erinnere,
auch nur mehrere 1d-Arrays nacheinander.Der Fehler liegt dann wahrscheinlich daran, daß du im letzen Schleifendurchlauf
liste[1] mit anzahl - 1 indizierst.Ich hab leider gerade keinen Compiler zur Hand, aber liste[1][i]
sieht riskant aus, weil die Dimension des ersten Index nicht feststeht
(und die wäre ein konstanter Faktor, wenn die 1d-Arrays nacheinander kämen).However, es ist spät nachts, ich hab keine Ahnung und ich bin wahrscheinlich
der letzte, der das noch liest.
Lösungsvorschlag: alloziere einfach zwei separate 1d-Arrays, damit hast
du das Problem umschifft.