logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

problem dyrektywą warunkową z #if

aju_cor 29 Sie 2009 01:33 960 4
  • #1 6955895
    aju_cor
    Poziom 12  
    Witam!

    Mam problem z dyrektywą warunkową preprocesora #if.
    Do wykonania mam warunek w zależności którego definicja ADRES ma mieć różne wartości.

    Kod wygląda następująco:

    //#define DEVICE Dev_0
    //#define DEVICE Dev_1
    #define DEVICE Dev_2

    #if (DEVICE == DEV_0)
    #define ADRES 0x00
    #else
    #if (DEVICE == DEV_1)
    #define ADRES 0x10
    #else
    #if (DEVICE == DEV_2)
    #define ADRES 0x20
    #endif
    #endif
    #endif

    Rezultat zawsze jest ten sam ADRES = 0x00 bez względu, czy wybrana została definicja DEVICE Dev_1 lub DEVICE Dev_2...

    Jak sobie z tym poradzić?


    Procesor ATMega128 środowisko WinAVR 20060125
  • Pomocny post
    #2 6955923
    kwesoly
    Poziom 15  
    Po pierwsze:
    Dev_2 to nie jest to samo co DEV_2 - wielkość liter!

    Po drugie kompilator jeśli nie zdefiniowałeś czegoś ale używasz tego tylko wewnatrz porownan przyjmuje wartosc domyslną 0, wiec dzialanie wygląda tak:

    #define DEVICE DEV_2 //nie znam Dev_2 ale rozumiem że mam zastępować napis DEVICE napisem DEV_2

    #if (DEVICE == DEV_0) //Nie znam obu (ani DEVICE (zastapionego przez DEV_2) ani DEV_0) więc skoro 0==0 więc jest ok :)

    spróboj uzyc tego kodu:
    
    #define DEV_0 0
    #define DEV_1 1
    #define DEV_2 2
    
    //#define DEVICE DEV_0
    //#define DEVICE DEV_1
    #define DEVICE DEV_2
    
    #if (DEVICE == DEV_0)
    #define ADRES 0x00
    #elif (DEVICE == DEV_1)
    #define ADRES 0x10
    #elif (DEVICE == DEV_2)
    #define ADRES 0x20
    #endif /*DEVICE*/
    
  • #4 6956916
    kwesoly
    Poziom 15  
    Freddie Chopin napisał:
    Ewentualnie zamiast takich porównań musisz użyć dyrektywy #ifdef - prawda jeśli coś zostało wcześniej zdefiniowane.

    4\/3!!


    Racja, wydaje sie być to nawet częściej spotykane:

    
    //#define DEVICE_0
    //#define DEVICE_1
    #define DEVICE_2
    
    #ifdef DEVICE_0
    #define ADRES 0x00
    #elif defined(DEVICE_1)
    #define ADRES 0x10
    #elif defined(DEVICE_2)
    #define ADRES 0x20
    #else
    #error "DEVICE_x not defined"
    #endif /*DEVICE*/ 
  • #5 6958896
    aju_cor
    Poziom 12  
    Witam!

    @Wesoly - 'Dev_2' to zwykła literówka... zaadoptowałem Twój pierwszy fragment kodu i działa wysmienicie! Serdeczne dzięki!

    Pozdrawiam!
REKLAMA