www.mikrocontroller.net

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


Autor: V. Baumann (dr-robotnik)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
int dwim(char* input, double& result);
bzw.
double dwim(char* input, int& error);

Autor: Daniel H. (Firma: keine) (commander)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, noch eine Möglichkeit:
unsigned double parseStr(char *input_str, int *err) {
    ...
    /* falls Fehler */
    if(/*Fehlercheck*/) {
        *err = -1;
    }
    ...
}

int main() {
    ...
    int err;
    unsigned double result = parseStr(...,&err);
    if(err == -1) {
        //Fehler behandeln
    } else {
        // mit result arbeiten
    }
}

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: michl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Eddy Current (chrisi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: V. Baumann (dr-robotnik)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Juergen Roeck (stumpjumper)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.