?
OK,
ich hab die Nacht noch an dem Problem gegrübelt. Hier ist eine Lösung die ich gar nicht so schlecht finde:
meine Datentyp Basisklasse
class CDataType
{
public:
CDataType(int position, double factor, double offset);
~CDataType(void);
virtual double getValue(char *buffer) = 0;
protected:
int m_position;
double m_factor;
double m_offset;
};
Für jeden Datentype baue ich jetzt eine eigene Klasse:
class CDataTypeSBYTE : CDataType
{
public:
CDataTypeSBYTE(int position, double factor, double offset);
~CDataTypeSBYTE(void);
double getValue(char *buffer);
};
class CDataTypeSWORD : CDataType
{
public:
CDataTypeSWORD(int position, double factor, double offset);
~CDataTypeSWORD(void);
double getValue(char *buffer);
};
/*
usw .....
*/
Beispiel Implementierung der einer Klasse:
// signed BYTE
CDataTypeSBYTE::CDataTypeSBYTE(int position, double factor, double offset) : CDataType(position, factor, offset) { }
CDataTypeSBYTE::~CDataTypeSBYTE(void) { }
double CDataTypeSBYTE::getValue(char *buffer) {
signed char value = *(buffer + m_position);
return ((double)(value * m_factor)) + m_offset;
}
Um auf das Beispiel von oben zurück zu kommen:
Konfiguration: 3 BYTE, 2 short, 1 DWORD
// init
CDataType *configDescription[6];
int posIndex = 0;
configDescription[0] = reinterpret_cast<CDataType*> (new CDataTypeUBYTE(posIndex, factor, offset));
posIndex += sizeof(BYTE);
configDescription[1] = reinterpret_cast<CDataType*> (new CDataTypeUBYTE(posIndex, factor, offset));
posIndex += sizeof(BYTE);
configDescription[2] = reinterpret_cast<CDataType*> (new CDataTypeUBYTE(posIndex, factor, offset));
posIndex += sizeof(BYTE);
configDescription[3] = reinterpret_cast<CDataType*> (new CDataTypeSWORD(posIndex, factor, offset));
posIndex += sizeof(WORD);
configDescription[4] = reinterpret_cast<CDataType*> (new CDataTypeSWORD(posIndex, factor, offset));
posIndex += sizeof(WORD);
configDescription[5] = reinterpret_cast<CDataType*> (new CDataTypeUDWORD(posIndex, factor, offset));
posIndex += sizeof(DWORD);
Später der Zugriff:
for (int index=0; index <6; index++) {
value = configDescription[index]->getValue(recBuffer);
}
Wer Syntaxfehler findet kann sie behalten. Die findet auch mein Compiler ....
Aber sonst ist konstruktive Kritik willkommen.
Gruß
Volker