Bonjour � tous,
comme mentionner dans le titre j'ai un probl�me de template via un code qui m'a �t� donn� sur ce forum (et que j'ai compl�t�):
j'ai une structure qui d�finit une variable :
Et une m�thode template pour lire en m�moire :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8 struct var { uint64_t val; //valeur de ma variable (oui je stock toujours les valeurs sur 64bits) unsigned int accessSize //taille de ma variable unsigned int address //adresse de la variable unsigned int msb //rang du msb unsigned int lsb //rang du lsb }
Avec cette m�thode on lit de la taille du type qui contient la valeur de la variable et non de l'accessSize de la variable. J'ai donc essay� de refaire cette m�thode template pour avoir ca :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11 ttemplate <class T> void read(T& val, const unsigned char* data, int msb, int lsb, bool big_endian=true) { const size_t size = sizeof(T); typedef typename unsigned_<size>::type type; type *ptr = reinterpret_cast<type*>(&val); for(size_t i=0; i<size; ++i) ptr[big_endian ? size-i-1: i] = data[i]; val <<= (sizeof(val) * CHAR_BIT - msb - 1); val >>= lsb; }
Mais j'ai eu une erreur de compilation ligne 4 (cannot appear in a constant-expression)
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10 template <class T> void readn(T& val, const char* data, int msb, int lsb, int size, bool big_endian=true) { typedef typename unsigned_<size>::type type; type *ptr = reinterpret_cast<type*>(&val); for(size_t i = 0; i < size; ++i) ptr[big_endian ? size - i - 1 : i] = data[i]; val <<= size * CHAR_BIT - msb - 1; val >>= lsb; }
Donc quelqu'un m'a dit de faire ca :
C'est cool ca compile ! Le probleme c'est que qu'on l'appelle comme ca :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10 template <class T, size_t SIZE> void readn(T& val, const char* data, int msb, int lsb, bool big_endian=true) { typedef typename unsigned_<SIZE>::type type; type *ptr = reinterpret_cast<type*>(&val); for(size_t i = 0; i < SIZE; ++i) ptr[big_endian ? SIZE - i - 1 : i] = data[i]; val <<= SIZE * CHAR_BIT - msb - 1; val >>= lsb; }
Mais moi je veux pas lire d'une taille �crite en dur mais d'une taille contenue dans une variable !
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int main() { unsigned char data[1]; data[0] = 127; var variable; variable.val = 0; variable.accessSize = 1; variable.msb = 7; variable.lsb = 0; variable.address = 0; readn<uint64_t, 1/* EN DUR BERK*/>(variable.val, data, variable.msb, variable.lsb, true); return 0; }
Une genre de :
Si quelqu'un a une solution, ce serait sympa.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3 readn<uint64_t>(variable.val, data, variable.msb, variable.lsb, variable.accessSize, true); //OU readn<uint64_t, variable.accessSize>(variable.val, data, variable.msb, variable.lsb, true);
Merci d'avance.
Partager