C preprocesor - kontrola obsahu definic s proměnným počtem

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Wolfik
Příspěvky: 1076
Registrován: 28 črc 2009, 02:00

C preprocesor - kontrola obsahu definic s proměnným počtem

#1 Příspěvek od Wolfik »

Potřebuju v průběhu překladu odstřelit proces překládání pomocí direktivy #error, pokud určitá definice je nastavena na určitou hodnotu - problém je, že těch definic může být libovolný počet...
Všechny definice se liší jenom v jednom znaku a pomocí pevné definice znám jejich počet.

Radši příklad:

Kód: Vybrat vše

#define POCET_DEFINIC 3

#define DEFINICE0 TRUE
#define DEFINICE1 FALSE
#define DEFINICE2 TRUE
No a chtěl bych jakousi for smyčkou projet tyto definice a pokud některá je FALSE, tak ukončit překlad přes #error.
ZKouším googlovat a experimentovat, ale vypadá to, že to prostě nejde.

Pokud by někoho zajímalo pozadí toho všeho, tak se jedná hlavičkový soubor, co mi vyplivne systém hw, který má některé nastavení neimplementované nebo neotestované a já na to píšu malý framework (API) pro kolegy.

Prozatím mám tvrdou aserci, že krkolomně při spuštění programu si to načtu do proměnných obsah všech definic a tu otestuju...Takže to odstřelí aspoň běžící program :D

Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 01:00

#2 Příspěvek od frpr666 »

Omlouvám se, ale nepochopil jsem důvod toho testování #define v cyklu.
Překlad C probíhá na jakém počítači a v jakém překladači?
Jak víme, preprocesor má omezený počet příkazů a cykly neobsahuje.
https://en.wikipedia.org/wiki/C_preprocessor

Klidně si můžeš napsat malý skript, který projede všechny .c (.h?) soubory projektu a udělá nějakou operaci, kterou si přeješ ještě před samotným překladem.

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#3 Příspěvek od mtajovsky »

Longin píše:... že krkolomně při spuštění programu si to načtu do proměnných obsah všech definic a tu otestuju...
To je snad zbytečné. Hodnoty lze testovat rovnou:

Kód: Vybrat vše

#define TRUE 1
#define FALSE 0

#define v1 FALSE
#define v2 TRUE
#define v3 FALSE

. . .

#if (v1 == TRUE) || (v2 == TRUE) || (v2 == TRUE)
#error "Some value was TRUE."
#else
   /* DO SOMETHIG USEFULL */
#endif
. . .
Pokud je některá z hodnot v1, v2, v2 TRUE, generuje se chyba.

Wolfik
Příspěvky: 1076
Registrován: 28 črc 2009, 02:00

#4 Příspěvek od Wolfik »

mtajovsky

no a teď si představ, že mi bude z hw vygenerován hlavičkový soubor, kde je těhle číslovaných definic víc...
třeba stovky a já tam budu muset mít dlouhej preprocesorovej if.

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#5 Příspěvek od rnbw »

mtajovsky píše:

Kód: Vybrat vše

#if (v1 == TRUE) || (v2 == TRUE) || (v2 == TRUE)
                                     ^^ BUG
:D

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#6 Příspěvek od mtajovsky »

rnbw << na jakém překladači? Na Visual C++ je to OK. Chyba je tam sémantická, třetí testovaná hodnota má být v3. Na následujícím řádku je samozřejmě syntax error, vynucená direktivou #error, když je některá hodnota TRUE. Alternativně lze napsat i zkráceně:

Kód: Vybrat vše

#if v1 || v2 || v3 
#error "Some value was TRUE."
#endif
Longin << v tom případě bych do generace hlavičkového souboru rovnou zahrnul i generaci podmíněného překladu s tou direktivou #error a s testováním všech vygenerovaných #define's jestli je to možné. Jinak si napsat vlastní skript a vygenerovat z hlavičkového souboru samostatný modul s těmito testy.

Wolfik
Příspěvky: 1076
Registrován: 28 črc 2009, 02:00

#7 Příspěvek od Wolfik »

jasné no...
dementní dotaz -co bys doporučil za skriptovací jazyk na tyto záležitosti?

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#8 Příspěvek od rnbw »

mtajovsky píše:rnbw << na jakém pøekladaèi? Na Visual C++ je to OK. Chyba je tam sémantická, tøetí testovaná hodnota má být v3.
Zozerie to asi kazdy prekladac, ale je to vyborna ukazka, preco to nie je dobre riesenie :)

BTW. Mozes to skusit napisat v jazyku Order: http://rosettacode.org/wiki/Order

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#9 Příspěvek od mtajovsky »

Longin << Perl nebo Python. Je to otázka osobních preferencí, já jsem dělal asi rok a půl skripty v Perlu, tak bych volil ten. Na textové extrakce byl vlastně stavěný původně - Practical Extracting and Reporting Language.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“