2015-08-17 2 views
-1

Existe-t-il un moyen de définir une variable de taille variadique dans C? Par exemple, je souhaite définir une table dans laquelle les entrées de la table et la taille de chaque entrée doivent varier en fonction du fichier de configuration sans recompiler le code source.comment définir une variable variadique dans C

Pour définir dynamiquement les entrées de la table, nous pouvons utiliser malloc en C ou new en C++, mais comment est la taille? Je veux dire quelque chose comme ci-dessous

typedef union { 
    // the size of x is determined by the configuration file 
    typeof(x) x; 
    struct { 
    // n, m are read from the configuration file when the program is running 
    typeof(x1) x1: n; 
    typeof(x2) x2: m; 
    // Also, the fields should be variadic 
    ... //other_variable 
    }; 
}; 

Merci beaucoup, et l'idée me répondre s'il vous plaît, même si vous pensez suis ridicule.

+0

tableau alloué Dynamiquement, peut-être? –

+0

C et C++ sont assez différents pour cela, vous devriez donc décider lequel d'entre eux vous voulez. –

+0

Il n'y a pas beaucoup de questions sur les licornes de syntaxe: -P ... –

Répondre

1

C ne gère pas la définition de type à taille variable. Vous devez le gérer vous-même à l'aide de pointeurs et d'allocation de mémoire tels que malloc ou new.

C'est l'une des raisons pour lesquelles tant de programmes ont des fuites de mémoire ...

unsigned int n,m; // n, m are read from the configuration file when the program is running 

struct x { 
    x1_t * x1; 
    x2_t * x2; 
    ... //other_variables 
}; 

int xread(struct x *decoded, const char *datap, int size) 
{ 
    malloc(x->x1, m); 
    if (!x->x1) 
     return -1; 
    malloc(x->x2, n); 
    if (!x->x2) { 
     free(x->x1); 
     return -1; 
    } 
    memcpy(x->x1, datap, m); 
    memcpy(x->x2, datap+m, n); 
    ... // other_variables 
    return m+n;//+... 
} 

int xwrite(char *bufferp, const struct x *decoded) 
{ 
    // bufferp shall be allocated with at least m+n 
    if (x->x1) { 
     memcpy(bufferp, x->x1, m); 
     bufferp += m; 
    } 
    if (x->x2) { 
     memcpy(bufferp, x->x2, n); 
     bufferp += n; 
    } 
    ... // other_variables 
} 
+0

Incorrect, pour la taille: C a VLA, tableaux de longueur variable. Et puis l'OP connaît 'malloc' et' new'. –

+0

Oui, C a VLA pour gérer dynamiquement la taille de la table. (J'ai corrigé ma réponse.) Mais la question était sur les entrées de la table, pas la taille de la table. – Mike