C Aufzählungstyp - enum

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Halli Hallo,

Was kann ich machen, wenn ich zwei Register habe, die auch noch gleich heißen?



CodeBox C
enum mcp23017_regs

{
IODIRA = 0x00,
IODIRB = 0x01,
IPOLA = 0x02,
IPOLB = 0x03,
GPINTENA = 0x04,
GPINTENB = 0x05,
DEFVALA = 0x06,
DEFVALB = 0x07,
INTCONA = 0x08,
INTCONB = 0x09,
[B]IOCON = 0x0A,
 
 IOCON = 0x0B,[/B]
GPPUA = 0x0C,
GPPUB = 0x0D,
INTFA = 0x0E,
INTFB = 0x0F,
INTCAPA = 0x10,
INTCAPB = 0x11,
GPIOA = 0x12,
GPIOB = 0x13,
OLATA = 0x14,
OLATB = 0x15,

}


Kann ich da irgendwas tricksen?
 
MCP27013_RegsComp.png
 
Achso.
Wenn ich jetzt den Wert von dem Enum wissen möchte, kann ich nicht mit dem Struktur Operator drauf zugreifen oder?

z.B -> enum test{ a = 1, b = 2, c = 3};

uint8_t x = test.c;

das würde aber manche Sachen um einiges leichter machen oder?
 
Gedoppelte Werte sind zwar möglich, aber in fast allen Fällen unschön. Wie z. B. Invalid=0 und None=0.
Gedoppelte Namen geht nicht. Man greift ja per Namen drauf zu, welchen Wert soll der Compiler also nutzen? Das kann der für dich nicht entscheiden, du müsstest also das Design überdenken. Entweder du nutzt IOCON_1 und IOCON_2 (von mir aus auch A und B, wie auch immer), oder du teilst es auf in mehrere Enums. Das hängt vom Einsatzgebiet ab.
 
Habe ich mir schon fast gedacht.
Dennoch habe ich eine Frage...

Und zwar habe ich zwei Funktionen wo ich als Übergabeparameter "enum test Para" erwarte.
Mein enum habe ich in der Headerdatei x.h.

Nun habe ich diese Funktion in y.c geschrieben.
Ich konnte das auch ohne Probleme kompilieren, leider schlägt es fehl, wenn ich Die Prototypen in der y.h bekanntgebe und sie anderweitig verwenden will.

Was mache ich in Bezug der Bekanntmachung falsch?
 
Probiere es mal so:

In x.c am Anfang #include "x.h"

Danach in x.c den Prototyp der Funktion und die Funktion selber.
 
Habe ich ja gemacht?!
 
Aber nirgends erwähnt ;)
Das ist das Problem, du postest häufig nur Code Fragmente wo du glaubst dass da der Fehler drin ist. Aus eigener Erfahrung kann ich dir sagen: zu mindestens 90% ist genau da der Fehler nicht drin ;)
 
Anbei mal das Projekt.
Es geht um den einen Prototypen in mcp23017.h, der als Übergabeparameter eine "enum" erwartet.
 

Anhänge

  • HeschDevBoard.zip
    698,1 KB · Aufrufe: 2
Ich habe noch nicht in das Projekt geschaut.

Include die Headerdatei mit dem enum ebenfalls mal in der .h, dort wo die Prototypen definiert sind.
 
Das hatte ich auch schon gemacht. Da hat der Kompiler ganz rum gesponnen. Weiß echt nicht wo das Problem ist.
 
Füge einmal bei hard_def.h folgendes ein:

Am Anfang:
#ifndef HARD_DEF_H_
#define HARD_DEF_H_

Am Ende:
#endif
 
Das funktioniert.
Was ist jetzt anders? Habe es noch nicht ganz verstanden, wieso man das manchmal sieht und manchmal nicht.
Es ist nicht in allen Headerdateien zu finden...
 
Ich denke mal das .h File wird mehrfach aufgerufen und kompiliert. Bei dem enum kommt es dann zu Mehrfachdefinition (redeclaration). Das selbe passiert, wenn du eine Variable im .h definierst und dieser dort einen Wert zuweist.
 
Das heißt, wenn ich eine Header Datei in div. anderen Headern includiere kann es immer mal wieder vorkommen das die Fehler auftreten? Also generell das so schreiben?
 
Es kommt auf deinen Quellcode an. Erzeuge mal eine neue Header-Datei über Atmel Studio. Die Compilerdirektiven werden da bereits eingefügt.
 
Moin Moin...
Jetzt habe ich noch so ein ähnliches Problem...

Sobald ich..


CodeBox C

/* 7 segment char table */

const unsigned char CharTable7Seg[10] =

{
(LED_SEGMENT_A | LED_SEGMENT_B | LED_SEGMENT_C | LED_SEGMENT_D | LED_SEGMENT_E | LED_SEGMENT_F ),// 0

(LED_SEGMENT_B | LED_SEGMENT_C ),// 1

(LED_SEGMENT_A | LED_SEGMENT_B | LED_SEGMENT_G | LED_SEGMENT_E | LED_SEGMENT_D ),// 2

(LED_SEGMENT_A | LED_SEGMENT_B | LED_SEGMENT_G | LED_SEGMENT_C | LED_SEGMENT_D ),// 3

(LED_SEGMENT_F | LED_SEGMENT_G | LED_SEGMENT_B | LED_SEGMENT_C ),// 4

(LED_SEGMENT_A | LED_SEGMENT_F | LED_SEGMENT_G | LED_SEGMENT_C | LED_SEGMENT_D ),// 5

(LED_SEGMENT_A | LED_SEGMENT_F | LED_SEGMENT_G | LED_SEGMENT_E | LED_SEGMENT_D | LED_SEGMENT_C ),// 6

(LED_SEGMENT_A | LED_SEGMENT_B | LED_SEGMENT_C ),// 7

(LED_SEGMENT_A | LED_SEGMENT_B | LED_SEGMENT_C | LED_SEGMENT_D | LED_SEGMENT_E | LED_SEGMENT_F | LED_SEGMENT_G ),// 8

(LED_SEGMENT_A | LED_SEGMENT_B | LED_SEGMENT_F | LED_SEGMENT_G | LED_SEGMENT_C | LED_SEGMENT_D ),// 9

};


Das mit in den Header aufnehme, kommen folgende Fehlermeldungen..

upload_2017-5-31_7-14-29.png

Header ist mit im Anhang..

An was könnte das denn nun wieder liegen?
 

Anhänge

  • hard_def.h
    3,8 KB · Aufrufe: 5
Achso..
In manchen Codes sehe ich..


CodeBox C
#ifndef HARD_INIT_H_

#define HARD_INIT_H_


anstatt..



CodeBox C
#ifndef HARD_INIT_H

#define HARD_INIT_H


Wo ist da der Unterschied? Was ist richtig?
 
Wo ist da der Unterschied? Was ist richtig?
Unterschied liegt am '_' ;)

Beides ist richtig, du kannst aber auch schreiben ...



CodeBox C
#ifndef HEUTE_IST_ES_HEISS

#define HEUTE_IST_ES_HEISS

// ...

#endif


Das mit dem Unterstrich macht man (ich) oft, wenn die Definition nur innerhalb der Datei genutzt werden soll. Es ist nur eine "kosmetische" Sache.

Dirk :ciao:
 
Achso.
Und was sagst du zu #17?
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)