Einzelnen Beitrag anzeigen

Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#41

Re: Temperatur Umrechner

  Alt 22. Sep 2009, 17:33
Also gut, für alle Fälle eine kleine Einweisung in Parameter (eigentlich: Argumente). Nehmen wir einmal folgende Funktionsdeklaration:
function MyFunc(const InputString: string; var InputInt: integer; out OutputDouble: double): Boolean; Diese Funktion erwartet 3 Argumente:
- einen String
- eine Integer
- eine Double
und gibt als Ergebnis Boolean zurück (also entweder true oder false). Alle 3 werden unterschiedlich gehandhabt. Das const vor InputString bedeutet, dass das Argument innerhalb der Funktion nicht geändert wird/werden soll. Das var vor InputInt bedeutet, dass das übergebene Argument innerhalb der Funktion ausgewertet und evtl. geändert werden kann. Das out vor OutputDouble bedeutet, dass das Argument innerhalb der Funktion nicht berücksichtigt, sondern als reines Ausgabeargument behandelt werden soll. Von allen 3 Argumenten wird innerhalb der Funktion keine lokale Kopie angelegt, da diese als Referenzen übergeben werden (call by reference). Anders verhält sich dies, wenn ein Argument ohne const, var oder out entgegegenommen wird. In diesem Fall wird mit einer lokalen Kopie des Wertes gearbeitet, das Original bleibt davon unberührt (call by value). Auch hierfür ein Beispiel:
Delphi-Quellcode:
procedure Proc1(InputInt: integer);
begin
  InputInt := 42;
end;

procedure Proc2(var InputInt: integer);
begin
  InputInt := 42;
end;

procedure TFormMain.TestProcs;
var MyInt: integer;
begin
  MyInt := 100;
  Proc1(MyInt); //call by value
  ShowMessage(IntToStr(MyInt)); //Ausgabe: 100
  Proc2(MyInt); //call by reference
  ShowMessage(IntToStr(MyInt)); //Ausgabe: 42
end;
Übrigens muss man wegen der evtl. Veränderlichkeit des Wertes bei var- und out-Parametern immer eine Variable deklarieren und diese übergeben. So würde sich dieser Aufruf nicht kompilieren lassen:
Delphi-Quellcode:
procedure TFormMain.TestProcs;
begin
  Proc2(42);
end;
Wieso dies? 42 ist eine Konstante, Proc2 erwartet aber eine Variable, da der Wert veränderlich sein soll, was eine Konstante ja nun einmal nicht ist.
Zum Schluss noch ein paar Worte zu überladenen Routinen und Default-Argumenten. Seit Delphi 4 kann man Routinen überladen, d.h. eine Routine mit dem selben Namen kann unterschiedlichste Argumente entgegennehmen. Das Einzige, was dabei zu beachten ist, ist, dass der Compiler klar unterscheiden können muss, welche Version denn nun gemeint ist. Auch dazu ein Beispiel:
Delphi-Quellcode:
function EineFunc(const s: string): Boolean; overload;
function EineFunc(const d: Double): Boolean; overload;
function EineFunc(const d: Double; var i: integer; const Bla: string='Wuppdi'): Boolean; overload;
Das Schlüsselwort "overload" kennzeichnet so eine überladene Routine und sagt Delphi, dass man das mit Absicht so macht und nicht etwa, weil man nicht aufgepasst hat . Wir können dieser Funktion entweder einen String, eine Double oder eine Double und eine Integer (plus ggf. einen String) übergeben. Durch die Eindeutigkeit ist sichergestellt, dass immer die richtige Version aufgerufen wird. In der 3. Version gibt es die Besonderheit mit dem vorbelegten String "Bla". Dieses Argument kann, muss aber nicht übergeben werden. Wird es nicht übergeben, nimmt die Funktion automatisch die Vorgabe (in diesem Fall "Wuppdi").

So, ich hoffe, das war ausführlich genug und ich habe keinen größeren Quatsch erzählt. Bei Fragen einfach noch einmal nachhaken.
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