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