Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Doppel Array speicher freigeben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
28.04.2006, 20:33 Uhr
Frido



Wie kann ich den Speicher von einem doppel array wider freigeben?
Mein Ansatz war:



Code:
for(i = 0; i <= Tage; i++){
        free(Temperatur[i]);
    }
    free(Temperatur);



kriege aber einen ERROR
--
http://spielwelt14.monstersgame.net/?ac=vid&vid=28103555
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.04.2006, 20:47 Uhr
Frido



Hier ist nochmal der Gesammte Code
Problem ist eben ich kann den Speicher unten nicht mehr Freikriegen und bekomm ein Debug error


Code:
/**Bibliotheken**********************************/
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
/***********************************************/
# define MAX_TEMP 3


/**Funktion main.c******************************/
int main(int argc, char *argv[]){

    double *Luftdruck;
    double **Temperatur;
    int Tage, zusatz;
    char Zeichen;
    int i,u;
    double mittel_Temp = 0;
    double mittel_LD = 0;

    printf("Wieviele Tage einlesen: ");
    scanf("%i",&Tage);
    fflush(stdin);

    Luftdruck = (double*)malloc(Tage * sizeof(double));
    if (Luftdruck == NULL){
        printf("ERROR. Kein Speicher fuer Luftdruck\n");
        exit(1);
    }
    Temperatur = (double**)malloc(Tage * sizeof(double*));
    if (Temperatur == NULL){
            printf("ERROR. Kein Speicher fuer Temperatur Tage\n");
            exit(1);
    }
    for(i = 0;i <= Tage; i++){
        Temperatur[i] = (double*)malloc(MAX_TEMP * sizeof(double));
        if (Temperatur[i] == NULL){
            printf("ERROR. Kein Speicher fuer Temperatur Werte\n");
            exit(1);
        }
    }
    for(i = 0; i <= Tage-1; i++){
        printf("Tag %i\n",i+1);
        for(u = 0; u <= 2; u++){
            printf("Temperatur %i: ",u+1);
            scanf("%lf",&Temperatur[i][u]);
            fflush(stdin);
        }
        printf("Luftdruck: ");
        scanf("%lf",&Luftdruck[i]);
        fflush(stdin);
    }

    printf("Druchschnittswert des Luftdrucks: ");
    for(i = 0; i <= Tage-1; i++){
        mittel_LD += Luftdruck[i];
    }
    mittel_LD = mittel_LD / Tage;
    printf("%lf\n",mittel_LD);

    printf("Durchschnittswert der Temperatur: ");
    for(i = 0; i <= Tage-1; i++){
        for(u = 0; u < 3; u++){
            mittel_Temp += Temperatur[i][u];
        }
    }
    mittel_Temp = mittel_Temp / (Tage * 3);
    printf("%lf\n",mittel_Temp);

//**Schleife*************************************

    printf("Neue Tage [J/N]: ");
    Zeichen = getc(stdin);

    if((Zeichen == 'J')||(Zeichen == 'j')){
        printf("Wieviel Tage zusätzlich: ");
        scanf("%i",&zusatz);
        fflush(stdin);


        Luftdruck = (double*)realloc(Luftdruck,_msize(Luftdruck)+zusatz * sizeof(double));
        if (Luftdruck == NULL){
            printf("ERROR. Kein Speicher fuer Luftdruck\n");
            exit(1);
        }
        Temperatur = (double**)realloc(Temperatur,_msize(Temperatur)+zusatz * sizeof(double*));
        if (Temperatur == NULL){
            printf("ERROR. Kein Speicher fuer Temperatur Tage\n");
            exit(1);
        }
        for(i = Tage ;i < (Tage + zusatz); i++){
            Temperatur[i] = (double*)realloc(Temperatur,_msize(Temperatur)+MAX_TEMP * sizeof(double));
            if (Temperatur[i] == NULL){
                printf("ERROR. Kein Speicher fuer Temperatur Werte\n");
                exit(1);
            }
        }
        for(i = Tage  ; i < (Tage + zusatz); i++){
            printf("Tage %i: \n",i);
            for(u = 0; u <= 2; u++){
                printf("Temperatur %i: ",u+1);
                scanf("%lf",&Temperatur[i][u]);
                fflush(stdin);
            }
            printf("Luftdruck: ");
            scanf("%lf",&Luftdruck[i]);
            fflush(stdin);
        }
        Tage += zusatz;

        mittel_LD = 0;
        mittel_Temp = 0;


        printf("Druchschnittswert des Luftdrucks: ");
        for(i = 0; i <= Tage-1; i++){
            mittel_LD += Luftdruck[i];
        }
        mittel_LD = mittel_LD /Tage;
        printf("%lf\n",mittel_LD);

        printf("Durchschnittswert der Temperatur: ");
        for(i = 0; i <= Tage-1; i++){
            for(u = 0; u < 3; u++){
                mittel_Temp += Temperatur[i][u];
            }
        }
        mittel_Temp = mittel_Temp / (Tage * 3);
        printf("%lf\n",mittel_Temp);
    }
    printf("Programm ENDE\n");
    

    free(Luftdruck);

    for(i = 0; i < Tage; i++){
        free(Temperatur[i]);
    }
    free(Temperatur);
    return(0);
}


--
http://spielwelt14.monstersgame.net/?ac=vid&vid=28103555
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.04.2006, 20:51 Uhr
Pablo
Supertux
(Operator)


welchen Fehler? Ich vermute, dass es for(i = 0; i < Tage; i++){ heißen muss, < und nicht <=

sonst ist es richtig, wie man den Speicher freigibt
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.04.2006, 12:31 Uhr
Frido



Den Fehler ist mir auch gleich aufgefallen habe ihn wie oben steht auch schon geändert.
Hab aber immmer noch das Problem das , wenn das Programm beendet werden soll , beim Freigeben des zweidimesionalen Arrays ein Fehler kommt und das Programm beednet wird.
--
http://spielwelt14.monstersgame.net/?ac=vid&vid=28103555
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.04.2006, 12:42 Uhr
0xdeadbeef
Gott
(Operator)


Wenn du das windows-spezifische _msize entfernst, haste ne chance, das ganze unter linux ans laufen zu bringen und valgrind dazu zu befragen...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.04.2006, 13:33 Uhr
~Stefan S.
Gast


Korrigiere mal die folgende Zeile


C++:
Temperatur = (double**)malloc(Tage * sizeof(double*));


in


C++:
Temperatur = (double**)malloc(Tage * sizeof(double));


Dann klappts auch wieder mit dem Nachbarn .

cu
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.04.2006, 14:14 Uhr
0xdeadbeef
Gott
(Operator)


Äh...das ist Unfug. Lies nochmal genau nach, es geht um ein Array von double-pointern, also ist tage * sizeof(double*) schon richtig.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
29.04.2006, 14:42 Uhr
~Stefan S.
Gast



Zitat von 0xdeadbeef:
Äh...das ist Unfug. Lies nochmal genau nach, es geht um ein Array von double-pointern, also ist tage * sizeof(double*) schon richtig.


Stimmt, du hast Recht! Das hatte ich übersehen. Dann sehe ich auch nur den Fehler in der Zeile


C++:
for(i = 0;i <= Tage; i++){


wo es


C++:
for(i = 0;i < Tage; i++){


heißen sollte.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
29.04.2006, 14:54 Uhr
Frido



Ja gut aber das Programm ist nicht lauffähig jedenfalls auf meinem nicht

Hier nochmal der Verbesserte Code:

Code:

# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>

/**Define´s**********************************/

# define MAX_TEMP 3

/**Funktion main.c***************************/

int main(int argc, char *argv[]){

    double *Luftdruck;
    double **Temperatur;
    int Tage, zusatz;
    char Zeichen;
    int i,u,o = 0;
    double mittel_Temp = 0;
    double mittel_LD = 0;

    printf("Wieviele Tage einlesen: ");
    scanf("%i",&Tage);
    fflush(stdin);

/**Speicherreservierung**********************/

    Luftdruck = (double*)malloc(Tage * sizeof(double));
    if (Luftdruck == NULL){
        printf("ERROR. Kein Speicher fuer Luftdruck\n");
        exit(1);
    }
    Temperatur = (double**)malloc(Tage * sizeof(double*));
    if (Temperatur == NULL){
            printf("ERROR. Kein Speicher fuer Temperatur Tage\n");
            exit(1);
    }
    for(i = 0;i <= Tage; i++){
        Temperatur[i] = (double*)malloc(MAX_TEMP * sizeof(double));
        if (Temperatur[i] == NULL){
            printf("ERROR. Kein Speicher fuer Temperatur Werte\n");
            exit(1);
        }
    }

/**Werte Eingeben****************************/

    for(i = 0; i <= Tage-1; i++){
        printf("Tag %i\n",i+1);
        for(u = 0; u <= 2; u++){
            printf("Temperatur %i: ",u+1);
            scanf("%lf",&Temperatur[i][u]);
            fflush(stdin);
        }
        printf("Luftdruck: ");
        scanf("%lf",&Luftdruck[i]);
        fflush(stdin);
    }

/**Durchschnittsberechnungen*****************/

    printf("Druchschnittswert des Luftdrucks: ");
    for(i = 0; i <= Tage-1; i++){
        mittel_LD += Luftdruck[i];
    }
    mittel_LD = mittel_LD / Tage;
    printf("%lf\n",mittel_LD);

    printf("Durchschnittswert der Temperatur: ");
    for(i = 0; i <= Tage-1; i++){
        for(u = 0; u < 3; u++){
            mittel_Temp += Temperatur[i][u];
        }
    }
    mittel_Temp = mittel_Temp / (Tage * 3);
    printf("%lf\n",mittel_Temp);

/**Schleife für Wiederholungen****************/
    while(o == 0){
        printf("Neue Tage [J/N]: ");
        Zeichen = getc(stdin);

        if((Zeichen == 'J')||(Zeichen == 'j')){
            printf("Wieviel Tage zusätzlich: ");
            scanf("%i",&zusatz);
            fflush(stdin);


            Luftdruck = (double*)realloc(Luftdruck,_msize(Luftdruck)+zusatz * sizeof(double));
            if (Luftdruck == NULL){
                printf("ERROR. Kein Speicher fuer Luftdruck\n");
                exit(1);
            }
            Temperatur = (double**)realloc(Temperatur,_msize(Temperatur)+zusatz * sizeof(double*));
            if (Temperatur == NULL){
                printf("ERROR. Kein Speicher fuer Temperatur Tage\n");
                exit(1);
            }
            for(i = Tage ;i < (Tage + zusatz); i++){
                Temperatur[i] = (double*)realloc(Temperatur,_msize(Temperatur)+MAX_TEMP * sizeof(double));
                if (Temperatur[i] == NULL){
                    printf("ERROR. Kein Speicher fuer Temperatur Werte\n");
                    exit(1);
                }
            }
            for(i = Tage  ; i < (Tage + zusatz); i++){
                printf("Tage %i: \n",i+1);
                for(u = 0; u <= 2; u++){
                    printf("Temperatur %i: ",Tage+1);
                    scanf("%lf",&Temperatur[i][u]);
                    fflush(stdin);
                }
                printf("Luftdruck: ");
                scanf("%lf",&Luftdruck[i]);
                fflush(stdin);
            }
            Tage += zusatz;

            mittel_LD = 0;
            mittel_Temp = 0;


            printf("Druchschnittswert des Luftdrucks: ");
            for(i = 0; i <= Tage-1; i++){
                mittel_LD += Luftdruck[i];
            }
            mittel_LD = mittel_LD /Tage;
            printf("%lf\n",mittel_LD);

            printf("Durchschnittswert der Temperatur: ");
            for(i = 0; i <= Tage-1; i++){
                for(u = 0; u < 3; u++){
                    mittel_Temp += Temperatur[i][u];
                }
            }
            mittel_Temp = mittel_Temp / (Tage * 3);
            printf("%lf\n",mittel_Temp);
        }
        else{
            o++;
        }
    }

/**Ende und Speicher freigeben***************/
    printf("Programm ENDE\n");
    

    free(Luftdruck);

    for(i = 0; i < Tage; i++){
        free(Temperatur[i]);
    }
    free(Temperatur);
    return(0);
}


--
http://spielwelt14.monstersgame.net/?ac=vid&vid=28103555
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
29.04.2006, 14:57 Uhr
~Stefan S.
Gast


Du hast den Fehler aber immer noch nicht korrigert! Es muss folgendermaßen aussehen:


C++:
...
/**Speicherreservierung**********************/

    Luftdruck = (double*)malloc(Tage * sizeof(double));
    if (Luftdruck == NULL){
        printf("ERROR. Kein Speicher fuer Luftdruck\n");
        exit(1);
    }
    Temperatur = (double**)malloc(Tage * sizeof(double*));
    if (Temperatur == NULL){
            printf("ERROR. Kein Speicher fuer Temperatur Tage\n");
            exit(1);
    }
    for(i = 0;i < Tage; i++){
        Temperatur[i] = (double*)malloc(MAX_TEMP * sizeof(double));
        if (Temperatur[i] == NULL){
            printf("ERROR. Kein Speicher fuer Temperatur Werte\n");
            exit(1);
        }
    }
...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: