Fastnat i tankarna
Postat: 17 mars 2015, 19:48:51
Jag har ju en funktion som gör att jag programledes i en µC kan "känna igen" ord och förstå kommandon i klar text.
Det fungerar skitbra - förutom idag då jag krånglade med det och mina uträkningar sket sig.
Såhär gör jag: (litet exempel)
const BYTE Comm_Text_Get[] = "Get";
const BYTE Comm_Text_Set[] = "Set";
const BYTE Comm_Text_Time[] = "Time";
const BYTE Comm_Text_Date[] = "Date";
Detta är de ord som kommandon kan styckas ihop av.
Sedan ska jag kunde indexera i dessa så att rutinen kan scanna igenom kommandosträngen och jämföra med dessa kommandoord. Alltså måste jag göra en tabell och för att få den till att bli en förutsägbar storlek blir den en tabell med BYTE*:
const BYTE* Comm_Texts[] = {Comm_Text_Get, Comm_Text_Set, Comm_Text_Time, Comm_Text_Date};
Jag behöver veta storleken på tabellen:
#define Comm_Texts_Size (sizeof(Comm_Texts) / sizeof(BYTE*))
Och nu kommer kruxet som ställer till det i mina tankar. Kommandon som ska kännas igen ska ju definieras. Och då kommer problemet:
enum {Index_Get, Index_Set, Index_Time, Index_Date};
#define Command_Get_Time ((Index_Get * Comm_Texts_Size) + Index_Time)
#define Command_Set_Time ((Index_Set * Comm_Texts_Size) + Index_Time)
#define Command_Get_Date ((Index_Get * Comm_Texts_Size) + Index_Date)
#define Command_Set_Date ((Index_Set * Comm_Texts_Size) + Index_Date)
Min rutin som känner igen kommandoorden tar dom steg för steg och räknar på samma sätt vilket betyder att när jag har de värden som motsvarar giltiga kommandon kommer en switch() att ta hand om dom.
Men problemet som kan uppstå när man börjar få lite olika ord är att enum{Index_???} och Comm_Texts[] kommer i otakt och då passar väldigt få värden.
Så är det någon som har en bra idé om hur jag kan "bygga upp" Index_??? utan att ha en separat tabell som ska vara synkroniserat med en enum-listan ville jag bli glad.
Denna gången löste jag det vid att ta data i Comm_Texts[] och kopiera det in i enum{} och göra en snabb search-&-replace - men detta sätt är ju FEL! (Läs "En man som heter Ove" för att förstå).
Det fungerar skitbra - förutom idag då jag krånglade med det och mina uträkningar sket sig.
Såhär gör jag: (litet exempel)
const BYTE Comm_Text_Get[] = "Get";
const BYTE Comm_Text_Set[] = "Set";
const BYTE Comm_Text_Time[] = "Time";
const BYTE Comm_Text_Date[] = "Date";
Detta är de ord som kommandon kan styckas ihop av.
Sedan ska jag kunde indexera i dessa så att rutinen kan scanna igenom kommandosträngen och jämföra med dessa kommandoord. Alltså måste jag göra en tabell och för att få den till att bli en förutsägbar storlek blir den en tabell med BYTE*:
const BYTE* Comm_Texts[] = {Comm_Text_Get, Comm_Text_Set, Comm_Text_Time, Comm_Text_Date};
Jag behöver veta storleken på tabellen:
#define Comm_Texts_Size (sizeof(Comm_Texts) / sizeof(BYTE*))
Och nu kommer kruxet som ställer till det i mina tankar. Kommandon som ska kännas igen ska ju definieras. Och då kommer problemet:
enum {Index_Get, Index_Set, Index_Time, Index_Date};
#define Command_Get_Time ((Index_Get * Comm_Texts_Size) + Index_Time)
#define Command_Set_Time ((Index_Set * Comm_Texts_Size) + Index_Time)
#define Command_Get_Date ((Index_Get * Comm_Texts_Size) + Index_Date)
#define Command_Set_Date ((Index_Set * Comm_Texts_Size) + Index_Date)
Min rutin som känner igen kommandoorden tar dom steg för steg och räknar på samma sätt vilket betyder att när jag har de värden som motsvarar giltiga kommandon kommer en switch() att ta hand om dom.
Men problemet som kan uppstå när man börjar få lite olika ord är att enum{Index_???} och Comm_Texts[] kommer i otakt och då passar väldigt få värden.
Så är det någon som har en bra idé om hur jag kan "bygga upp" Index_??? utan att ha en separat tabell som ska vara synkroniserat med en enum-listan ville jag bli glad.
Denna gången löste jag det vid att ta data i Comm_Texts[] och kopiera det in i enum{} och göra en snabb search-&-replace - men detta sätt är ju FEL! (Läs "En man som heter Ove" för att förstå).