Bonjour à tous,
Après un retour de vacances je me remets au boulot et me retrouve confronté aux problèmes d'avant de partir
Pour vous exposer mon problème je vais synthétiser les étapes de mon problème.
Je dois faire un programme ou l'utilisateur crée des variables.
Au départ mon responsable m'avait dit d'utiliser une structure pour stocker la variable comme ceci :
Et quand je devais crée une variable je faisais un truc du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 enum TYPE_CODAGE { LIBRE = 0, ENT, ENT_S, REEL, ENUM, BOOLEEN, ASCII, TABLEAU, COMPLEXE, FICHIER_TECHNIQUE, }; struct sData { TYPE_CODAGE type; long long valeur; };
Bon voila c'était pas opti je pense surtout que je devais caster à tout va. Pour stocker ou lire les variables dans le type souhaité.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 QVector<sData> datas; sData data1; sData data2; //Si l'utilisateur a crée un int data1.TYPE_CODAGE = ENT_S; *(data1.valeur) = reinterpret_cast<long long*>(&MonInt); //Si l'utilisateur crée un float data2.TYPE_CODAGE = REEL; *(data2.valeur) = reinterpret_cast<long long*>(&MonFloat); datas.push_back(data1); datas.push_back(data2);
Puis je suis passé à un truc comme ca :
Et quand je devais crée une variable je faisais un truc du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 union Type { qint64 tInt; quint64 tUInt; double tDouble; char tChar[8]; }; struct sData { TYPE_CODAGE type; Type valeur; };
C'était un peu mieux mais bon le problème c'est que quelque soit le type, la valeur est stockée sur 8octets. Si on veut un int et qu'on le stocke dans 8octets cela pose problème quand on veut ensuite l'écrire une fonction comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 QVector<sData> datas; sData data1; sData data2; //Si l'utilisateur a crée un int data1.TYPE_CODAGE = ENT_S; data1.valeur.tInt = MonInt; //Si l'utilisateur crée un float data2.TYPE_CODAGE = REEL; data2.valeur.tDouble = monFloat; datas.push_back(data1); datas.push_back(data2);
On écrit 8octets même si la variable en contient moins.. Pas malin..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 template <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; }
Donc j'ai eu une longue conversation avec koala01 qui m'a convaincu d'utiliser des templates pour ma structure. Cela donne :
C'est niquel et cela colle avec la fonction readn !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 template <typename Type> struct sData { /* ca, c'est juste pour pouvoir récupérer le type en cas de besoin ;) */ using value_type = Type ; enum{accessSize = sizeof(Type)}; // la taille réellement utilisée en mémoire par Type (en bytes ;) ) value_type original; // la valeur d'origine (dans son type d'origine) };
Voila où j'en suis, je n'arrive pas à regrouper mes structures templates. Car si c'est pour avoir une liste d'int, une de float, une d' unsigned int et les remplir en fonction du type template, non merci quoi !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 sData data1; sData data2; //Si l'utilisateur a crée un int sData<int> data1; data1.original = MonInt; //Si l'utilisateur crée un float sData<float> data2; data2.original = MonFloat; /*Maintenant je veux stocker les deux structures dans une liste ou tableau (n'est ce pas un des principes de l'informatique? Regrouper ce qui se ressemble, qui a un lien.Donc j'essaye de faire cela :*/ QVector<Type> datas; // Je sais que c'est n'importe pas mais je vois pas comment faire.. //pour pouvoir faire: datas.push_back(data1); datas.push_back(data2);
J'ai l'impression d'être un peu f**ked et que finalement la meilleur solution était la première (ou finalement aucune des trois..)
Merci d'avance si quelqu'un a une solution.
Partager