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 :

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'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.

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):

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 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 ?
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