Dynamische Speicherverwaltung, Wer kann helfen!



  • Nachfolgendes kleines Programm habe ich einer Kurs-Unterlage entnommen.
    Es sollen Zeilen eingegeben und dynamisch Speicher geschaffen werden.
    Die Zeilen sollen gespeichert und in umgekehrter Reihenfolge ausgegeben werden.
    Problem: Der Eingabeteil verläßt die while-Schleife nicht.
    Wie kann das Erreichen von EOF (wird benötigt um Schleife zu verlassen, Rückgabewert von fgets=0)realisiert werden.
    z.B. Verlassen der Schleife bei 2x Enter.
    Was wird mit

    FILE *fpr ;
    

    erreicht

    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    #include <stdlib.h>
    
    void main(int argc , char *argv[]) 
    /* Ausgabe der Zeilen in umgekehrter Reihenfolge  */
    {
    	char *pvek[10000];
        char line[512];
    	FILE *fpr ;
        int i;
    
        i=0;
    	while((fgets(line,512,stdin)) != NULL)    
    	{
    		pvek[i] = (char*)malloc((unsigned) strlen(line));
            if(pvek[i] == NULL) 
    		{
    			perror("malloc - no memory:");
                exit(1);
            }
            strcpy(pvek[i],line);
            i++;
    	}
    	while(--i >= 0) 
    	{
           printf("%s",pvek[i]);
           free(pvek[i]);
        }
    return ;
    }
    


  • Du willst, dass die Schleife abgebrochen wird, wenn man 2mal Enter drückt?

    das ist kein Problem: denn bei 2x Enter drücken bekommt fgets() eine leere Zeile.

    leere Zeile bedeutet, dass line[0]=='\n' ist

    damit sollte das Problem lösbar sein...

    kleiner Tip:
    statt while(--i >= 0)
    kann man
    while(i--)
    schreiben

    weiters ist pvek nicht besonders schön - eleganter wäre es, wenn du mittels realloc() den speicher immer passend vergößern würdest - da nur Zeiger kopiert werden würden, wäre es auch kaum langsamer als deine jetztige variante.



  • Erst mal Vielen Dank,
    bin aber nicht viel weiter gekommen:
    ich frage in der Schleife ab:

    if (line[0]=='\n')
    	break;
    

    d.h. bei 2x Enter komme ich aus der Schleife.

    Aber das nächste Problem kommt bei der Ausgabe.
    beim Befehl

    free(pvek[i]);
    

    kommt eine Fehlermeldung, die ich nicht deuten kann.

    Aber nochmal zum Ursprungsprogramm:

    Kann bei diesem Programm durch die Befehlszeile:

    while((fgets(line,512,stdin)) != NULL)
    

    Überhaupt ein Schleifenabbruch erreicht werden, oder geht das nur mit 2x Enter und einer zusätzlichen Abfrage.

    Vielen Dank im voraus



  • Ulbricht schrieb:

    Kann bei diesem Programm durch die Befehlszeile:

    while((fgets(line,512,stdin)) != NULL)
    

    Überhaupt ein Schleifenabbruch erreicht werden, oder geht das nur mit 2x Enter und einer zusätzlichen Abfrage.

    Ja, allerdings nur wenn ein EOF gesendet wird.

    Ich bin mir jetzt nicht sicher, aber ich glaube ein STRG+C sendet (unter DOS) ein EOF

    wobei ich mich da jetzt nicht festlegen will.

    nur soviel: mit einer bestimmten tastenkombination kann man EOF senden.
    insofern ist auf EOF prüfen beim lesen von stdin nicht immer ausreichend - denn schliesslich soll der user ja auch ohne EOF aufhören können zu schreiben.

    deshalb wird öfters ein 'endzeichen' verwendet. zB ;
    wenn der user dann irgendwo ; eingibt, bedeutet dies, dass er fertig mit der eingabe ist...



  • In nachfolgendem Programm:

    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    #include <stdlib.h>
    #include <iostream.h>
    
    void main(int argc , char *argv[]) /* Ausgabe der Zeilen in umgekehrter Reihenfolge  */
    {
    
    	char *pvek[10000];
        char line[512];
    	FILE *fpr =0;
        int i;
    	int j = 0;
        i=0;
    
    while((fgets(line,512,stdin)) != NULL)    
    	{
    		pvek[i] = (char*)malloc( strlen(line));
    	    if(pvek[i] == NULL) 
    		{
    			perror("malloc - no memory:");
                exit(1);
            }
            strcpy(pvek[i],line);
            i++;
            if (line[0]=='\n')
    			break;
    
    		}
    
    	while(--i >= 0) 
    	{
    		printf("%s",pvek[i]);
            free(pvek[i]);
    	}
    
    return ;
    }
    

    funktioniert die Speicherfreigabe nicht. Beim Ausführen gibt es folgende Fehlermeldung:
    DAMAGE: after Normal block(#49) at 0x002f0818.

    Es ist auch nicht möglich einzelne Speicherbereiche freizugeben.
    z.B.

    free(pvek[2]);
    

    Wer kann helfen?

    Vielen Dank im voraus



  • mach mal
    malloc(strlen(line)+1)

    denn du musst das 0 Zeichen am Ende noch beachten.



  • Vielen Dank,
    die Idee war gut,
    aber der Fehler muß noch woanders liegen.
    Irgendwie läßt sich der indizierte Speicherbereich

    pvek[i]

    nicht freigeben.

    Vielleicht kann sich nochmal jemand Gedanken machen.



  • Vielen Dank, es funktioniert.
    Ich hatte irgendwie eine Klammer verkehrt gesetzt.
    mfG
    Ulbricht


Anmelden zum Antworten