Forum: Mikrocontroller und Digitale Elektronik Fehlercode aus Funktion zurückgeben, wie macht man's elegant?


von V. B. (dr-robotnik)


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!

von Peter D. (peda)


Lesenswert?

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

von g457 (Gast)


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);

von Daniel H. (Firma: keine) (commander)


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
}

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

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

von michl (Gast)


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);

von Eddy C. (chrisi)


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.

von V. B. (dr-robotnik)


Lesenswert?

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.

von Juergen R. (stumpjumper)


Lesenswert?

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
Noch kein Account? Hier anmelden.