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 ]
010
29.04.2006, 15:07 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Wobei du dir diese wilde allokierei auch vereinfachen kannst indem du ggf einfach 1d array nimmst und die 2. dimension durch ne indexverschiebung simulierst...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
29.04.2006, 16:05 Uhr
kronos
Quotenfisch
(Operator)



Zitat von Windalf:
Wobei du dir diese wilde allokierei auch vereinfachen kannst indem du ggf einfach 1d array nimmst und die 2. dimension durch ne indexverschiebung simulierst...

Was ist eigentlich vom Zugriff her schneller?
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
29.04.2006, 16:38 Uhr
Pler
Einer von Vielen
(Operator)


Ich weiß es zwar nicht, denke es mir aber so:
Einmal allokieren sollte schneller gehen als für jeden index neu.
Vom Zugriff her wird's gleich sein.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
29.04.2006, 16:44 Uhr
kronos
Quotenfisch
(Operator)


Hmm, bei zwei Dimensionen hat man zwei Dereferenzierungen.
Bei einer Dimension eine, plus Index Berechnen (i.d.R. eine Division).
...oder?
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
29.04.2006, 17:10 Uhr
(un)wissender
Niveauwart


Multiplikation bei einer Dimension i * x + j. Kann z.B. x86 als Maschinenbefehl.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
29.04.2006, 17:30 Uhr
Pablo
Supertux
(Operator)


@Frido: und welchen Fehler bekommst du? Das hast du bis jetzt nicht gesgat, die Glaskugel ist nämlich weg.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
29.04.2006, 17:39 Uhr
kronos
Quotenfisch
(Operator)



Zitat von (un)wissender:
Kann z.B. x86 als Maschinenbefehl.

Das klingt gut.


Bearbeitung:
Hab' das mal mit vector getestet, 1-dimensional geht ca. doppelt so schnell!

--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 29.04.2006 um 17:50 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
29.04.2006, 18:50 Uhr
Pler
Einer von Vielen
(Operator)



Zitat von kronos:

Hab' das mal mit vector getestet, 1-dimensional geht ca. doppelt so schnell!


Was genau, und wie hast du getestet? Was ist doppelt so schnell? Das speicherzeug, oder der Zugriff?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
29.04.2006, 19:02 Uhr
Frido



Das Programm bricht ab wenn ich zusätzlichen speicher angefordert habe und dann in den dritten index des Zweidimensionalen Array schreiben will. Und wenn ich den teil also das schreiben in den Zweid Array weglasse kriege ich ein Problem mit dem freigeben des 2D Arrays.
--
http://spielwelt14.monstersgame.net/?ac=vid&vid=28103555
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
29.04.2006, 20:40 Uhr
~Stefan S.
Gast


Ich habe mir nun einmal den Code etwas genauer angesehen. Es sind so einige Schnitzer im Quellcode enthalten. Du hantierst mit einigen ungültigen Indexen und Pointern. Das Programm, so wie es dasteht ist sehr unsicher, nicht nur aufgrund von Buffer-Overruns beim Einlesen. Ich habe die gröbsten Fehler beim schnellen Überfliegen beseitigt, eventuell stecken noch weitere drinnen, da der Code sehr konfus strukturiert ist. So wie es nachfolgend da steht hat es zumindest meine Umgebung bei den gängigen Tests beschwerdefrei überstanden:


C++:
# 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*)malloc(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 < MAX_TEMP; 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 = (Tage - zusatz); i < Tage; i++){
                mittel_LD += Luftdruck[i];
            }
            mittel_LD = mittel_LD /zusatz;
            printf("%lf\n",mittel_LD);

            printf("Durchschnittswert der Temperatur: ");
            for(i = (Tage - zusatz); i < Tage; i++){
                for(u = 0; u < MAX_TEMP; u++){
                    mittel_Temp += Temperatur[i][u];
                }
            }

            mittel_Temp = mittel_Temp / (zusatz * 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);
}
 
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: