Makro v C - "text" to uint32_t

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Úterý Listopad 7 09:38:54 CET 2017


Jit by to melo ale s tim zarovnanim by mohl byt na nekterych platformach 
opravdu problem. Ja bych s retezci takto nepracoval, nebo pokud uz to je 
nutne, asi by to chtelo slozit po bytech, neco jako
((uint32_t)s[0] << 24) | ((uint32_t)s[1] << 16) ...
Zas to je ale vhodne pro retezce se znamou pevnou delkou do par znaku. 
Jinak by se tam musel jeste nacpat test na 0 a cele to nejak zkombinovat 
aby se nesahlo mimo retezec, ale radsi bych na to fakt udelal funkci...

Dne 07.11.2017 v 9:19 Zuffa Jan napsal(a):
> zdravim,
>
> skusil som vo VS:
>
> #define  strtest(s) *(unsigned int *)s
> unsigned int a = strtest("aaa");
>
> a nehlasi to ziadnu chybu.
>
> j.
>
> -----Original Message-----
> From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Pavel Hudecek
> Sent: Tuesday, November 07, 2017 1:20 AM
> To: HW-news
> Subject: Re: Makro v C - "text" to uint32_t
>
> Pro jistotu jsem zkusil *, ale bez úspěchu:
>
> #define STRtoINT(s) *(uint32_t *)(s)
>
> Ještě jsem to zkoušel různě ozávorkovat, ale výsledek vždy stejný:
> error: label at end of compound statement
>
> (MCUXpresso IDE v10.0.2 [Build 411] [2017-07-11])
>
> PH
>
> -----Původní zpráva-----
> From: Pavel Hudecek
> uint32 byl jen součást příkladu použití vzniklého čísla
>
> Obecně mi jde o to, aby výsledkem bylo jedno číslo, asi jako kdybych tam napsal 12345. Použití * se v tomto případě trochu bojím, asi někdy narazí na chybu zarovnání, když ten text nebude ležet na správném místě. Radši bych donutil preprocesor, aby z toho udělal číslo.
>
> Praktických využití je v daném programu více, např. i toto:
>
> switch (N) {
> case MAKRO("abc"): ...
> case MAKRO("xyz"): ...
> }
>
> -----Původní zpráva-----
> From: Jaroslav Buchta
> A proc zrovna uint32_t?
> Pokud chcete prave 4 znaky na 32b cislo tak nejak takto
>
> uint32_t x = *(uint32_t *)"abcd";
>
> kdyz makro, tak
> #define MAKRO(s)  *(uint32_t *)(s)
> kde s bude ten retezec.
>
> Bezneji se ale pracuje s jednotlivymi znaky, to, co je mezi uvozovkami ma vlastnosti konstantniho pole znaku a da se k tomu pristupovat jako k poli cisel char *s = "abcdefgh..."; uint8_t a0 = (uint8_t)s[0]; ...
> Z toho si pak taky muzete vyskladat libovolne hodnoty.
>
> Dne 06.11.2017 v 21:13 Pavel Hudecek napsal(a):
>> z "ble" by mohlo být např. 'b' + 'l'<<8 + 'e'<<16 + 0 nebo ty bajty v
>> opačném pořadí, je to vlastně jedno.
>>
>> Tzn. jde mi o to, jak se v makru dostat k číslům reprezentujícím
>> jednotlivé znaky textu. Zbytek si už pak vyřeším sám.
>>
>> PH
>>
>> -----Původní zpráva----- From: Jaroslav Buchta
>>
>> A co si predstavujete, ze v tom x ma pak byt? Muzete napsat priklad ve
>> smyslu "xxxx" -> 0x.... ?
>>
>> Dne 06.11.2017 v 20:51 Pavel Hudecek napsal(a):
>>> potřeboval bych makro, se kterým by šla konstrukce typu:
>>>
>>> uint32_t    x = MAKRO("ble");
>>>
>>> jen vůbec nevím, jak v makru pracovat s textem (const char) a ani
>>> nevím jak to hledat.
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> 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