Makro v C - "text" to uint32_t

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Úterý Listopad 7 11:45:17 CET 2017


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"): ...
>>> } 
>
> _______________________________________________
> 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