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 statt

    liste[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.


Anmelden zum Antworten