Hallo,
mittlerweile habe ich mir Delphi 5 Pro. zugelegt. Bei der Portierung einer mit Delphi 2 C/S erstellten Anwendung treten massive Probleme mit der procedure getmem() auf.
Ich habe ein Record definiert (u. a. mit Stringwerten). Mit dieser Datenstruktur wird dann ein Array definiert.
Dieses Array wird dynamisch erzeugt. Der benötigte Speicher wird mit getmem() angefordert. Beim ersten Schreibzugriff auf dieses Array wird eine Zugriffsverletzung gemeldet (EAccessViolation). Der Index des Array's liegt im gültigen Bereich.
Verwende ich statt getmem die function allocmem() funktioniert es wie gewohnt.
Hat die procedure getmem eine "Macke" (bug)?
Sehr verwundert hat mich beim debuggen des Programms die unterschiedliche Datenstruktur der dynamischen Variable. Mit allocmem() werden die Daten Record für Record gespeichert (so erwarte ich das auch), bei der Verwendung von getmem() werden jedoch die Daten wie folgt gespeichert:
<pre>
a = record
b: integer;
c: string;
end;
a1: array[1..3] of a;
Die Daten werden im Speicher in der Form abgelegt a1(b , b , b, c, c, c)
Zumindest stellt der Debugger es so dar.
</pre>
Als Betriebssystem läuft NT 4.0 SP 5.
Tschüß
Torsten
mittlerweile habe ich mir Delphi 5 Pro. zugelegt. Bei der Portierung einer mit Delphi 2 C/S erstellten Anwendung treten massive Probleme mit der procedure getmem() auf.
Ich habe ein Record definiert (u. a. mit Stringwerten). Mit dieser Datenstruktur wird dann ein Array definiert.
Dieses Array wird dynamisch erzeugt. Der benötigte Speicher wird mit getmem() angefordert. Beim ersten Schreibzugriff auf dieses Array wird eine Zugriffsverletzung gemeldet (EAccessViolation). Der Index des Array's liegt im gültigen Bereich.
Verwende ich statt getmem die function allocmem() funktioniert es wie gewohnt.
Hat die procedure getmem eine "Macke" (bug)?
Sehr verwundert hat mich beim debuggen des Programms die unterschiedliche Datenstruktur der dynamischen Variable. Mit allocmem() werden die Daten Record für Record gespeichert (so erwarte ich das auch), bei der Verwendung von getmem() werden jedoch die Daten wie folgt gespeichert:
<pre>
a = record
b: integer;
c: string;
end;
a1: array[1..3] of a;
Die Daten werden im Speicher in der Form abgelegt a1(b , b , b, c, c, c)
Zumindest stellt der Debugger es so dar.
</pre>
Als Betriebssystem läuft NT 4.0 SP 5.
Tschüß
Torsten
Comment