Jump to content
johnmaia

Apontadores para funções dentro de uma Estrutura

Recommended Posts

johnmaia

Boa tarde,

Estou a tentar implementer uma lista de comandos, para evitar o uso do switch case.

Para isso criei uma estrutura de dados com este formato:

typedef struct sComando{
char *nome;
int nargs;
int (*Func)(char **args); 
} COMANDO;

typedef COMANDO* CMD;

  • nome: Indica o comando introduzido pelo utilizador (termo de comparação),
  • nargs: Indica o numero de argumentos que dada função irá aceitar,
  • Func: Guarda o apontador para uma função

Um dos sitios aonde estou a ter problemas é aqui:

CMD cmd[] = { 
	{"ONE", 2, do_one},
	{"TWO", 4, do_two},
	NULL
	};

Estou a receber os seguintes erros:

FUNCPOINTERS.c: In function ‘main’:
FUNCPOINTERS.c:53: warning: braces around scalar initializer
FUNCPOINTERS.c:53: warning: (near initialization for ‘cmd[0]’)
FUNCPOINTERS.c:53: warning: initialization from incompatible pointer type
FUNCPOINTERS.c:53: warning: excess elements in scalar initializer
FUNCPOINTERS.c:53: warning: (near initialization for ‘cmd[0]’)
FUNCPOINTERS.c:53: warning: excess elements in scalar initializer
FUNCPOINTERS.c:53: warning: (near initialization for ‘cmd[0]’)
FUNCPOINTERS.c:54: warning: braces around scalar initializer
FUNCPOINTERS.c:54: warning: (near initialization for ‘cmd[1]’)
FUNCPOINTERS.c:54: warning: initialization from incompatible pointer type
FUNCPOINTERS.c:54: warning: excess elements in scalar initializer
FUNCPOINTERS.c:54: warning: (near initialization for ‘cmd[1]’)
FUNCPOINTERS.c:54: warning: excess elements in scalar initializer
FUNCPOINTERS.c:54: warning: (near initialization for ‘cmd[1]’)

As funções do_one e do_two já estão definidas desta forma:

int do_one(char *args){
printf("ONE\n");
return 1;
}

int do_two(char *args){
printf("TWO\n");
return 1;
}

Share this post


Link to post
Share on other sites
jpedro20

em vez de:

typedef COMANDO* CMD;

colocas:

COMANDO cmd[] = {
                {"ONE", 2, do_one},
                {"TWO", 4, do_two},
                };

ou seja, crias um array em que cada posição é uma estrutura comando

Share this post


Link to post
Share on other sites
johnmaia

em vez de:

typedef COMANDO* CMD;

colocas:

COMANDO cmd[] = {
                {"ONE", 2, do_one},
                {"TWO", 4, do_two},
                };

ou seja, crias um array em que cada posição é uma estrutura comando

Antes de mais, obrigado pela tua resposta.

Fiz as alterações que sugeriste e com isso resolveu-se grande parte dos erros.

Agora, como esta é a primeira vez que eu tento fazer isto, não sei como por isto a funcionar correctamente.

{"ONE", 2, do_one},     
{"TWO", 4, do_two},

Nestas duas linhas estou a ter estes dois erros:

FUNCPOINTERS.c:51: warning: initialization from incompatible pointer type
FUNCPOINTERS.c:52: warning: initialization from incompatible pointer type

Share this post


Link to post
Share on other sites
falk0n

int (*Func)(char **args);

int do_one(char *args)

int do_two(char *args)

Se reparares os argumentos das 3 funções não são iguais, ou melhor o do_one e do_two não são iguais aos argumentos do Func.

Um é um apontador para apontador de char e o outro é para um apontador de char.

É por isso que te está a dar aqueles warnings.

Boas programações

Share this post


Link to post
Share on other sites
johnmaia

É tudo uma grande confusão...

**args seria para enviar um array de strings.

E cada uma das funções recebem esse tal array.

O que devo alterar?

Edit:

Já coloquei as funções nesta forma:

int do_one(char **args)

int do_two(char **args)

Obrigado por tudo :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.