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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.