Forum: PC-Programmierung Rückgabewerte in C - wie handhaben ?


von Micha W. (Gast)


Lesenswert?

Hi,

wie handhabt ihr bei euren C-Funktionen die Rückgabewerte, wenn die
Rückgabewerte Aussage über aufgetretene Fehler geben? Arbeitet ihr mit
festen Werten, also z.B. 0 für keinen Fehler, 1 für Fehler-Nr.1 usw.?

Ich möchte meine Funktionen in Libs verpacken. In diesem Fall sind die
Rückgabewerte ja dann fix.

Ich sehe da jetzt folgende Probleme: Wenn ich eine H-Datei erstelle, in
der alle möglichen Fehlermeldungen per #define aufgeführt sind, darf ich
die Werte ja nicht mehr ändern, da ich sonst die Libs jedesmal neu
compilieren muss.

Da ich es für besser halte, meine Funktionen in Libs zu verpacken,
suche ich also eine Möglichkeit, die Werte der Rückgabewerte unabhängig
von der Lib zu verwenden, also die Lib so zu erstellen, dass die Werte
der Fehlermeldungen erst dann hinzukompiliert werden, wenn das
Hauptprogramm erstellt wird.

Ist das in C möglich? Hoffe ich konnte das Problem verständlich
machen...

Micha

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

du kannst deine Fehlercodes als extern deklarieren und sie dann später
dazulinken. Das sollte kein Problem sein. Mir verschließt sich aber
etwas der Sinn hinter diesem Vorhaben. Üblicherweise ist eine Lib ein
abgeschlossenes etwas. Erzeugt eine Funktion einen Fehler so meldet sie
das über ihren Rückgabewert (wie hängt ganz von der jeweiligen Funktion
ab). Soll die Fehlermeldung detailierter sein realisiert man das wie
diverse andere C-Bibliotheken über ein getError-Funktion die den
letzten aufgetretenen Fehler detailierter beschreibt.

Matthias

von Micha (Gast)


Lesenswert?

Hi Matthias,

danke für deine Antwort.

> Mir verschließt sich aber etwas der Sinn hinter diesem Vorhaben.
> Üblicherweise ist eine Lib ein abgeschlossenes etwas.

Richtig, aber die Lib ist für einen µC, und hinzu kommt, dass in der
Lib einige Portpins des µC verwendet werden. Welche Portpins das sind,
möchte ich über das zur Lib gehörende H-File definieren.

> du kannst deine Fehlercodes als extern deklarieren und sie dann
> später dazulinken. Das sollte kein Problem sein.

Kannst du mir ein Beispiel hierfür zeigen?

Danke

Micha

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

inlib.c
1
extern int errorCode1;
2
extern int errorCode2;
3
4
int someLibFunction(void)
5
{
6
    //do something
7
    return errorCode1;
8
}

app.c
1
#include lib.h
2
3
int errorCode1 = 1;
4
int errorCode2 = 2;

Und das linkst du dann einfach zusammen.

Matthias

von Karl H. (kbuchegg)


Lesenswert?

> Richtig, aber die Lib ist für einen µC, und hinzu kommt, dass in der
> Lib einige Portpins des µC verwendet werden. Welche Portpins das
> sind, möchte ich über das zur Lib gehörende H-File definieren.

Das wird so nichts.
Wenn eine Library einmal uebersetzt ist, dann ist sie ueber-
setzt.

Wenn Du also die Library konfigurieren moechtest, dann muss
es dort eine Funktion geben, die das Hauptprogramm aufruft
und die der Library ihre Wuensche vortraegt. Die Library speichert
sich dann diese Wuensche in Variablen und die Funktionen
der Library richten sich (hoffentlich) nach diesen Wuenschen.

von Micha (Gast)


Lesenswert?

danke für die Beiträge.
Hm... Sieht aus, als ob das gar nicht so einfach ist mit Libs...
Mal sehen, was ich hinbekomme...

Micha

von Feadi (Gast)


Lesenswert?

So weit wie ich mich durch den Linuxkernel gelesen habe, werden dort für
Fehler nur negative Werte zurückgegeben.
Das hat den Vorteil das die positiven Werte noch frei sind für andere
Angelegenheiten.

Feadi

von Ulrich (Gast)


Lesenswert?

Das Problem mit Libs, die Portpins verwenden sollen, hatte ich auch.

Ich hätte es gerne so gelöst: Welche Pins verwendet werden sollen, wird
der Lib erst zur Laufzeit von der Applikation übergeben. Letztlich
braucht dieses Verfahren aber einiges an Ressourcen: die Lib muss dafür
Aufrufe zur Verfügung stellen, die Daten speichern, und beim Verwenden
ist es i.d.R. auch etwas aufwendiger.

Mittlerweile hab ich mich deshalb von "richtigen" Libs verabschiedet
und importiere stattdessen das Coding mittels #include in die
Applikation. Dadurch kann man vorher mit normalen #defines die Port
Pins etc. festlegen, und die "Lib" wird zusammen mit der Applikation
compiliert und verwendet die aktuellen Definitionen. Das hat den
gewünschten Effekt (sehr universelle Lib) und ist bzgl. der Ressourcen
eher Mikrocontroller-gerecht, finde ich.

Gruß,
Ulrich

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.