Frage zu Pointern in C

#3131247
Lesenswert?

Hallo,

ich habe eine Frage zur Auswertung von Rückgabewerten in C:

Treiber-Header:
1
#define SUCCESS  0
2
#define ERROR_1  1
3
#define ERROR_2  2
4
#define ERROR_3  3
5
#define ERROR_4  4

Programmcode:
1
DWORD returnvalue;
2
returnvalue = funktion([...]);
3

4
if (returnvalue ==  ERROR_1)
5
  dieser Vergleich funktioniert

Auch kann ich returnvalue als printf(„%x\n“, returnvalue); ausgeben, ich 
möchte aber den String (z.B. „ERROR_1“) im printf als String ausgeben. 
Ich komme in diesem Fall nicht richtig mit den Zeigern klar. Kann jemand 
helfen?

Grüße
Gast #3131252
Lesenswert?

Toadie R. schrieb:
> Auch kann ich returnvalue als printf(„%x\n“, returnvalue); ausgeben, ich
> möchte aber den String (z.B. „ERROR_1“) im printf als String ausgeben.
> Ich komme in diesem Fall nicht richtig mit den Zeigern klar. Kann jemand
> helfen?

nein, das geht nicht. Denn beim compiler kommt das ERROR_1 überhaupt 
nicht an. Der Preprozesor ersetzt vorher alles Stellen wo ERROR_1 durch 
eine 1. Damit ist auch klar warum es so nicht geht.
Gast #3131281
Lesenswert?

Das Ganze hat mit Zeiger nichts zu tun.

Der Kompilierungsvorgang geschieht in zwei Schritten. Einem 
"Präprozessor" Schritt und dem eigentlichen Kompilierungsvorgang.  Deine 
Defines sind Makros, welche durch den Präprozessor (CPP) Schritt 
substituiert werden. Nach dem CPP sind die weg. Dein Code sieht danach 
so aus (das ist was dem Kompiler mitgegeben wird):
1
DWORD returnvalue;
2
returnvalue = funktion([...]);
3

4
if (returnvalue ==  1)
5
  dieser Vergleich funktioniert

Der Kompiler bekommt von Deinen Makros also nichts mit. Ich schliesse 
mich den Vorrednern an, kauf Dir ein C-Buch. Um das zu erreichen, was Du 
willst, gibt es in C 1001 Möglichkeiten.

Grüsse,
R.
(Firma: Zodiac) #3131294
Lesenswert?

Was Du noch zusätzlich brauchst um zu den Fehlercodes ein Klartext zu 
erhalten währe zum beispiel sowas hier:
1
const char *ERROR_TXT[5] = {"SUCCESS", ERROR_1, ERROR_2, ERROR_3, ERROR_4);

und dann kannst du so eine Meldung ausgeben:
1
printf(ERROR_TXT[returnvalue]);

ansonsten kann ich mich den Anderen nur anschließen:
1
#define SUCCESS  0
bedeutet, das komplette c-file wird nach SUCCESS durchsucht, und überall 
wo der compiler SUCCESS findet, ersetzt er es duch 0.
Es wird also keinesfalls eine Stringkonstante im Datenspeicher angelegt!

Gruß

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