Einzelnen Beitrag anzeigen

Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.546 Beiträge
 
Delphi 11 Alexandria
 
#23

Re: Die größer Zahl nehmen ?

  Alt 10. Feb 2009, 17:08
Bevor ich mir hier den Wolf tippe:
Zitat von Delphi 7-Hilfe:
Wert- und Variablenparameter
Die meisten Parameter sind Wert- (Standard) oder Variablenparameter (var). Wertparameter werden als Wert übergeben, Variablenparameter als Referenz. Der Unterschied wird anhand der folgenden beiden Funktionen deutlich:

Delphi-Quellcode:
function DoubleByValue(X: Integer): Integer; // X ist ein Wertparameter
begin
  X := X * 2;
  Result := X;
end;
function DoubleByRef(var X: Integer): Integer;***// X ist ein Variablenparameter
begin
  X := X * 2;
  Result := X;
end;
Diese Funktionen liefern das gleiche Ergebnis. Nur die zweite Funktion (DoubleByRef) kann jedoch den Wert der an sie übergebenen Variablen ändern. Die Funktionen können beispielsweise folgendermaßen aufgerufen werden:

Delphi-Quellcode:
var
  I, J, V, W: Integer;
begin
  I := 4;
  V := 4;
  J := DoubleByValue(I); // J = 8, I = 4
  W := DoubleByRef(V); // W = 8, V = 8
end;
Nachdem diese Anweisungen ausgeführt wurden, enthält die an DoubleByValue übergebene Variable I immer noch den ursprünglichen Wert. Die an DoubleByRef übergebene Variable V enthält dagegen einen neuen Wert.

Ein Wertparameter verhält sich wie eine lokale Variable, die durch den im Aufruf der Funktion oder Prozedur übergebenen Wert initialisiert wird. Wenn Sie eine Variable als Wertparameter übergeben, erstellt die Prozedur oder Funktion eine Kopie dieser Variablen. Änderungen des Wertes dieser Variablen wirken sich nicht auf die ursprüngliche Variable aus.

Sie werden verworfen, sobald die Steuerung wieder an den Aufrufer zurückgegeben wird. Ein Variablenparameter ist dagegen mit einem Zeiger vergleichbar. Änderungen des Parameters im Rumpf einer Prozedur oder Funktion bleiben deshalb erhalten, wenn die Programmausführung wieder dem Aufrufer übergeben wird und der Parametername nicht mehr im Gültigkeitsbereich liegt.

Auch wenn dieselbe Variable in mehreren var-Parametern übergeben wird, werden keine Kopien erstellt. Dieses Merkmal wird im folgenden Beispiel illustriert:

Delphi-Quellcode:
procedure AddOne(var X, Y: Integer);
begin
  X := X + 1;
  Y := Y + 1;
end;
var I: Integer;
begin
  I := 1;
  AddOne(I, I);
end;
Nachdem dieser Code ausgeführt wurde, enthält die Variable I den Wert 3.

Enthält die Deklaration einer Routine einen var-Parameter, müssen Sie im Aufruf der Routine einen Ausdruck übergeben, dem ein Wert zugewiesen werden kann, also eine Variable, eine typisierte Konstante (im Status {$J+}), einen dereferenzierten Zeiger, ein Feld oder eine indizierte Variable. Im Beispiel weiter oben würde DoubleByRef(7) einen Fehler generieren, während der Aufruf DoubleByValue(7) zulässig wäre.

In var-Parametern (beispielsweise DoubleByRef(MyArray[I])) übergebene Indizes und dereferenzierte Zeiger werden vor der Ausführung der Routine einmal ausgewertet.


Konstantenparameter
Ein Konstantenparameter (const) entspricht einer lokalen bzw. schreibgeschützten Variablen. Konstantenparameter entsprechen weitgehend Wertparametern. Sie können ihnen jedoch im Rumpf einer Prozedur oder Funktion keinen Wert zuweisen und sie nicht als var
-Parameter an eine andere Routine übergeben. Übergeben Sie eine Objektreferenz als Konstantenparameter, können Sie weiterhin auf die Objekteigenschaften zugreifen und diese ändern.

Die Verwendung von const ermöglicht dem Compiler die Optimierung des Codes für strukturierte und String-Parameter. Gleichzeitig wird die versehentliche Übergabe eines Parameters als Referenz an eine andere Routine verhindert.

Das folgende Beispiel ist der Header der Funktion CompareStr in der Unit SysUtils:

function CompareStr(const S1, S2: string): Integer; Da S1 und S2 im Rumpf von CompareStr nicht geändert werden, können sie als Konstantenparameter deklariert werden.
[edit]
Zitat:
Bevor ich mir hier den Wolf tippe:
Sorry, Chäffe, das Wortspiel ist mir selbst erst später aufgefallen [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat