Bạn cần phải xác định kích thước cho các thành viên message
mảng trong định nghĩa 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"}},
...
};
Trong trường hợp này, N phải ít nhất là 2.
Nếu bạn muốn mỗi trường hợp của lookuptab
struct để có một số khác nhau của các yếu tố trong mảng message
, sau đó bạn sẽ phải phân bổ mỗi message
mảng riêng biệt, có nghĩa là bạn sẽ không thể sử dụng một initializer tĩnh:
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);
...
}
Thay vì đi qua các số tin nhắn một cách rõ ràng, bạn có thể sử dụng một trọng điểm:
tab[0] = newEntry("AA", "BB", "CC", NULL);
nhưng bạn hoặc sẽ phải vòng qua tất cả các đối số hai lần (lần đầu tiên để ge t số phân bổ các mảng messages
, sau đó sao chép mỗi tin nhắn) hoặc bạn sẽ phải realloc()
mảng của bạn cho mỗi tin nhắn, chẳng hạn như:
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++;
}
}
Xin chào Jonathan! mã này hoạt động rất tốt! (và không có cảnh báo!) –
Tôi sẽ giải nén cuốn sách C cũ của mình để hiểu cấu trúc này;) (Java đang giết chết kỹ năng kỹ thuật của tôi ...) –