Re: C: XC8 velikost objektu při překladu.

Miroslav Šinko sinkomiro na gmail.com
Středa Leden 29 00:45:04 CET 2025


Skuste toto:

#define OBJECT_SIZE(name) \
   int i;\
   switch(i)\
   {\
     case sizeof(name):\
     case sizeof(name):\
       ;\
   }\

char object[20];
   OBJECT_SIZE(object);

Vo VS pri preklade napise:
error C2196: case value '20' already used

miro

On 28.1.2025 20:52, Miroslav Draxal wrote:
> Zdravím ve spolek.
> 
> Pro PICaře.
> 
> Docela jsem měl problém se zjišťováním, jak veliké budou struktury 
> v době překladu. Pak jsem je ukládal do EEPROM. Pomocí
> 
> #define se vybíraly různé konfigurace, dost do toho házeli vidle enum, 
> protože za překladu se předpokládá dvou bitová délka, následně 
> kompilátor to pokud lze seřízne na jeden byt. Samozřejme pokud platí 
> pravidlo hodnoty do 255.
> 
> Takže
> 
> //----------------------------------------------------------------------------------------------------
> 
> // Toto zajistí, že xc8 na to bude na enum přihlížet při překladu rovnou 
> jako na jeden byt.
> 
> typedef enum __attribute__((packed)) {
> 
>      leden = 1,
> 
>      unor,
> 
>      brezen,
> 
>      duben,
> 
>      kveten,
> 
>      cerven,
> 
>      cervenec,
> 
>      srpen,
> 
>      zari,
> 
>      rijen,
> 
>      listopad,
> 
>      prosinec
> 
> } Mesic_t;
> 
> //----------------------------------------------------------------------------------------------------
> 
> Totok zase vypíše jako chybové hlášení délku objektu v bytech
> 
> // <editor-fold defaultstate="collapsed" desc="Zjistí velikost objektu v 
> době překladu a vypíše jej jako chybové hlášení">
> 
> // uint8_t Objekt[20];
> 
> #    define OBJECT_SIZE(name) \
> 
>          typedef enum { \
> 
>              STRUCT_SIZE = sizeof(name) \
> 
>          }_Size_t; \
> 
>      _Static_assert(STRUCT_SIZE != 1, "Velikost objektu je 1 byt."); \
> 
>      _Static_assert(STRUCT_SIZE != 2, "Velikost objektu je 2 byty."); \
> 
>      _Static_assert(STRUCT_SIZE != 3, "Velikost objektu je 3 byty."); \
> 
>      _Static_assert(STRUCT_SIZE != 4, "Velikost objektu je 4 byty."); \
> 
>      _Static_assert(STRUCT_SIZE != 5, "Velikost objektu je 5 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 6, "Velikost objektu je 6 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 7, "Velikost objektu je 7 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 8, "Velikost objektu je 8 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 9, "Velikost objektu je 9 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 10, "Velikost objektu je 10 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 11, "Velikost objektu je 11 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 12, "Velikost objektu je 12 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 13, "Velikost objektu je 13 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 14, "Velikost objektu je 14 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 15, "Velikost objektu je 15 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 16, "Velikost objektu je 16 bytu."); \
> 
>     _Static_assert(STRUCT_SIZE != 17, "Velikost objektu je 17 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 18, "Velikost objektu je 18 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 19, "Velikost objektu je 19 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 20, "Velikost objektu je 20 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 21, "Velikost objektu je 21 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 22, "Velikost objektu je 22 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 23, "Velikost objektu je 23 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 24, "Velikost objektu je 24 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 25, "Velikost objektu je 25 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 26, "Velikost objektu je 26 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 27, "Velikost objektu je 27 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 28, "Velikost objektu je 28 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 29, "Velikost objektu je 29 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 30, "Velikost objektu je 30 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 31, "Velikost objektu je 31 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 32, "Velikost objektu je 32 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 33, "Velikost objektu je 33 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 34, "Velikost objektu je 34 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 35, "Velikost objektu je 35 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 36, "Velikost objektu je 36 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 37, "Velikost objektu je 37 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 38, "Velikost objektu je 38 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 39, "Velikost objektu je 39 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 40, "Velikost objektu je 40 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 41, "Velikost objektu je 41 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 42, "Velikost objektu je 42 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 43, "Velikost objektu je 43 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 44, "Velikost objektu je 44 bytu."); \
> 
>     _Static_assert(STRUCT_SIZE != 45, "Velikost objektu je 45 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 46, "Velikost objektu je 46 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 47, "Velikost objektu je 47 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 48, "Velikost objektu je 48 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 49, "Velikost objektu je 49 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 50, "Velikost objektu je 50 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 51, "Velikost objektu je 51 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 52, "Velikost objektu je 52 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 53, "Velikost objektu je 53 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 54, "Velikost objektu je 54 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 55, "Velikost objektu je 55 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 56, "Velikost objektu je 56 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 57, "Velikost objektu je 57 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 58, "Velikost objektu je 58 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 59, "Velikost objektu je 59 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 60, "Velikost objektu je 60 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 61, "Velikost objektu je 61 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 62, "Velikost objektu je 62 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 63, "Velikost objektu je 63 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE != 64, "Velikost objektu je 64 bytu."); \
> 
>      _Static_assert(STRUCT_SIZE <= 64, "Velikost objektu je větší než 64 
> bytu!");
> 
> //Použití pro zjištění velikosti objektu v bytech
> 
> // OBJECT_SIZE(Objekt);
> 
> // </editor-fold>
> 
> //--------------------------------------------------------------------------------------------------------
> 
> Dost mi to pomohlo v hledání chyby.
> 
> Míra
> 
> 
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list