Makro v C - "text" to uint32_t

Pavel Hudecek edizon na seznam.cz
Úterý Listopad 7 12:03:50 CET 2017


Tohle řešení jsem měl jako záložní pro případ, že by se praktičtější 
nenašlo. Jen to makro se jmenuje RGB24:-)

Asi to nakonec skončí if/else-if a makrem se strcmp s přetypováním a budu 
doufat, že to zas tolik času nesežere.

PH

-----Původní zpráva----- 
From: Jaroslav Buchta
Pokud se jedna o retezce pevne delky 3 znaky a pouziti ve switch, tak
bych do toho mozna sel takto (na 32b architekture kvuli zarovnani)

#define STR2UI32(s)  (((uint32_t)s[0] << 16) | ((uint32_t)s[1] << 8) |
((uint32_t)s[2] << 0))
#define CHARS2UI32(c1,c2,c3)  (((uint32_t)c1 << 16) | ((uint32_t)c2 <<
8) | ((uint32_t)c3 << 0))


char str[4];

switch (STR2UI32(str))
{
   case CHARS2UI32('a','b','c'):
     break;
}

Ale cert vi, jestli to bude prelozeno nejak efektivneji nez if...else if...

Dne 07.11.2017 v 11:22 Pavel Hudecek napsal(a):
> Ve skutečnosti toho moc nebude, ale je na to málo času. A jelikož se vždy 
> jedná o 3 znaky, přišlo mi zbytečně zdlouhavé na to volat strcmp a otravné 
> psát u něj přetypování, když buffer není char.
>
> PH
>
> -----Původní zpráva----- From: Jaroslav Buchta
> Pokud to bude zpracovavat terabajtove databaze s miliony ruznych slov,
> tak asi ano, jinak bych tam proste vrazil strcmp... ;-)
>
> Dne 07.11.2017 v 10:43 Miroslav Mraz napsal(a):
>> Tohle silně evokuje použití nějaké hash funkce. Nebude to sice 
>> jednoznačné, ale mohlo by to vyhovovat. Chtělo by to znát souvislosti, 
>> pak se dá doporučit lepší řešení. Vás napadlo tohle, ale třeba to již 
>> někdo řešil a ví, kde mohou být potenciální problémy.
>>
>>
>> Dne 6.11.2017 v 22:27 Pavel Hudecek napsal(a):
>>> uint32 byl jen součást příkladu použití vzniklého čísla
>>>
>>> Praktických využití je v daném programu více, např. i toto:
>>>
>>> switch (N) {
>>> case MAKRO("abc"): ...
>>> case MAKRO("xyz"): ...
>>> } 



Další informace o konferenci Hw-list