Sto creando un'applicazione client/server e desidero chiamare le funzioni in modo dinamico. ho creare la seguente struct:Elementi non definiti nell'array struct
typedef struct _cmd cmd;
struct _cmd
{
const char *name;
void (*func)(int s,int ac, char **av);
};
Quando il client invia un comando al server il server navigare attraverso una serie di comandi:
cmd cmds[] = {
{ "CREATE", cmd_create },
{ "EXIT" , cmd_exit },
{ "LIST", cmd_list },
{ "READ", cmd_read },
{ "DELETE", cmd_delete },
{ "UPDATE", cmd_update }
};
cmd *find_cmd(const char *name) {
cmd *c;
for (c = cmds; c->name; c++) {
if (stricmp(name, c->name) == 0)
return c;
}
return NULL;
}
prega di non che
stricmp()
non è un refuso, è una versione insensibile alle maiuscole e minuscole di strcmp.
Ora ho il seguente problema. Quando chiamo find_cmd() e passo un comando non valido, la mia applicazione si blocca. i miei messaggi di debug hanno mostrato quanto segue:
Browsing Command: CREATE
Browsing Command: EXIT
Browsing Command: LIST
Browsing Command: READ
Browsing Command: DELETE
Browsing Command: UPDATE
Browsing Command: �p�
Browsing Command: �(�
Dopo che ottengo il segfault. Questo mi sembra come se ci fossero degli elementi indefiniti in quella struttura, ma da dove vengono? Cosa sto trascurando? Grazie in anticipo per eventuali suggerimenti.
Hai bisogno di un [valore sentinella] (http://en.wikipedia.org/wiki/Sentinel_value) di sospendere l'elenco dei comandi. Poiché si tratta di una struttura, il puntatore null e il puntatore a funzione nulla funzioneranno. – Joe
Non la risposta, ma solo nota. Non utilizzare l'identificatore che inizia con '_' perché è riservato all'implementazione. – Jack
Grazie per i suggerimenti, questo funziona bene, vedere il mio commento qui sotto :) –