![]() |
Schlüsselwort absolute
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:
und für Rückgabewerte:
procedure XY(i : Integer);
var i2 : Cardinal absolute i; begin
Delphi-Quellcode:
Wirklich nützlich ist das Schlüsselwort jedoch, wenn man einen Array hat, der aus der C Sparte stammt :
function XY : Integer;
var i2 : Cardinal absolute result; begin
Delphi-Quellcode:
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,
type PData = ^TData;
TData = record Member : ... ... end; procedure XY(pArray : PData); var anArray : Array of pArray absolute pArray; begin 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:
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,
procedure XY(pArray : PData);
var anArray : Array of pArray absolute pArray; i : Integer; begin for i := 0 to 5 do anArray[i].Member := ...; 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 |
Re: Schlüsselwort absolute
huhu!
schickes tutorial... aaaaaaber :-) ich finde das absolute größtenteils nur für verwirrung sorgt. a) ist das wörtchen wirklich schon veraltet b) macht es den quellcode unleserlich (unkommentiert) und c) finde ich ist das ein nicht so schöner programmierstil. absolute steht bei mir auf einer seperaten liste... wo z.b. "GoTo" mit draufsteht :-) ich meine es ist jedem selbst überlassen es zu nutzen aber ob es wirklich "schön" ist bleibt für mich dahingestellt. gruß reli |
Re: Schlüsselwort absolute
Frage:
Wie würde man den untenstehenden Quelltext schreiben, ohne absolute zu verwenden?
Delphi-Quellcode:
type //aus jwaACLui.pas PSI_ACCESS = ^SI_ACCESS; {$EXTERNALSYM PSI_ACCESS} _SI_ACCESS = record pguid: LPGUID; mask: ACCESS_MASK; pszName: LPCWSTR; // may be resource ID dwFlags: DWORD; end; {$EXTERNALSYM _SI_ACCESS} SI_ACCESS = _SI_ACCESS; {$EXTERNALSYM SI_ACCESS} TSiAccess = SI_ACCESS; PSiAccess = PSI_ACCESS; function GetAccessNames(out iCount : Cardinal): PSI_ACCESS; var siArr : array of SI_ACCESS absolute result; i : Cardinal; begin iCount := 32; GetMem(result, Sizeof(si) * iCount); {result = siArr} for i := 0 to iCount -1 do begin hier zugriff auf siArr[i] ganz leicht end; end; |
Re: Schlüsselwort absolute
Zitat:
gruß reli |
Re: Schlüsselwort absolute
Zitat:
Delphi-Quellcode:
Natürlich darfst du so nie eine Variable direkt vom Typ TSI_ACCESS_Array anlegen, da sonst dein Stack sein voll dürfte.
type
PSI_ACCESS = ^TSI_ACCESS; TSI_ACCESS_Array = Array[0..high(Integer)] of SI_ACCESS; |
Re: Schlüsselwort absolute
Zitat:
Es gibt aber eine Lösung, die das schafft. Leider ist sie etwas gefährlich.
Delphi-Quellcode:
class function GetAccessNames(out iCount : Cardinal): PSI_ACCESS;
type tASI = array of SI_ACCESS; var siArr : tASI; i : Cardinal; begin iCount := 32; GetMem(result, Sizeof(si) * iCount); {hier noch kein Zugriff auf siArr !!!!!!!} siArr := tASI(result); {result = siArr} for i := 0 to iCount -1 do begin //Zugriff : siArr[i] end; end; |
Re: Schlüsselwort absolute
Hallo,
Zitat:
Gruß xaromz |
Re: Schlüsselwort absolute
Mein Vorschlag:
Delphi-Quellcode:
Der Vorschlag ist nur zum Elementzugriff. Die angesprochene Alloziierung von Speicher welche auf einer anderen Ebene freigegeben wird, ist hier nicht korrigiert und sollte wie von xaromz beschrieben gelöst werden.
function GetAccessNames(out iCount : Cardinal): PSI_ACCESS;
var lSiEntry: PSI_ACCESS; i : Cardinal; begin iCount := 32; GetMem(lSiEntry, Sizeof(si) * iCount); result := lSiEntry; for i := 0 to iCount -1 do begin hier zugriff auf lSiEntry^ ganz leicht Inc(lSiEntry); end; end; |
Re: Schlüsselwort absolute
woher weiß ein C Programmierer, der nur einen Zeiger auf PData hat, wann das Ende des Arrays erreicht ist?
|
Re: Schlüsselwort absolute
Hi,
Zitat:
Delphi-Quellcode:
So sollte es imho auch gehen - und ohne Stackprobleme.
type
PSI_ACCESS = ^TSI_ACCESS; TSI_ACCESS_Array = Array[0..0] of SI_ACCESS; Mfg FAlter (der übrigens auch kein absolute mehr nutzt) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz