![]() |
Gibts es Funktionen mit zwei Ergebnistypen!?
Hallo!
Habe mal eine Frage bzgl. der Eigenschaften von Funktionen! Gibts es Funktionen, die ein Result eines bestimmten Typs liefern, in Ausnahmefällen jedoch Resulttyp ein anderer sein kann. Beispiel:
Delphi-Quellcode:
Nehmen wir einmal als Beispiel die Funktion f(x)=1/x.
function division(x,y: extended): extended; //result := x/y
begin try if y=0 then showmessage('Bitte nicht durch Null teilen') else result := x/y except Fehlerbehandlung('Division'); result := 0 End; end; Nun soll er die Funktionswerte von -5 bis 5 berechnen und in ein Memofold eintragen. Bei dem (un)möglichen Fall 1/0, soll er jedoch nicht eine Zahl als Result liefern, sondern analog zu meinem Taschenrechner in das dazugehörige Feld für den Wert x=0 beispielsweise das Wort 'Error' hinschreiben. 'Error' wäre aber vom typ string und nicht vom geforderten Typ "extended". Gibt es da eine elegante Möglichkeit, einer Funktion in dem Ausnahmefall zu sagen, dass nun das Result vom Typ "string" sein soll? Mit freundlichen Grüßen, Propeller |
Re: Gibts es Funktionen mit zwei Ergebnistypen!?
Nein. Das ist nicht möglich.
|
Re: Gibts es Funktionen mit zwei Ergebnistypen!?
Nur wenn du ihn als Variant deklarierst.
|
Re: Gibts es Funktionen mit zwei Ergebnistypen!?
Oder vielleicht noch irgendwie als varianten Record... Guter Stil ist das aber nicht.
|
Re: Gibts es Funktionen mit zwei Ergebnistypen!?
Doch, geht doch:
Delphi-Quellcode:
Schau in der Hilfe unter "TVarData"!
function test(a,b:integer):variant;
begin if b=0 then result:='error' else result:=a/b; end; procedure TForm1.Button1Click(Sender: TObject); var e:variant; begin e:=test(4,3); if TVarData(e).VType=varstring then label2.Caption:=e else label2.Caption:=floattostr(e); end; PS: Unter den Fleißkommatypen gibts auch den Zustand infinity, der ja (in der Komplexen Ebene) x/0 ist. |
Re: Gibts es Funktionen mit zwei Ergebnistypen!?
Da man Verarbeitung und Ausgabe sowieso voneinander trennen soll, wäre das auch nicht sinnvoll.
Schmeiss doch eine Exception und fange sie in der Ausgabeunit ab, den vorgegebenen Text aus der Berechnung kannst du dann ausgeben, musst es aber nicht.
Delphi-Quellcode:
Aufruf:
function division(x,y: extended): extended;
begin if y = 0 then Exception.Create('Bitte nicht durch Null teilen') else result := x/y; end;
Delphi-Quellcode:
@sirius: Bitte keinen Variant benutzen, wenn es nicht nötig ist.
begin
try Erg:=division(1, 0); except on E: Exception do ShowMessage(E.Message); end; end; Gruss Thorsten |
Re: Gibts es Funktionen mit zwei Ergebnistypen!?
Ein Variant ist aber auch nur EIN Typ und nicht mehrere.
|
Re: Gibts es Funktionen mit zwei Ergebnistypen!?
Zitat:
|
Re: Gibts es Funktionen mit zwei Ergebnistypen!?
@omata
Aber wenn er, wie im beschriebenen Beispiel, numal keine Exception will. Er würde deinen code mit einer for-Schleife durchlaufen. Das ist auch nicht so der Hit. 1. Mit Variant sollte man sparsam umgehen (deswegen ja auch der Tipp mit infinity) 2. Wenn es aber nicht anders geht, Borland hat es ja auch aus irgend einem Grund gleich mit implementiert 3. Bläht sich der Code deswegen nicht unnötig auf 4. Kenne ich mindestens ein sher gutes MatheProgramm (Matlab) dass nur mit einer Art Varianten Datentyps arbeitet. |
Re: Gibts es Funktionen mit zwei Ergebnistypen!?
Moin Zusammen,
da die Parameter aber vom Typ Extended sind, und bei Variant schon bei Double Schluss ist, wird das auch nicht gehen. Bleibt wohl nur die Exception, oder, eigentlich besser, die Prüfung vor dem Aufruf, was aber bei einer Gleitkommazahl ja auch schiefgehen kann. Selber erzeugen muss man die Exception ja auch nicht, da Delphi von sich aus eine EDivisionByZero meldet. |
Re: Gibts es Funktionen mit zwei Ergebnistypen!?
Hallo,
hier ist noch eine Möglichkeit:
Delphi-Quellcode:
Gruß Hawkeye
// uses Math (IsZero)
function Division (a, b: Double; var erg: Double): Boolean; begin Result := not IsZero(b); if Result then erg := a / b; end; procedure TForm1.Button1Click (Sender: TObject); var y: Double; begin if Division(4, 3, y) then Label2.Caption := FloatToStr(y) else Label2.Caption := 'error'; end; |
Re: Gibts es Funktionen mit zwei Ergebnistypen!?
Hallo,
danke erstmal für eure Mühe, mir zu helfen!!! Ich habe dennoch eine allgemeine Frage, was die Anweisung try...except betrifft. Habe diese noch nie im Informatikunterricht behandelt und sie einfach aus einem Beispiel übernommen. Ich habe mich ein bisschen darüber informiert, es stand in einem Buch von mir, dass wenn innerhalb des Try-Blocks ein Fehler auftritt, so wird die Programmausführung in diesem Block unterbrochen und hinter Except fortgesetzt. Dazu folgendes primitives, jedoch anschauliches Beispiel:
Delphi-Quellcode:
So, nach meiner Logik sollte er nun die Anweisung "x/y" probieren. Tritt dabei ein Fehler auf, wie z.B. eine Division durch Null, so soll er als Result "1110" ausgeben (lassen wir den mathematisch völlig unlogischen Zusammenhang mal außen vor, die Zahl dient hier mal lediglich als Beispiel :wink: )
function division(x,y: extended): extended;
begin try result := x/y except result := 1110 End; end; Führe ich die Funktion nun doch aus, so erhalte ich dennoch einen Laufzeitfehler mit dem Hinweis von "EZeroDivide", anstatt, dass er mir als Resultat "1110" schreibt. Was habe ich nun falsch verstanden bzw. falsch gemacht??? [edit=Christian Seehase]Delphi-Tags korrigiert. Mfg, Christian Seehase[/edit] |
Re: Gibts es Funktionen mit zwei Ergebnistypen!?
Wenn du deine Anwendung aus Delphi heraus startest, bekommst du trotz try except blöcken noch Exceptions. Das kann man irgendwo ausschalten, keine Ahnung wo. Zum testen kannst du einfach die *.exe Datei aus deinem Projektverzeichnis öffnen. Dann gehts auch.
|
Re: Gibts es Funktionen mit zwei Ergebnistypen!?
Moin Propeller,
in der englischen Version findest Du das unter Tools\Debugger Options...\Language Exceptions. Dort gibt es eine Checkbox "Stop on Delphi-Exceptions". Wenn die markiert ist werden Exceptions auch angezeigt, wenn sie ein try/except-Block abfängt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 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