Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Addresse eines var Parameters ermitteln (https://www.delphipraxis.net/212980-addresse-eines-var-parameters-ermitteln.html)

himitsu 3. Mai 2023 10:39

AW: Addresse eines var Parameters ermitteln
 
Klar sollte Assigned natürlich auf NIL (C-isch als NULL) prüfen kommen. :gruebel:
Oder meinst das Variant-NULL?

Assigned macht ja auch nur <>nil.
Einzige Ausnahme sind Methoden-Zeiger, wo es zwei nil gibt.



Und was ist denn nun null?
* der Inhalt der Variable
* oder haben sie bösartig die Adresse zur Variable gelöscht?

Letzteres dürfte dir aber egal sein, da es außerhalb keine Wirkung hat und die veränderte Adresse des VAR-Parameters nur innerhalb deren Funktion besteht. (die wird ja quasi dennoch als CONST und None-Reference übergeben ... außer du hast einen Zeiger auf einen Zeiger auf die eigentliche Speicherstelle :stupid:)

TurboMagic 3. Mai 2023 10:45

AW: Addresse eines var Parameters ermitteln
 
Hallo,

danke für die Antworten. Das einfache

Delphi-Quellcode:
if not (@MyParam = nil) then
compiliert und sollte es tun.

Grüße
TurboMagic

TurboMagic 3. Mai 2023 10:46

AW: Addresse eines var Parameters ermitteln
 
Die haben als Parameter eine NIL Adresse übergeben.
Damit muss es knallen, wenn ich drauf schreibe.

himitsu 3. Mai 2023 10:52

AW: Addresse eines var Parameters ermitteln
 
Ach du bekommst die Adresse.
Klang so, als gibst du denen den Parameter (so callback-mäßig) und der irgendwie als NIL zurück kommt.


Ja, in Delphi ist es etwas "umständlich", wenn man einem VAR-Parameter ein NIL reingeben will. (bei denen wurde es dann wohl einfach als Pointer deklariert)


Delphi-Quellcode:
// entspricht einem procedure Test(A, B: PInteger);
procedure Test(var A: Integer; B: PInteger);
begin
  if not Assigned(B) then
    Beep;
  if not Assigned(@A) then
    Beep;
end;

procedure TForm25.FormCreate(Sender: TObject);
var
  X: PInteger;
begin
  X := nil;
  Test(X^, nil);

  Test(PInteger(nil)^, nil);
end;

tja, Optional geht dann wohl nur
Delphi-Quellcode:
procedure Test(A: PInteger=nil);

// oder
procedure Test(); overload;
procedure Test(var A: Integer); overload;

Ich glaub Emba sagt dazu
Delphi-Quellcode:
procedure Test(var [optional] A: Integer);
,
Delphi-Quellcode:
procedure Test(var A: Integer=0);
oder eigentlich eher (aber Vorhergehendes wäre besser)
Delphi-Quellcode:
procedure Test(var A: Integer=nil);
bestimmt nein. :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:04 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz