Hallo zusammen! Ich schreibe eine Funktion, die einen Eingabestring interpretiert und daraus eine Zahl generiert und zurückgibt, also z.B. unsigned double parseStr(char *input_str) { ... return ergebnis; } Doch wie gehe ich vor, wenn der String nicht interpretiert werden kann, weil z.B. nicht erlaubte Zeichen vorkommen? In diesem Fall soll irgendwie ein Fehler signalisiert werden, am besten so, dass man die Rückgabe darauf testen kann bevor sie weiterverwendet wird. Mir fällt da nur die Möglichkeiten ein, global eine Variable parse_failed deklarieren und diese dann von der Funktion als Flag setzen, wenn die Umwandlung fehlschlägt, aber irgendwie finde ich das nicht so schön. Gibt es dafür irgend eine elegante Lösung, die sich gut bewährt hat? NULL darf ich ja nicht zurückgeben, weil der Rückgabetyp kein Zeiger ist. Vielen Dank und viele Grüße!
Das stört mich auch öfter, daß C nicht mehrere Returnwerte erlaubt. Abhilfe: - man hat eine globale Fehlervariable. - man gibt eine struct zurück, die aus Ergebnis und Fehlerstatus besteht. Peter
Alternative: Platz für Fehlercode oder fürs Ergebnis als formalen Parameter mitgeben und das Ergebnis oder den Fehlercode als Rückgabewert liefern, also z.B. sowas in der Art:
1 | int dwim(char* input, double& result); |
bzw.
1 | double dwim(char* input, int& error); |
Hallo, noch eine Möglichkeit:
1 | unsigned double parseStr(char *input_str, int *err) { |
2 | ... |
3 | /* falls Fehler */ |
4 | if(/*Fehlercheck*/) { |
5 | *err = -1; |
6 | } |
7 | ... |
8 | } |
9 | |
10 | int main() { |
11 | ... |
12 | int err; |
13 | unsigned double result = parseStr(...,&err); |
14 | if(err == -1) { |
15 | //Fehler behandeln |
16 | } else { |
17 | // mit result arbeiten |
18 | } |
19 | } |
Hi du kannst auch einen Wert als Fehlercode reservieren. Bei double bietet sich da z.B. DBL_MAX oder DBL_MIN an. Darauf kannst du dann entsprechend abfragen. Der Wert darf dann natürlich nicht als echter Wert der Funktion auftreten. Matthias
Wie wärs wenn du der FUnktion nicht nur den String übergibst, sondern gleichzeitg auch noch die Zieladresse? Somit hast du den return_wert immer für Fehlerbehandlungen frei. Das kann man dann für alle Funktionen machen, die man hat. Bspl: int parsestr(char* inputstr, char* output); Aufruf: errorcode = parsestr(&inputstr, &output);
Ich würde als Fehlercode die Definition NAN ("not a number") probieren. Wenn es um das Parsen komplexerer Strukturen geht, ist auch ein long_jmp als Ersatz für try/throw recht hilfreich, weil sich damit die Rückgabe von Fehlercodes komplett erübrigt. Sehr angenehm.
Ich seh' schon es scheint hierfür keine allgemein anerkannte Patentlösung zu geben. Vielen lieben Dank für die zahlreichen Vorschläge! Ich muss mal schauen was in meinem Fall bequemer ist, wahrscheinlich eine globale Fehlervariable.
Den Vorschlag von g457 finde ich nicht schlecht. Als alternative zu 2 Variablen kann man natürlich auch einen Zeiger auf eine Struktur übergeben. Die Struktur hat dann 2 Werte den Übergabewert und den Fehlercode. Der Returnwert kann dann für generelle Fehlermeldungen verwendet werden.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.