Willkommen in unserer Community

Werde Teil unserer Community und registriere dich jetzt kostenlos ...

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

C Aufzählungstyp - enum

Dieses Thema im Forum "Software" wurde erstellt von Janiiix3, 24. April 2017.

  1. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    929
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    Halli Hallo,

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



    CodeBox C und 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?
     
  2. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    929
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    MCP27013_RegsComp.png
     
  3. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    929
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    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?
     
  4. TommyB

    TommyB Premium Benutzer

    Registriert seit:
    17. Mai 2010
    Beiträge:
    1.553
    Zustimmungen:
    42
    Ort:
    127.0.0.1 ;)
    Sprachen:
    C#, Assembler, LunaAVR, VB.Net, Python
    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.
     
  5. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    929
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    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?
     
  6. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.963
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Probiere es mal so:

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

    Danach in x.c den Prototyp der Funktion und die Funktion selber.
     
  7. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    929
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    Habe ich ja gemacht?!
     
  8. TommyB

    TommyB Premium Benutzer

    Registriert seit:
    17. Mai 2010
    Beiträge:
    1.553
    Zustimmungen:
    42
    Ort:
    127.0.0.1 ;)
    Sprachen:
    C#, Assembler, LunaAVR, VB.Net, Python
    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 ;)
     
  9. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    929
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    Anbei mal das Projekt.
    Es geht um den einen Prototypen in mcp23017.h, der als Übergabeparameter eine "enum" erwartet.
     

    Anhänge:

  10. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.963
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    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.
     
  11. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    929
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    Das hatte ich auch schon gemacht. Da hat der Kompiler ganz rum gesponnen. Weiß echt nicht wo das Problem ist.
     
  12. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.963
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Füge einmal bei hard_def.h folgendes ein:

    Am Anfang:
    #ifndef HARD_DEF_H_
    #define HARD_DEF_H_

    Am Ende:
    #endif
     
  13. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    929
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    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...
     
  14. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.963
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    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.
     
  15. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    929
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    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?
     
  16. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.963
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Es kommt auf deinen Quellcode an. Erzeuge mal eine neue Header-Datei über Atmel Studio. Die Compilerdirektiven werden da bereits eingefügt.
     
  17. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    929
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    Moin Moin...
    Jetzt habe ich noch so ein ähnliches Problem...

    Sobald ich..


    CodeBox C und 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:

  18. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    929
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    Achso..
    In manchen Codes sehe ich..


    CodeBox C und C++
    #ifndef HARD_INIT_H_
    
    #define HARD_INIT_H_
    


    anstatt..



    CodeBox C und C++
    #ifndef HARD_INIT_H
    
    #define HARD_INIT_H
    


    Wo ist da der Unterschied? Was ist richtig?
     
  19. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    3.963
    Zustimmungen:
    98
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Unterschied liegt am '_' ;)

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



    CodeBox C und 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:
     
  20. Janiiix3

    Janiiix3 Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    929
    Zustimmungen:
    3
    Ort:
    Hannover
    Sprachen:
    C#
    Map
    Achso.
    Und was sagst du zu #17?
     

Diese Seite empfehlen

  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)