Frage zur Dynamischen-Speicherverwaltung
-
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 3DhInt 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!