hi
kennt jemand noch das Delphischlüsselwort "absolute" ?
Mit dem kann man eine Speicherstelle durch eine weitere Variable beschreiben.
Delphi-Quellcode:
var i : Integer;
i2 : Cardinal absolute i;
begin
Beide Variablen zeigen auf denselben Speicherbereich. Der Wert ist zwar der gleiche, jedoch nur dann, wenn i2 < high(i) is. Sonst wird i < 0.
Man kann dieses Spielchen auf für normale Parameter machen :
Delphi-Quellcode:
procedure XY(i : Integer);
var i2 : Cardinal absolute i;
begin
und für Rückgabewerte:
Delphi-Quellcode:
function XY : Integer;
var i2 : Cardinal absolute result;
begin
Wirklich nützlich ist das Schlüsselwort jedoch, wenn man einen Array hat, der aus der C Sparte stammt :
Delphi-Quellcode:
type PData = ^TData;
TData = record
Member : ...
...
end;
procedure XY(pArray : PData);
var
anArray : Array of pArray absolute pArray;
begin
In einem Array pArray, befinden sich die Elemente gerade soweit auseinander, wie die Größe von TData ist (ungepackter Zustand). D.h. wenn man durch die Elemente gehen will,
dann muss man normalerweise entweder :
1. Eine explizite Typkonvertierung machen
2. Einen Zeiger soweit verschieben, dass er aufs nächste Element zeigt.
Das ist jedoch nicht nötig.
Delphi-Quellcode:
procedure XY(pArray : PData);
var
anArray : Array of pArray absolute pArray;
i : Integer;
begin
for i := 0 to 5 do
anArray[i].Member := ...;
Was jedoch notwendig ist, dass mann die Grenzen kennt. Die obere und die Untere. Man sollte nicht auf high(anArray), low(anArray) und length(anArray) vertrauen,
da der dynamische Array nicht korrekt erstellt wurde.
Zudem sollte man auf SetLength verzichten, da es sich ja garnicht um einen echten dynamischen delphi Array handelt.
Delphi-Quellcode:
procedure XY(pArray : PData; iCnt : Integer;);
var
anArray : Array of pArray absolute pArray;
i : Integer;
begin
for i := 0 to iCnt do
anArray[i].Member := ...;
Zudem sollte man sowas immer kommentieren und nicht als Allheilmittel einsetzen.
Viel Spass