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