Bonjour à tous,
Voilà j'ai un programme qui fonctionne (pour l'instant) très bien mais ce, avec un seul et unique type de données, un struct déclaré comme ceci :
J'aurais aimé faire en sorte de remplacer le uint64_t word par deux tableaux de type uint8_t de longueurs variables. Certains me diront que je n'ai qu'a stocker deux variables de type uint8_t* qui seront allouées dynamiquement à l'exécution mais cela me fait stocker deux pointeurs supplémentaires, ce que je ne souhaite pas. La mémoire utilisée est d'une importance cruciale pour moi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 typedef struct{ uint16_t type; uint64_t word; } obj;
J'ai cherché sur internet comment faire ceci sans avoir à dupliquer dupliquer mon code pour toutes les tailles de tableau possibles (dans une certaine limite), je ne souhaite pas traiter séparément chaque cas correspondant à une longueur x et y de mes tableaux. Je suis tombé sur ce tuto de programmation générique en C :
http://cecilsunkure.blogspot.de/2012...ming-in-c.html
J'ai donc écris ce code dans un fichier obj.h (j'ai changé les noms de variables et structures):
Ma première question est donc : puis-je utiliser le type OBJ dans du code qui n'est pas du macro, c'est à dire qui n'est pas executé par le préprocesseur ? Ou suis-je obligé de réécrire tout mon programme (ce que je ne ferais pas) dans ce style macro si je veux pouvoir l'utiliser ?
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
20
21
22
23
24
25
26
27
28
29
30
31 #ifndef DEF_OBJ #define DEF_OBJ #include <stdio.h> #include <stdlib.h> #include <stdint.h> #define DECLARE_TAB(A,B) \ typedef struct _LINE_##A##_##B \ { \ uint8_t tab1[A]; \ uint8_t tab2[B]; \ } LINE_##A##_##B; #define DECLARE_OBJ(A,B) \ typedef struct _OBJ \ { \ uint16_t type; \ LINE_##A##_##B obj; \ } OBJ; \ \ OBJ *CREATE_OBJ(A,B); #define CREATE_OBJ(A,B) \ OBJ *CREATE_OBJ(A,B) \ { \ return (OBJ*)malloc(sizeof(DECLARE_OBJ(A,B)));\ } #endif
Ma deuxième question est : ce code est-il valide d'après vous ?
Je vous remercie encore de votre aide et vous souhaite une excellente journée et/ou soirée![]()
Partager