Vous devez spécifier une taille pour le membre du groupe message
dans la définition de struct:
#define N ... // maximum number of elements in message array
typedef struct
{
char *action;
char *message[N];
} lookuptab;
lookuptab tab[] = {
{"aa", {"bb", "cc"}},
{"dd", {"ee", "ff"}},
...
};
Dans ce cas, N doit être d'au moins 2.
Si vous voulez que chaque instance de la struct lookuptab
d'avoir un nombre différent d'éléments du tableau message
, alors vous devrez allouer chaque tableau message
séparément, ce qui signifie que vous ne serez pas en mesure d'utiliser un initialiseur statique:
typedef struct
{
char *action;
char **messages;
} lookuptab;
lookuptab *newEntry(const char *action, size_t numMessages, ...)
{
lookuptab *entry = malloc(sizeof *entry);
if (entry)
{
entry->action = malloc(strlen(action) + 1);
if (entry->action)
strcpy(entry->action, action);
if (numMessages > 0)
{
entry->messages = malloc(sizeof *entry->messages * numMessages);
if (entry->messages)
{
size_t i;
va_list ap;
va_start(ap, numMessages);
for (i = 0; i < numMessages; i++)
{
char *nextMessage = va_arg(ap, char *);
entry->messages[i] = malloc(strlen(nextMessage) + 1);
if (entry->messages[i])
strcpy(entry->messages[i], nextMessage);
}
}
}
}
return entry;
}
int main(void)
{
lookuptab *tab[ENTRIES]; // for some number of ENTRIES
tab[0] = newEntry("AA", 2, "BB", "CC");
tab[1] = newEntry("DD", 3, "EE", "FF", "GG");
tab[2] = newEntry("HH", 0);
...
}
au lieu de passer le nombre de messages explicitement, vous pouvez utiliser une sentinelle:
tab[0] = newEntry("AA", "BB", "CC", NULL);
mais vous devez soit faire défiler tous les arguments deux fois (premier à ge t le nombre d'allouer le tableau messages
, puis copier chaque message) ou vous devrez realloc()
votre tableau pour chaque message, tel que:
size_t numMessages = 0;
...
char *nextMessage
while ((nextMessage = va_arg(ap, char *)) != NULL)
{
char **tmp = realloc(entry->messages, sizeof *entry->messages, numMessages+1);
if (tmp)
{
entry->messages = tmp;
entry->messages[numMessages] = malloc(strlen(nextMessage) + 1);
strcpy(entry->messages[numMessages], nextMessage);
numMessages++;
}
}
Salut Jonathan! ce code a bien fonctionné! (et sans avertissements!) –
Je vais juste déballer mon ancien livre C pour comprendre cette construction;) (Java est en train de tuer mes compétences en ingénierie ...) –