View Full Version : [C] Ponteiros para funções noutro ficheiro


Aparicio
30-07-2008, 16:23
Boas,

estou a utilizar uns ponteiros para funções noutro ficheiro mas dá erro por a função não estar definida, para resolver isto tenho de estar a definir a função no mesmo ficheiro, mas para muitas funções não dá jeito.

Num exemplo simples:
main.c
int soma( int x, int y );

int main( int argc, char **argv )
{
int (*func)( int x, int y );

func = &soma;

printf( "%d\n", (*func)( 5, 6 ) );

return 0;
}func.c
int soma( int x, int y )
{
return x + y;
}O que eu queria era que isto funcionasse sem ser preciso o int soma( int x, int y ); no main.c.

Alguma sugestão?

sapropel
30-07-2008, 17:34
porque não usas headers? é para isso que eles servem.
fazes um func.h com as declarações todas, e um func.c com a definições todas e incluis o .h no main.c e pronto.

Aparicio
30-07-2008, 18:48
Se não arranjar outra solução terei de fazer isso, mas gostava de saber se existe uma alternativa.

FASC
30-07-2008, 19:37
A alternativa é mesmo essa. Os ficheiros header possibilitam entre outros, exactamente o que pedes.

Aparicio
30-07-2008, 19:55
Mas se para aceder a uma função noutro ficheiro não é preciso porquê que para associar um ponteiro à mesma função já é preciso declara-la nesse ficheiro? É isto que não percebo...

Eu só não queria sempre que escrevo uma nova função estar a declara-la noutro lado, mas sendo assim é isso que vou ter que o fazer.

FASC
30-07-2008, 20:16
"Não é preciso" não é bem assim. Depende da ordem com que compilas os ficheiros. Se queres aceder a funções de outro ficheiro, fazes um ficheiro .h para cada .c, apenas com os cabeçalhos e com os devidos "includes". No ficheiro .c não te esqueças de fazer o include do respectivo .h

Aparicio
30-07-2008, 23:21
Não é? Eu tenho um projecto com vários ficheiros que acedem às funções uns dos outros sem ser preciso declarar nada.
O único header que tenho é um comum a todos os ficheiros .c onde estão as bibliotecas e as estruturas.

FASC
30-07-2008, 23:34
Bom, eu estou a tentar ajudar... Estou-te a dizer que a maneira CORRECTA de o fazer é através dos ficheiros .h
Mas isso depende se estás a usar um IDE como o Visual Studio, ou não (linha de comandos em Linux, por e.x.). Se estiveres em linha de comandos, a ordem com que compilas os ficheiros pode mascarar esse problema e não ser necessário... Mas não é boa programação. Diz-te alguém que já programa há alguns anos em C...

Qualquer das formas precisas sempre de headers para o queres fazer. É a solução... Aceitas se quiseres, como é óbvio.

Aparicio
31-07-2008, 00:31
Não digo que estejas a dizer algo mal, só estou a tentar perceber isto de estar dividido em vários ficheiros.

Acerca disso da ordem, mesmo que tenha dois ficheiros que acedam a funções um do outro continua a não haver problema se não declarar as funções. Não deveria não ser assim pelo que dizes? :confused:

Estou a utilizar o Dev-cpp.

FASC
31-07-2008, 02:39
Não conheço o Dev-cpp. No entanto se for como dizes, com "referências cruzadas" não deveria dar para compilar... Pelo menos no gcc ele não resolvia a compilação.

Agora já sabes: cada ficheiro tem um .h, que pode fazer includes de outros .h. Desta forma fica tudo organizado, e quando tiveres muitas funções em cada ficheiro não tens de andar a vasculhar pelo código a tentar perceber se a função está nesse ficheiro ou não. É para isso mesmo que servem os headers - para resolver problemas de referências cruzadas, e para estruturar melhor o código. Senão usava-se tudo no mesmo ficheiro, o que não faz sentido nenhum...

Aparicio
31-07-2008, 03:29
O Dev-cpp é bastante conhecido no Windows, e o compilador é o gcc.

Bem, a ver se começo a utilizar mais os headers. :)

Baderous
31-07-2008, 13:40
Os apontadores para funções (http://en.wikipedia.org/wiki/Function_pointer) não são usados com esse propósito que pretendes. São usados por exemplo para callbacks (http://en.wikipedia.org/wiki/Callback_(computer_science)). Apesar de também se poder fazer o que queres, não vejo vantagens nisso, e a solução dos headers é a mais indicada.

Aparicio
31-07-2008, 14:19
Estou a utilizar mais especificamente num caso em que tenho vários if, cada um vai provocar uma acção diferente mas todos repetem uma parte.

char* (*func)( setcfg*, setvar*, msg_s );
func = NULL;

if( ... ) func = &funcão1;
else if( ... ) func = &funcão2;
else if( ... ) func = &funcão3;
...

if( func != NULL )
{
char *resp = (char*)(*func)( cfg, var, msg );
ptrcl_msg( cfg, var, resp );
free( resp );
}Acho que são úteis aqui visto não ter que repetir esta última parte para cada if.

Para isto funcionar é que terei de usar os headers para definir as funções de cada ficheiro.

Realmente vê-se no código de aplicações open-source que utilizam headers para cada ficheiro, eu é que como nunca precisei nunca os utilizei com esse propósito.