// offset ist beim ersten Byte hinter data + indexSize
// mehr Speicher holen
oldIndexSize:= indexSize;
indexSize:= indexSize + x;// x ist ziemlich groß
ReallocMem(data, indexSize);
// Pointer anpassen, weil es ja sein kann, dass der ganze Block verschoben wurde
offset:=Pointer(Integer(data)+ oldIndexSize);
...
// öfter mal offset erhöhen
Inc(offset, y);
...
// offset ist beim ersten Byte hinter data + indexSize
// noch mehr Speicher holen
oldIndexSize:= indexSize;
indexSize:= indexSize + z;// z ist ziemlich klein
ReallocMem(data, indexSize);
offset:=Pointer(Integer(data)+ oldIndexSize);// stimmt nicht
Am Ende stimmt der offset-Pointer nicht mehr. Wenn ich offset so lasse, wie er war (also die letzte Zeile weglasse), gehts. Was stimmt denn da nicht? Wenn ich noch etwas hintendranhängen möchte weiß ich ja nicht wo ich hinschreiben muss?!
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Inc auf einen Pointer. Dabei ist es wichtig welchen Typ der Pointer hat. pChar/pByte dort erzeugt Inc(p, 1) eine Erhöhung um 1 Byte. Bei pWord erzeugt der gleiche Code aber eine Erhöhung um 2 Bytes. usw.
Integer und Pointer. Ist durchaus nicht ungefährlich, da Integer nun mal eine signed 32 Bit Typ ist und theoretisch auf einem 32 Bit System die Adressen auch 32 Bit (unsigned) groß sein könnten. Und da du damit rechnest könnte das Ergebniss falsch sein. Die Chancen, dass so etwas passiert sind aber eher gering. Als Alternative könnte ich mir auch folgenden 2 Zeiler vorstellen.
Code:
Offset := Data;
Inc(Offset, oldIndexSize);
Sonst sehe ich jetzt so aber keine groben Schnitzer. Wobei du aber auch nicht erwähnst wie sich dein Offset verändert und was du da sonst noch so machst. Lässt sich anhand von dem Stückchen also kaum sinnvoll sagen was es sein könnte. Interessant wäre auch an welcher Stelle sich genau offset verändert. Also ob das wirklich die letzte Zuweisung ist. Kann sich ja auch vorher um eine falsche Zuweisung handeln. Mitunter kann es auch passieren, dass ein Move (besonders bei Arrays/Strings) gerne mal Teile den Stacks überschreibt etc. Du solltest auch überprüfen ob oldIndexSize und indexSize sich auffällig verändern oder ob sie das in genau diesen Bahnen tun wie du es willst.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Wenn du unter FreePascal arbeitest, empfehle ich dir bei Pointerarbeiten auf ptruint zu casten anstatt auf Integer. Ptruint passt sich bei den Plattformen an die entsprechende Pointergröße an und ist auch unsigned. Bei 32-bit-Delphi würd ich Cardinal nehmen, das hat 32bit und ist auch unsigned, sodass du da keine Probleme bekommst.
Das aber nur am Rande.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Es sei denn Delphi schafft es irgendwann die 64 Bit Unterstützung nachzurüsten. Was sie ja durchaus irgendwann vor haben. Nichts desto trotz halte ich nicht viel vom Rechnen mit Pointern. Zu mindest in Delphi wo diese Typen so getrennt sind. Auf CPU Ebene sieht es im Endeffkt so oder so nahezu gleich aus. Nur eben bei solchen explizieten Casts kann es gut mal passieren, dass Teile stillschweigend wegfallen.
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.