Dynamische Speicherverwaltung über Strukturen



  • Hi

    Ich habe da ein Problem bezüglich der Dynamischen Speicherverwaltung.

    Wie stelle ich die Reservierung des Speichers bei 2 Dimensionalen Arrays mittels Strukturen an.

    bzw. wie müsste ich das hier in meinem Programm umschreiben, ich hab mal was versucht aber ich bekomme ne Errormeldung raus.
    ("`FloatNumbers' in something not a structure or union ")

    sonst funktioniert das Programm abgesehen von der Speicherverwaltung.

    #include <stdio.h>
    #include <stdlib.h>
    
    enum
    { 
        MAX=1000,
        Generiere=0,
        LeseSortiere=1
    };
    
    struct SortiereFloatZahlen
    {
        double FloatNumbers[MAX];
        long Lenge;   
    };
    
    struct SortiereFloatZahlen Floats[MAX];
    
    long dynamische_speicher(struct SortiereFloatZahlen Floats[]);
    double GenerateFloat();
    long ReadFile(struct SortiereFloatZahlen Floats[]);
    long Sortiere (struct SortiereFloatZahlen Floats[],long y);
    
    int main(int argc, char *argv[])
    { 
        long y=0;
    
        dynamische_speicher(Floats);
    
        if (LeseSortiere==0)GenerateFloat;
        if (LeseSortiere==1)y=ReadFile(Floats);
    
        Sortiere(Floats,y);
    
      system("PAUSE");	
      return 0;
    }
    
    long dynamische_speicher(struct SortiereFloatZahlen Floats[]){--> FUNKTIONIERT NICHT
    
        Floats *new;
        if (new = (Floats*) malloc( MAX*sizeof(Floats)))==0);
        {
            printf("Allozieren fehlgeschlagen");
    
        }
    
    }
    
    double GenerateFloat()
    {
        ...
    }
    
    long ReadFile(struct SortiereFloatZahlen Floats[])
    {
        ....    
    }
    long Sortiere (struct SortiereFloatZahlen Floats[],long y)
    {
       ....
    }
    


  • Da kann doch so keiner lesen 😞

    - [cpp ] Tags (scheinst Du versucht zu haben -> Vorschau-Button)
    - exakte Fehlermeldung
    - Zeilenangabe, wenn möglich übereinstimmend mit dem geposteten Code (der in vernünftigen Tags übrigens sogar Zeilennummern hat)



  • Wenn du den Code-Block noch schließt und das Problem noch etwas auf seine eigentliche Wurzel reduzierst...

    Viele Grüße



  • OK jetzt Sollte es mit der übersicht passen.

    Also mein Problem wie geht das mit der Dynamischen Speicherverwaltung mittels Strukturen. Wie spreche ich das an?
    Das was ich probiert habe geht leider nicht.
    zeile 41-50.

    danke



  • Okay, dann fange ich mal an!

    struct SortiereFloatZahlen
    {
        double FloatNumbers[MAX];
        long Lenge;  
    };
    

    Wo werden hier Float Zahlen Sortiert?

    Viele Grüße



  • hallo

    Also Mit Floatnumbers.

    code anabschnitt:

    long Sortiere (struct SortiereFloatZahlen Floats[],long y)
    {
       long a=0,b=0,c=0,z=0,x=0;
       double Zwischenspeicher= 0;
    
      do
      {
            for (a=0;Floats[c].FloatNumbers[a]!=0;a++)
            {   
    
                while(1)
                {
                    for (b=0;Floats[z].FloatNumbers[b]!=0;b++)
                    {
                        if (Floats[c].FloatNumbers[a]>Floats[z].FloatNumbers[b])
                        {
                            Zwischenspeicher=Floats[c].FloatNumbers[a];  
                            Floats[c].FloatNumbers[a]=Floats[z].FloatNumbers[b];
                            Floats[z].FloatNumbers[b]=Zwischenspeicher;
                        }   
                    }
                    if (y==z) {z=0;break;}
                    z++;
                }
            }
            c++;
        }while(y+1!=c);
    


  • Ja, aber die Struktur, die du nach der Aktion benannt hast, führt diese Aktion ja gar nicht aus, das meinte ich!

    SortiereFloatZahlen müsste eigentlich eher "FloatFeld" und in diesem speziellen Fall "DoubleFeld" heißen.

    Kennst du in C den typedef struct { } structname; - Trick? Wenn du Strukturen so deklarierst, brauchst du hinterher nicht immer struct zu verwenden:

    typedef struct {
       int a;
    } astruct;
    
    astruct blubb;
    blubb.a = 4;
    

    So, nachdem das geklärt ist, was soll dynamische_speicher eigentlich genau tun?
    Ein Feld von beliebig vielen SortiereFloatZahlen mit wiederum beliebig großem FloatNumbers-Feld?

    Viele Grüße



  • OK ich versuche mal das anhand dieses Prgrammes zu erklären.

    Ich möchte eigentlich nur wissen wie ich einfach für mein 2D Array Float[].Floatnumbers[] speicher reservieren kann.

    Wie schreibe ich das bzw. wie spreche ich das über eine Struktur an

    so wie ich es prgrammiert habe kriege ich leider eine Fehlermeldung raus!
    "FloatNumbers in something not a structure or union "

    danke

    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 10
    
    struct SortiereFloatZahlen
    {
        double *FloatNumbers[MAX];
    };struct SortiereFloatZahlen Floats[MAX]; 
    
    long dynamische_speicher(struct SortiereFloatZahlen Floats[]);
    
    int main(int argc, char *argv[])
    { 
    
        dynamische_speicher(Floats);
    
        system("PAUSE");    
        return 0;
    }
    
    long dynamische_speicher(struct SortiereFloatZahlen Floats[])
    {    
         Floats.FloatNumbers=malloc(MAX*sizeof(double));
    }
    


  • Hallo goekhan,
    das, was du da beschreibst, ist im eigentlichen Sinne kein wirkliches 2d-Array.
    Es ist ein Array von Strukturinstanzen, welche selber wiederum irgendwas speichern.
    Aber ich glaube ich verstehe, was du so am Ende wirklich möchtest. Du möchtest eine zur Laufzeit bestimmte Menge von Double-Feldern mit zur Laufzeit bestimmter Kapazität?

    Dann wäre wohl der Folgende Funktionsaufruf etwas, das du gebrauchen könntest:

    SortiereFloatZahlen* MakeMyArray( unsigned int numElements, unsigned int perElementCapacity )
    {
        SortiereFloatZahlen* pArray = (SortiereFloatZahlen*) malloc( numElements * sizeof( SortiereFloatZahlen ) );
    
        for( unsigned int i=0; i<numElements; ++i ) {
            pArray[i].FloatNumbers = (double*) malloc( perElementCapacity * sizeof( double ) );
            pArray[i].Lenge = perElementCapacity;
        }
    
        return pArray;
    }
    

    Wie man das ganze wieder dealloziert würde ich dir zur Übung lassen. Eigentlich ist das hier aber das dedizierte C++-Forum, nicht C!

    Viele Grüße,
    Michael



  • ok danke für die hilfe Decimad.

    Das muss ich erst mal verdauen, . 😃

    Ich habe halt so ein Projekt von der uni bekommen, worin meine Aufgabe darin besteht ,dass ich Textfiles einlese und diverse Bearbeitungen durchführe.
    Wie nach einem bestimmten Wort suchen ,ein Wort ersetzen , löschen,markieren umkopieren etc.
    Und das alles soll so effizient wie möglich programmiert werden.
    Also dynamische Speicher reservierung wird sicher zur Effizienz des Programmes beitragen.
    Das meiste habe ich schon nur dynamische Speicher bereitet mir noch kopfzerbrechen.

    mfg


Anmelden zum Antworten