mikrocontroller.net

Forum: PC-Programmierung const int in Header Datei schreiben


Autor: Bernd S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe eine switch case Anweisung und möchte die definierten 
Konstanten für die einzelnen "case"-Falle in einer Header Datei 
auslagern.

Ich programmiere in C und mit
const int FALL1 = 1;
const int FALL2 = 2;
die in der Header Datei stehen, bekomme ich eine Fehlermeldung!
Die Header Datei ist dem Hauptprogramm bekannt.

Wie kann das denn ? Was muss ich ändern ?

Autor: Zepettl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm #define

Variablen sind in switch/case nicht zulässig. "Konstanten" à la const 
int sind Variablen, auch wenn sie sich nicht ändern können.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define ist nicht umbedingt das Mittel der Wahl - Fehler mit Macros 
können wirklich sehr verzickt sein...

Ich würde folgende Vorgehensweise empfehlen:

- In genau einem Modul werden die Konstanten definiert

   const int FALL1 = 1;
   const int FALL2 = 2;

- Im Headerfile werden sie deklariert:

   extern const int FALL1;
   extern const int FALL2;

Dann sind sie in allen Quellmodulen bekannt, die den Herder #includen.

Eine elegantere Möflichkeit wäre, die Konstanten als enum im Header zu 
definieren:

   typedef enum { FALL1 = 1, FALL2 = 2 } FAELLE;

Enumwerte können auch in case-Labels benutzt werden.

Autor: Bernd S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !
Genau so wie es bei Dir deklariert worden ist, habe ich es in meinem 
Programm geschrieben.

extern const int FALL1;
extern const int FALL2;

Dabei erhalte ich immer diese Fehlermeldung...

error C2065: 'FALL1' : undeclared identifier
error C2051: case expression not constant

Was nun, jemand ne Idee?

Ich muss noch dazu sagen, das ich mit Visual Studio (VisualC++) 
programmiere. Hat das damit irgendwas mit zu tun ?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die erste Fehlermeldung riecht verdächtig.

An der Stelle im Code, an der diese Fehlermeldung ausgegeben wird, ist 
"FALL1" nicht bekannt.

Poste Deinen vollständigen Code, sonst wird das nichts.

Übrigens solltest Du Variablennamen -ja, const int ist eine Variable- 
nicht in Versalien schreiben. Die Konvention sieht diese Schreibweise 
für #defines vor.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die erste Fehlermeldung riecht verdächtig.

Selbst wenn das Programm dahingehend korrigiert wird, dass die erste
Meldung nicht mehr erscheint, bleibt immer noch die zweite.

In C deklariert der const-Qualifier eine Variable zwar als read-only,
d.h. ihr kann kein Wert zugewiesen werden. Trotzdem stellt sie keine
constant-expression im Sinne der C-Syntax dar und kann deswegen
insbesondere nicht als case-Ausdruck oder als Größe in einer
Array-Deklaration benutzt werden. Hier müssen Enums oder Makros
verwendet werden, wenn man konstante Ausrücke per Namen ansprechen
will.

Anders verhält es sich in C++. Hier werden mit const echte Konstanten
deklariert, die auch in case-Ausdrücken und Array-Deklarationen
erlaubt sind.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd S. wrote:
> Hallo !
> Genau so wie es bei Dir deklariert worden ist, habe ich es in meinem
> Programm geschrieben.
>
> extern const int FALL1;
> extern const int FALL2;
>
> Dabei erhalte ich immer diese Fehlermeldung...
>
> error C2065: 'FALL1' : undeclared identifier
> error C2051: case expression not constant
>

Für switch geht diese Variante:

   typedef enum { FALL1 = 1, FALL2 = 2 } FAELLE;

Autor: Stephan M. (muphin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits, ich kram mal diesen Thread raus da meine Frage ganz 
gut dazu passt.

Ich hab ein enum
typedef enum { FALL1= 0, FALL2= 1 } FAELLE;

und möchte in einer switch-case Anweisung darauf zugreifen. Damit das 
ganze gut nachvollziehbar ist wollte ich das so machen:
switch( ... )
{
  case FAELLE.FALL1:
    ...
  case FAELLE.FALL2:
    ...
}
funktioniert aber nich! Ohne "FAELLE." funktionierts, is klar, 
wahrscheinlich komm ich auch nur auf so ne "blöde" Idee da ich C# 
gewohnt bin. Habt ihr trotzdem eine Idee wie ich das schön realisieren 
kann?

Grüße Muphin

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stephan M. schrieb:

> funktioniert aber nich! Ohne "FAELLE." funktionierts, is klar,
> wahrscheinlich komm ich auch nur auf so ne "blöde" Idee da ich C#
> gewohnt bin. Habt ihr trotzdem eine Idee wie ich das schön realisieren
> kann?

Klasse um das enum drum, dann geht FAELLE::FALL1. Evtl. geht es auch mit 
einem Namespace.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wäre dann C++. C kennt weder Klassen noch Namespaces.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
enums werden in C häufig überschätzt.

Manchmal hat man das Gefühl, die gibt es in C nur deswegen, weil es sie 
in anderen Sprachen auch gibt.

Autor: Stephan M. (muphin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Manchmal hat man das Gefühl, die gibt es in C nur deswegen, weil es sie
> in anderen Sprachen auch gibt.

Genau :-D
Nur seltsam das C eine der ersten Sprachen war, hmmm....

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:
> Das wäre dann C++. C kennt weder Klassen noch Namespaces.

Stephan hat ja im Gegensatz zum OP nicht angegeben, dass es C sein muss. 
Wieder mal so ein Beispiel, wo sich C++ als das bessere C beweist :-)

Autor: Stephan M. (muphin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Is natürlich C, will ja nur ganz rudimentär n µC programmieren (keine 
KLASSENgesellschaft grünen o.ä. :-P)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stephan M. schrieb:
> Karl heinz Buchegger schrieb:
>> Manchmal hat man das Gefühl, die gibt es in C nur deswegen, weil es sie
>> in anderen Sprachen auch gibt.
>
> Genau :-D
> Nur seltsam das C eine der ersten Sprachen war, hmmm....

Aber im Gegensatz zu C haben sich Aufzählungstypen in anderen Sprachen 
weiterentwickelt. In C sind enum so eine halbgebackene Geschichte.
Zwar ein schönes 'must have', aber eigentlich zu nichts so richtig zu 
gebrauchen.

Autor: horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wahrscheinlich komm ich auch nur auf so ne "blöde" Idee da ich C#

ja ;-)

FAELLE ist der Typ. FALL1 & FALL2 sind die Werte, die Variablen von 
diesem Typ annehmen können. = 1 & = 2 weist diesen Weten eine 
Darstellung im Speicher zu, ist also mehr was für uns abstruse C-Hacker 
die int Variablen mit FAELLE Werten vermischen wollen.
FAELLE meinFall;

meinFall = (irgendwas) ? FALL1 : FALL2;

switch (meinFall)
{
   case FALL1:
      tu (was);
      break;
   case FALL2:
      tu (nichts);
      break;

   default:
      schreie (laut);
      break;
}

Wenn du unterscheiden willst nach dem Wert eines int, schreibst du dann 
auch:

case int.1:
case int.2
?

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.