- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 31

Thema: Preprocessor, bedingte Compilierierung

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast

    Preprocessor, bedingte Compilierierung

    hallo,
    ich möchte per bedingter Compilierierung meinen Code für verschiedene Zielplattformen anpassen, ähnlich wie hier:

    Code:
    #define TARGET 3 // willkürlicher Wert je nach Zielplattform
    #if TARGET==1
    /* code wenn TARGET gleich 1 ist */
    #elif TARGET==2
    /* code wenn TARGET 2 ist  */
    #else 
    /* code wenn TARGET  nicht 1 oder 2 ist*/
    #endif
    Der Wert der Konstanten für TARGET muss global im Kopf deklariert werden, also außerhalb von Funktionen.
    Daneben müsen die #if / #elif -Abfrage ebenfalls im Kopf möglich sein (für weitere globale #define-Konstanten, die sich daraus ergeben), zusätzlich aber auch im Code selber.
    - das geht mit den Zahlen-Konstanten auch soweit.

    A-Bär:
    meine Werte für TARGET sind nicht numerisch, sondern Buchstaben (U, M, Z, D oder E) -
    wie muss ich dann TARGET #definieren? und wie lauten dann die zugehörigen #if / #elif Abfragen?
    #define TARGET Z
    #if TARGET==Z // ???
    #if TARGET=='Z' // ???

    oder
    #define TARGET 'Z'
    #if TARGET==Z // ???
    #if TARGET=='Z' // ???

    oder
    const char TARGET = 'Z';

    und wie lauten dann die zugehörigen #if / #elif Abfragen?

    oder geht das gar nicht mit Buchstaben oder C strings?
    Geändert von HaWe (11.12.2017 um 14:09 Uhr) Grund: typo

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    ich würde ehrlich gesagt garnicht erst mit buchstaben und zahlen als abfragewert arbeiten

    ein einfache existensabfrage für das makro reicht schon ala
    Code:
    #define CASE_A oder #define CASE_B 
    und die abfragen per 
    #ifdef CASE_A 
    ... 
    #else ifdef CASE_B 
    ...
    #endif
    würde da schon reichen
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    HaWe
    Gast
    Zitat Zitat von Ceos Beitrag anzeigen
    ich würde ehrlich gesagt garnicht erst mit buchstaben und zahlen als abfragewert arbeiten

    ein einfache existensabfrage für das makro reicht schon ala
    Code:
    #define CASE_A oder #define CASE_B 
    und die abfragen per 
    #ifdef CASE_A 
    ... 
    #else ifdef CASE_B 
    ...
    #endif
    würde da schon reichen
    das ist im Handling zu schwierig, insbes. auch für die Folge- #defines/#if/#elif
    Daher müssen die Konstanten wechselnde Werte annehmen können, nicht nur "definiert sein".

    PS, edit:
    Was mir nicht klar ist, ist allerdings, ob das was sich hinter TARGET versteckt für den Preprocessor sowie immer schon nur (ggf. sogar verschieden lange) Zeichenketten sind, die mit == verglichen werden. Von daher wäre dann ein Z nichts anders als eine 2 oder zusammengesetze Konstanten wie M0 oder DUE oder was auch immer.
    Geändert von HaWe (11.12.2017 um 11:15 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    das ist im Handling zu schwierig
    ansichtssache, ich finde die andere richtung problematischer aber du könntest dir ein beispiel and en arduino libs nehmen die machen heftigstens gebrauch davon
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    HaWe
    Gast
    Zitat Zitat von Ceos Beitrag anzeigen
    ansichtssache, ich finde die andere richtung problematischer aber du könntest dir ein beispiel and en arduino libs nehmen die machen heftigstens gebrauch davon
    welche? ich habe bisher noch keine praktische Erfahrung mit so etwas. Auch das oberste Beispiel mit den Zahlen stammt aus einem Tutorial.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    also ich habe einen artikel gefudnen der sagt dass es nicht geht, nur mit umwegen und mangels arduino lib hab ich mal meine atmel libs befragt und die amchen ebenfalls den umweg über ifdef oder zahlenersetzungen

    damit wird aus -mmcu=atxmega128a4u -> #ifdef _AVR_ATXMEGA128A4U über eine funktion des avr-gcc

    ich ahbe das bei arduino ähnlich gesehen, lass dir doch mal die befehlszeile für deinen compiler anzeigen und such nach der boardbezeichnung und Suche dann im ganzen projekt danach, vielleicht hilft das

    https://stackoverflow.com/questions/...sor-directives
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  7. #7
    HaWe
    Gast
    keine Ahnung, welche Laus dir jetzt schon wieder über die Leber gelaufen ist, schließlich bist du ja der, der nicht auf meine Frage exakt geantwortet hast, sondern mit unverständlichen Beispielen und irreführenden Links geantwortet hast.

    Also noch mal die Ausgangsfrage vom TOP:

    Zitat Zitat von HaWe Beitrag anzeigen
    hallo,
    ich möchte per bedingter Compilierierung meinen Code für verschiedene Zielplattformen anpassen, ähnlich wie hier:

    Code:
    #define TARGET 3 // willkürlicher Wert je nach Zielplattform
    #if TARGET==1
    /* code wenn TARGET gleich 1 ist */
    #elif TARGET==2
    /* code wenn TARGET 2 ist  */
    #else 
    /* code wenn TARGET  nicht 1 oder 2 ist*/
    #endif
    Der Wert der Konstanten für TARGET muss global im Kopf deklariert werden, also außerhalb von Funktionen.
    Daneben müsen die #if / #elif -Abfrage ebenfalls im Kopf möglich sein (für weitere globale #define-Konstanten, die sich daraus ergeben), zusätzlich aber auch im Code selber.
    - das geht mit den Zahlen-Konstanten auch soweit.

    A-Bär:
    meine Werte für TARGET sind nicht numerisch, sondern Buchstaben (U, M, Z, D oder E) -
    wie muss ich dann TARGET #definieren? und wie lauten dann die zugehörigen #if / #elif Abfragen?
    #define TARGET Z
    #if TARGET==Z // ???
    #if TARGET=='Z' // ???

    oder
    #define TARGET 'Z'
    #if TARGET==Z // ???
    #if TARGET=='Z' // ???

    oder
    const char TARGET = 'Z';

    und wie lauten dann die zugehörigen #if / #elif Abfragen?

    oder geht das gar nicht mit Buchstaben oder C strings?

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    schließlich bist du ja der, der nicht auf meine Frage exakt geantwortet hast ... unverständlichen Beispielen und irreführenden Links
    träum weiter ganz einfach

    ich hätte aussagen wie "verwirrend" statt "irreführend" und "für mich unverständliche links" hingenommen, aber deine unbekümmerte art ohne nachdenken einfach zu plappern und leute vor den kopf zu stoßen ist einfach unverkennbar und macht eben deine persönlichkeit aus, mein angebot die postings im friedlichen zu löschen kannste dir an die backe kleben
    Geändert von Ceos (11.12.2017 um 14:32 Uhr)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  9. #9
    HaWe
    Gast
    Zitat Zitat von Ceos Beitrag anzeigen
    träum weiter ganz einfach
    das war als Beginn einer neuen Diskussion gedacht, eventuell weiß ja jemand - außer dir - ob es ggf doch geht, und wenn, wie genau.

    Also noch mal die Ausgangsfrage vom TOP....


    - - - Aktualisiert - - -

    Update:
    also, es funktioniert DOCH, irgendwie war beim Umstecken der Boards und Ändern der neuen dazu passenden #defines wohl Fehler passiert.
    Aber so geht es

    Code:
    #define TARGET 'D'
    
    #if TARGET=='Z'  
       // Code Z
    #elif TARGET=='E'  
       // Code E
    #elif TARGET=='D'  
       // Code D
    #else
       // Code default
    #endif

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    das hatte ich sogar erwähnt gehabt dass es compiler gibt die implizit einzelzeichen in ihren ascii wert umwandeln 'Q' = 81

    teste es einfach mal indem du folgenden code schreibst

    #define TARGET 'Q'

    #if (TARGET==81)

    sollte ebenfalls TRUE ergeben

    ist dennoch nicht standard sondern eine zugabe des spezifischen compilers
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Ähnliche Themen

  1. bedingte Compilierung in BASCOM
    Von jguethe im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 30.09.2012, 01:09

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test