Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 05, 2025 12:43

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Pointerproblem
BeitragVerfasst: Di Jun 23, 2009 10:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Moin,

folgender Code:

Code:
  1.  
  2.   // Speicher holen
  3.   GetMem(data, indexSize);
  4.   offset:= data;
  5.  
  6.   ...
  7.   // öfter mal offset erhöhen
  8.   Inc(offset, y);
  9.   ...
  10.   // offset ist beim ersten Byte hinter data + indexSize
  11.  
  12.   // mehr Speicher holen
  13.   oldIndexSize:= indexSize;
  14.   indexSize:= indexSize + x;         // x ist ziemlich groß
  15.   ReallocMem(data, indexSize);
  16.   // Pointer anpassen, weil es ja sein kann, dass der ganze Block verschoben wurde
  17.   offset:= Pointer(Integer(data) + oldIndexSize);
  18.  
  19.   ...
  20.   // öfter mal offset erhöhen
  21.   Inc(offset, y);
  22.   ...
  23.   // offset ist beim ersten Byte hinter data + indexSize
  24.  
  25.   // noch mehr Speicher holen
  26.   oldIndexSize:= indexSize;
  27.   indexSize:= indexSize + z;        // z ist ziemlich klein
  28.   ReallocMem(data, indexSize);
  29.   offset:= Pointer(Integer(data) + oldIndexSize);  // stimmt nicht
  30.  


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?!

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 23, 2009 11:45 
Offline
DGL Member
Benutzeravatar

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:
  1. Offset := Data;
  2. 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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 23, 2009 12:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
... Danke, du hattest recht, ich habe zwischendrin einen Fehler gehabt. Ich habe viel zu viel Speicher geholt und dann nicht alles "befüllt".


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 23, 2009 13:47 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 23, 2009 13:58 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]