Frage zur Dynamischen-Speicherverwaltung



  • Hallo bestimmt kann mir einer von euch bei meinem kleinen Problem weiterhelfen...

    Ich habe in meinem Programm eine Schleife. Bei jedem Durchlauf soll dabei ein Dynamisches Array von Integer-Variablen um 4 Byte (also um eine I-Variable) vergrößert werden. Leider weiß ich nicht so genau wie ich das anstellen soll.
    Ein Dynamisches Array anzulegen geht ja so:

    [code]
    int *pZeiger;
    pZeiger = new int[5];
    delete[] pZeiger;
    [/code]
    

    Kann mir nun also jemand sagen wie ich das Integer-Array
    bei einem Schleifendurchlauf um 4 Byte vergrößere?

    Danke für eure Hilfe!



  • gar nicht. entweder neues, um vier byte größeres array anlegen, altes reinkopieren, altes löschen, oder guck dir mal verkettete listen an. aber n array hat immer die größe, in der es angelegt wurde.

    gruß mata



  • Hm, irgendwie kann ich mir das nicht so ganz vorstellen. Es muss doch möglich sein ein dynamisches Array um 4 Bytes zu vergrößern...
    Naja, vielleicht weiß ja noch jemand einen Rat!



  • Nimm einen vector.



  • bEaST schrieb:

    Hm, irgendwie kann ich mir das nicht so ganz vorstellen. Es muss doch möglich sein ein dynamisches Array um 4 Bytes zu vergrößern...
    Naja, vielleicht weiß ja noch jemand einen Rat!

    Ein Array wie du es oben anlegst kann man nicht vergrößern.
    Man muss ein neues erstellen und die alten Daten reinkopieren. Ne andere Möglichkeit wirst du wohl kaum finden.



  • das lieg daran das ein array nichts anderes ist als ein pointer auf ein zusammenhängendes stück speicher. wenn du also z.B. int array1[20] hast, und möchtest auf plat 5 zugreifen, dann macht der rechner nix anderes als den pointer auf das erste element (array1) + 5 zu rechnen.
    wenn du dir den speicher reservierst sucht sich also der rechner nen freien platz für diese menge an daten aus.

    nun kann es aber sein das direkt dahinter der speicher schon durch etwas anders belegt ist. in diesem fall ist es dann also nicht möglich das array z uvergrößern, und weiil man ja nicht weis ob danach noch was kommt geht das generell nicht.

    nen klenes bildchen
    die einsen sind mal dein array, die nullen sind sind was anderes.

    [1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0][0][0][0]

    -> wenn du hier noch 4 byt dran hängst dann würdest du irgend einen anderen speicher überschreiben und damit eine access violation hervorrufen.



  • [AHHHHH, gerade hab ich den Code komplett fertig gehabt, dann stürzt natürlich alles wieder ab!!! Naja, auf ein neues...]

    Das mit der Adressierung und dem Zugriff auf mein Array war mir ja klar...
    Vielleicht hilft eine genauere Beschreibung:

    //Sorry, ist aus dem Gedächtnis geschrieben...
    [code]
    void main(void)
    {
       int *pOffsets = new int[1];
       int AktuellerOffset = 0;
    
       //...
    
       for(int i=0;i<Filesize;i++)
       {
           //mit fseek fPointer um 1 erhöhen
           //mit fread ein Byte bekommen
           if(ByteFile1 != ByteFile2)
           {
              //Wenn Bytes unterschiedlich, Offset merken
              pOffsets[Aktuelleroffset] = i;
              //Wie bekomme ich nun pOffsets um 4 Bytes vergrößert, damit ich
              //beim nächsten Durchlauf den nächsten Offset "reinschieben" kann
              AktuellerOffset++;
            }
       }
    } 
    [/code]
    

    Wie ihr mitbekommen habt, geht es in meinem Programm darum 2 Dateien zu vergleichen. Deshalb muss die Prozedur auch möglichst SCHNELL laufen. Ansonsten wäre es gar kein Problem das dynamische Array zu vermeiden.

    Vorschläge? 😕



  • Also wenn ich vorhabe, einen Speicherbereich zu vergrößern, gehe ich folgendermaßen vor:

    int *speicher;
    
    speicher = (int*)malloc(sizeof(int)) // Platz für eine Integer reservieren.
    
    speicher = (int*)realloc(speicher, sizeof(int)*10) // Speicher auf 10 int's vergrößern.
    

    Damit solltest du dein Problem lösen können.



  • bEaST schrieb:

    Vorschläge? 😕

    Nimm einen vector.

    Und wenn es dir auf Geschwindigkeit ankommt, nimm Memory Mapped Files statt fread.



  • Hm, danke! Werde mal sehen ob mit das weiterhilft!



  • @DJNox
    Leider war das mit realloc nicht die Lösung... Wenn ich nämlich per realloc mein Integer
    Array "pOffsets" vergrößere wird zudem der Inhalt an der Speicheradresse überschrieben!

    @MFK
    Kannst du mir vielleicht erklären was du mit Vector und Memory Mapped Files meinst
    (vielleicht ein Link wo ich dies nachlesen kann?)? Ich kenne Vektoren nur im 3D-Bereich.

    Ich habe außerdem aus Geschwindigkeitsgründen versucht fseek und fread durch
    Inline-Assembler zu ersetzen. Leider stoße ich da auf ein Problem:
    Ich versuche mit Interrupt 21h ; Funktion 3Dh

    Int 21 Funktion 3Dh...
    [
    mov ah, 3Dh //Funktion
    mov al, 00h //Zugriffsmodus (lesen)
    mov dx, offset DATEINAME //Zeiger auf Dateinamen
    int 21h
    ]

    eine Datei zu öffnen. Nur weiß ich leider nicht wie ich "DX" den offset
    meiner "Char File1Path[255]" Variablen (die ich natürlich vorher definiert habe) zuweisen kann, denn diese besitzt nunmal einen 32bit (4Byte) Offset...
    Sind vielleicht ein paar ASM-Gurus hier die mir helfen könnten?

    Hier nochmal etwas Code meiner Hauptfunktion:

    [code]
    void main(void)
    {
    	int OffsetIndex = 1;
    
    	//...
    	{
    		fseek(pFile1, i, SEEK_SET);
    		fread((void*)ByteNFile1, sizeof(char), sizeof(char), pFile1);
    		fseek(pFile2, i, SEEK_SET);
    		fread((void*)ByteNFile2, sizeof(char), sizeof(char), pFile2);
    
    		if(ByteNFile1[0] != ByteNFile2[0])
    		{
    			//KLAPPT NICHT!!!
    			pOffsets[OffsetIndex] = i;
    			OffsetIndex++;
    			pOffsets = (int*)realloc(pOffsets, (sizeof(int) * OffsetIndex));
    		}
    	}
    	free(pOffsets);
    }
    [/code]
    


  • bEaST schrieb:

    @MFK
    Kannst du mir vielleicht erklären was du mit Vector und Memory Mapped Files meinst
    (vielleicht ein Link wo ich dies nachlesen kann?)? Ich kenne Vektoren nur im 3D-Bereich.

    std::vector ist eine Template-Containerklasse in der C++-Standardbibliothek, die als Ersatz für Arrays geeignet ist. Dynamisches Vergrößern ist damit kein Problem. Mit der Suchfunktion hier auf dem Board (im C++-Unterforum) solltest du genügend Beispiele für die Anwendung finden.

    Zu Memory Mapped Files liest du am besten in der MSDN Library unter CreateFileMapping nach.



  • Danke! 👍


Anmelden zum Antworten