Forum: PC-Programmierung Frage zu Pointern in C


von Toadie R. (marcel_r)


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

von Peter II (Gast)


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.

von Udo S. (urschmitt)


Lesenswert?

ERROR_1 ist nur ein Name für eine '1'.

Du brauchst ein C Buch!

von Linüx (Gast)


Lesenswert?

#define = pure Textersetzung. Bevor überhaupt compiliert wird, läuft ein 
Präprozessor über deinen Code.

#define Hallo 7

überall wo in deinem Text "Hallo" steht schreibt der jetzt knallhart 
eine "7" hin. Egal was wo wann wie.

#define LEDon 128
PORTC = LEDon;

        |
   Präprozessor
        |
        |

PORTC = 128;

von Rene (Gast)


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.

von amateur (Gast)


Lesenswert?

Die hellseherischen Fähigkeiten eines gewöhnlichen C-Compilers sind 
beschränkt.
Soll er (irgendwelche) Strings ausgeben, so musst Du sie ihm auch 
bekannt geben.
Es gibt zwar ein paar "eingebaute" Fehlermeldungen, aber die sind meist 
auf auswärts, vorzugsweise Englisch.

von Johannes P. (Firma: Zodiac) (nbgabber)


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ß

von Rene (Gast)


Lesenswert?

Besser ist:
1
const char *ERROR_TXT[5] = {"SUCCESS", "ERROR_1", "ERROR_2", "ERROR_3", "ERROR_4");

Dann klappts auch mit dem Kompiler :-).

Grüsse,
R.

von Johannes P. (Firma: Zodiac) (nbgabber)


Lesenswert?

@Rene: Ups! ;-)

von Toadie R. (marcel_r)


Lesenswert?

Vielen Dank für eure Antworten! Ich dachte nämlich, dass ich soetwas 
schonmal ohne Anlegen von Strings gemacht habe, bzw. in einem 
Beispielprogramm gesehen habe, aber eigentlich ist es so verständlich. 
Danke ;-)

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.