Forum: Mikrocontroller und Digitale Elektronik Compilerfehler mit enum-Konstante, ratlos


von Alexxx (Gast)


Lesenswert?

Hallo,
ich benutze AVR8 GCC 3.4.1 (Studio 6.2).

In einer Header-Datei "PeripherieRoutinen.h" steht:

typedef enum faultoutp_enum
{
  FAULTOUT_LOWS  = 0,    /**< Fehleraktion: Ausgänge auf low */
  FAULTOUT_HIGHS  = 1,    /**< Fehleraktion: Ausgänge auf high */
  FAULTOUT_HIZ  = 2,    /**< Fehleraktion: Ausgänge hochohmig */
} AWEX_faultoutp_t;

In der c-Datei steht:

#include "PeripherieRoutinen.h"

void Set_AWEX_Channel(AWEX_t *awex, char channel, AWEX_complbridge_t 
complbridge, AWEX_faultoutp_t faultoutp)
{
....
   if(faultoutp == AWEX_FAULTOUT_HIZ)
...
}

Der Compiler meldet mit in der c-Datei den Fehler:
'AWEX_FAULTOUT_HIZ' undeclared (first use...)

Ich weis einfach nicht, was da falsch sein soll. In den ioxxx.h ist es 
doch genauso gemacht?

von Klaus (Gast)


Lesenswert?

Ein einfacher Schreibfehler. Du hast als enum Werte solche ohne "AWEX_" 
am Beginn definiert.

von Karl H. (kbuchegg)


Lesenswert?

Alexxx schrieb:

> Der Compiler meldet mit in der c-Datei den Fehler:
> 'AWEX_FAULTOUT_HIZ' undeclared (first use...)

Logisch.

Deine Werte heissen ja auch
1
    FAULTOUT_LOWS
2
    FAULTOUT_HIGHS
3
    FAULTOUT_HIZ

von Tom (Gast)


Lesenswert?

FAULTOUT_HIZ vs. AWEX_FAULTOUT_HIZ

von Alexxx (Gast)


Lesenswert?

Uups,

DANKE!
oh mann, manchmal sieht man den einfachsten Fehler nicht.
Wäre mir peinlich, wenn ich nicht wüsste, dass es anderen auch mal so 
geht ;-)

von Felix A. (madifaxle)


Lesenswert?

Das Komma hinter "FAULTOUT_HIZ  = 2,  " könnte auch noch Probleme 
machen.

von Klaus (Gast)


Lesenswert?

Naja. In Fällen von solchen Meldungen, wenn man nicht auf Anhieb darauf 
kommt und steinhart schwören würde, dass der als undeclared bezeichnete 
Term doch deklariert bzw. definiert wurde, sucht man einfach mal in 
allen Dateien danach.
Wenn man dann nicht fündig wurde (das ist dann eine Bestätigung der 
Compilermeldung), guckt man mal, wo das seiner Meinung nach deklariert 
bzw. definiert sein sollte und starrt das solange im Vergleich mit der 
inkriminierten Stelle an, bis der Groschen fällt (falls man noch 
Groschen hat). :-) Falls man den Term doch findet, fehlt die 
entsprechende Datei im Projekt.

von Karl H. (kbuchegg)


Lesenswert?

Felix A. schrieb:
> Das Komma hinter "FAULTOUT_HIZ  = 2,  " könnte auch noch Probleme
> machen.

Das ist schon ok.
Das ist erlaubt. Genauso wie hier bei einer Array Initialisierung
1
int a[] = {  5,
2
             6,
3
             7,
4
          };

Das ist eines der Dinge, bei der die Sprachdesigner den Programmierer im 
Mittelpunkt gesehen haben, der Initialisierungen (speziell wenn Arrays 
aus struct initialisiert werden) von einer Zeile zur nächsten 
weiterkopiert. Will man dann einen weiteren Wert ergänzen, dann ist das 
ein 'pain in the ass', wenn man da jedesmal in der vorhergehenden Zeile 
erst noch einen , ergänzen muss. Da ist es ganz praktisch, wenn man 
einen , machen darf, auf den dann kein Wert mehr folgt.

von Klaus (Gast)


Lesenswert?

Falls man keine Groschen hat, gehen auch 20 Cent Stücke. Die sind 
ungefähr genauso schwer und genauso viel wert (nach dem offiziellen 
Umrechnungskurs von Deutschen Mark).

von Alexxx (Gast)


Lesenswert?

@  Felix Adam

Es geht mit einem abschließenden ","!
Das wundert mich auch, da im Internet Beispiele ohne das "," beim letzen 
Element.
Jedoch habe ich gesehen, dass in den ioxx.h des Compilers jedes Element 
ein Komma am Ende hat. Wird wohl nicht ganz Standard-konform sein.

von Felix A. (madifaxle)


Lesenswert?

Ah, okay. Ich meinte mich erinnern zu können, dass sowas bei mir zu 
Fehlern geführt hat. Ein kurzer Test mit dem AVR Studio meldet aber 
keinen Fehler.

Also doch erlaubt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Klaus schrieb:
> Falls man keine Groschen hat, gehen auch 20 Cent Stücke. Die sind
> ungefähr genauso schwer und genauso viel wert (nach dem offiziellen
> Umrechnungskurs von Deutschen Mark).

Nö, da hast Du 1:2 mit 2:1 velwechsert. ;-)

von Malte S. (maltest)


Lesenswert?

Klaus schrieb:
> Falls man keine Groschen hat, gehen auch 20 Cent Stücke. Die sind
> ungefähr genauso schwer und genauso viel wert (nach dem offiziellen
> Umrechnungskurs von Deutschen Mark).

Vielleicht nach Inflationsbereinigung, nach dem offiziellen Kurs 
müsstest du jedoch ein 5 Cent Stück nehmen, das ist dann aber leichter 
als ein Groschen.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Felix A. schrieb:
> Ah, okay. Ich meinte mich erinnern zu können, dass sowas bei mir zu
> Fehlern geführt hat.

In C ist so etwas erlaubt, aber nicht in z.B. VHDL. Dort darf leider 
kein Komma am Ende einer Aufzählung stehen. :-(

von Walter Tarpan (Gast)


Lesenswert?

Alexxx schrieb:
> ich benutze AVR8 GCC 3.4.1 (Studio 6.2)

Nanu, ist bei Atmel-Studio 6.2 nicht ein AVR-GCC 8.xx dabei?

von Programmierer (Gast)


Lesenswert?

Das ist doch nur erlaubt, damit man Code leichter automatisch erzeugen 
lassen kann und man in einer Schleife keine Fallunterscheidung machen 
muss, ob ein Komma nötig ist oder verboten...

von Walter Tarpan (Gast)


Lesenswert?

Walter Tarpan schrieb:
> Alexxx schrieb:
>> ich benutze AVR8 GCC 3.4.1 (Studio 6.2)
>
> Nanu, ist bei Atmel-Studio 6.2 nicht ein AVR-GCC 8.xx dabei?

Sollte heißen: 4.8.xx

von Klaus (Gast)


Lesenswert?

Malte S. schrieb:
> Vielleicht nach Inflationsbereinigung, nach dem offiziellen Kurs
> müsstest du jedoch ein 5 Cent Stück nehmen, das ist dann aber leichter
> als ein Groschen.

Richtig. Danke. Da habe ich falsch herum gerechnet. Dann ist es also 
billiger geworden, wenn der Groschen fällt. :-)

von Kaj (Gast)


Lesenswert?

Walter Tarpan schrieb:
> Walter Tarpan schrieb:
>> Alexxx schrieb:
>>> ich benutze AVR8 GCC 3.4.1 (Studio 6.2)
>>
>> Nanu, ist bei Atmel-Studio 6.2 nicht ein AVR-GCC 8.xx dabei?
>
> Sollte heißen: 4.8.xx

Das 3.4.1 ist die Version der Atmel-Toolchain, nicht die des Compilers 
:)
und ja, fuer AVR ist glaube ich ein GCC 4.8.3 und fuer ARM ein GCC 4.8.1 
dabei.

Gruesse

von Clemens L. (c_l)


Lesenswert?

Alexxx schrieb:
> Wird wohl nicht ganz Standard-konform sein.

C99 6.7.2.2 Enumeration specifiers:
1
enum-specifier:
2
    enum identifier_opt { enumerator-list }
3
    enum identifier_opt { enumerator-list , }
4
    enum identifier

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.