Fehlercode aus Funktion zurückgeben, wie macht man's elegant?

OP #2050642
Lesenswert?

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!
Gast #2050672
Lesenswert?

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);
(Firma: keine) #2050677
Lesenswert?

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
}
Gast #2050696
Lesenswert?

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);
#2050704
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren