Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Konstantenobjekt / tatsächliche und formale Var-Parameter (https://www.delphipraxis.net/176009-konstantenobjekt-tatsaechliche-und-formale-var-parameter.html)

Jonas Shinaniganz 6. Aug 2013 13:14

Delphi-Version: 5

Konstantenobjekt / tatsächliche und formale Var-Parameter
 
Delphi-Quellcode:

procedure Test(var Nummer : Integer);
var
  I : Integer;
begin
  Test(I + 1); // Compiler Error, Typ falsch
  Test(Integer(I + 1)); // Compiler Error, Konstanten Objekt
  Inc(I); bzw I := I + 1;
  Test(I); // klappt
end;
Hey beste DP... wo kann ich etwas zu dem oben aufgezeigten Verhalten lesen? Warum darf ich in den Aufruf-Klammern nicht solche Dinge treiben?

Der schöne Günther 6. Aug 2013 13:20

AW: Konstantenobjekt / tatsächliche und formale Var-Parameter
 
Deine Prozedur Test möchte eine veränderbare Variable ("call by Reference").

Wenn du ihr "i + 1" gibst, wie soll man ein "i + 1" verändern können? Ein "i" an sich kann man verändern. Damit ist sie ja auch zufrieden wie du siehst. Das Casten nach Integer bringt auch nichts, denn das Ergebnis dieses Casts ist ja ein neuer Integer. Und der ist vollkommen anonym. Selbst wenn dir deine Test-Prozedur damit etwas anstellen würde, kämst du an dieses Ergebnis nie wieder dran.

Die letzten beiden Zeilen machen es richtig: Erst i erhöhen, dann übergeben.

Und fröhlichen Stack Overflow noch :-)

Jonas Shinaniganz 6. Aug 2013 13:29

AW: Konstantenobjekt / tatsächliche und formale Var-Parameter
 
Immerhin sagst du nicht Endlosschleife :)

Ja... du hast natürlich recht. Kannst du noch was zu dem "anonym" sagen? Was passiert eigentlich genau bei solchen Rechenausdrücken? Scheinbar ist das Ergebnis des Terms ja von einem bestimmten Typen...

mentaltec 6. Aug 2013 13:32

AW: Konstantenobjekt / tatsächliche und formale Var-Parameter
 
Hi,

bei var-Argumenten (auch use by reference) wird eigentlich ein Pointer auf die Variable übergeben - haupsächlich, damit die aufgerufene Procedur ebendiese Variable auch ändern kann -- willst Du dieses Verhalten nicht, lass einfach "var" wech

mfg

Jonas Shinaniganz 6. Aug 2013 13:39

AW: Konstantenobjekt / tatsächliche und formale Var-Parameter
 
Okay, vielen Dank.

Was Anderes als einen Pointer erhalte ich denn durch einen solchen Ausdruck?

Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:50 Uhr.

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