c++ stm32
Postat: 13 juli 2012, 21:26:38
jag håller på och skriver lite kod i c++ för min microkontroller. Det finns vissa saker jag gärna skulle vilja göra men vet inte riktigt hur jag ska nå dit.
Det hela handlar om en meddelande pool där man har en gemensam buffer där man lägger sina meddelanden. Därefter har man "användare" som håller koll på vilket det senaste meddelandet var som man läst och kan på så sätt hålla koll på antal olästa meddelanden var för sig.
Det har blivit en hel del kod och jag tror inte att någon orkar läsa genom mina filer så jag tänkte pressentera en förenklad variant.
meddelandet ser ung ut såhär:
det finns en basklass för meddelandet:
samt olika typer av meddelanden som t.ex ett meddelande som innehåller tiden
såhär långt är allt frid och fröjd, skapar jag en klass av t.ex msgTime och kallar på headerToString kallas funktionen från basklassen medan om jag kallar på payloadToString kallas den specifika funktionen för msgTime som skriver ut tiden på ett snyggt sätt.
Det jag skulle vilja göra är att kunna omvandla sin bas-klass till en specifik typ av klass.
Som jag förstått det så innehåller en klass dels informationen från de variabler som är deklarerade inom klassen + en pekare (eller fler) till vilka funktioner som klassen ska använda. Så det jag egentligen skulle vilja göra är att ändra denna pekare från basklass till i detta fall msgTime klass.
jag har testat varianter av detta men antingen ger det kompilerings-fel eller så kallas fortfarande funktionerna från basklassen fastän man inom funktionen gjort en cast till det msgTime och returnerar pekaren som en typ av msgBase. Dynamic-cast går inte att använda, ger kompleringsfel eftersom det är en bantad variant av c++. (codesourcery för cortex m3)
går det att skapa en ny klass på samma adress som den gamla klassen?
eller finns det något smidigare sätt att ha en funktion i bas-klassen som kan omvandla sig själv till lämplig typ av meddelande?
ett annat alternativ skulle kunna vara att låta bufferten innehålla klasser istället för meddelanden. men då skulle jag vilja skapa en klass direkt i bufferten utan att behöva göra en kopiering från en variabel till bufferten. Dessutom klagar kompilatorn på att en array av klasser behöver initieras, vilket jag i detta fallet inte är intresserad av. klasserna kommer initieras när man lägger till dem i bufferten.
Misstänker att detta är väldigt enklet, har sökt en del på polymorphism och derived classes men har inte hittat något vettigt ännnu.
Det hela handlar om en meddelande pool där man har en gemensam buffer där man lägger sina meddelanden. Därefter har man "användare" som håller koll på vilket det senaste meddelandet var som man läst och kan på så sätt hålla koll på antal olästa meddelanden var för sig.
Det har blivit en hel del kod och jag tror inte att någon orkar läsa genom mina filer så jag tänkte pressentera en förenklad variant.
meddelandet ser ung ut såhär:
Kod: Markera allt
typedef struct
{
uint8_t type;
uint8_t size;
uint8_t payload[8];
}msgPacketBase_t
det finns en basklass för meddelandet:
Kod: Markera allt
class msgBase
{
void headerToString(uint8_t *outStr, uint32_t strSize);
virtual void payloadToString(uint8_t *outStr, uint32_t strSize); // skriver ut payload som rena hex-värden
void convertBaseToDerived(void);
}
Kod: Markera allt
class msgTime: public msgBase
{
void payloadToString(uint8_t *outStr, uint32_t strSize); // skriver ut payload som en tolkning av tiden.
}
Det jag skulle vilja göra är att kunna omvandla sin bas-klass till en specifik typ av klass.
Kod: Markera allt
void printPayload( msgPacketBase_t *ptr)
{
msgBase myMsg(*ptr);
myMsg.convertBaseToDerived();
pritf("%s", myMsg.payloadToString();
}
Kod: Markera allt
this = <static_cast>(msgTime*)this;
går det att skapa en ny klass på samma adress som den gamla klassen?
eller finns det något smidigare sätt att ha en funktion i bas-klassen som kan omvandla sig själv till lämplig typ av meddelande?
ett annat alternativ skulle kunna vara att låta bufferten innehålla klasser istället för meddelanden. men då skulle jag vilja skapa en klass direkt i bufferten utan att behöva göra en kopiering från en variabel till bufferten. Dessutom klagar kompilatorn på att en array av klasser behöver initieras, vilket jag i detta fallet inte är intresserad av. klasserna kommer initieras när man lägger till dem i bufferten.
Misstänker att detta är väldigt enklet, har sökt en del på polymorphism och derived classes men har inte hittat något vettigt ännnu.