1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[C] Ponteiros para funções noutro ficheiro

Discussão em 'Programação' iniciada por Aparicio, 30 de Julho de 2008. (Respostas: 12; Visualizações: 901)

  1. Aparicio

    Aparicio /dev/mod
    Staff Member

    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
    Código:
    [B]int soma( int x, int y );[/B]
    
    int main( int argc, char **argv )
        {
        int (*func)( int x, int y );
        
        func = &soma;
        
        printf( "%d\n", (*func)( 5, 6 ) );
        
        return 0;
        }
    func.c
    Código:
    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?
     
    Última edição: 30 de Julho de 2008
  2. sapropel

    sapropel Power Member

    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.
     
  3. Aparicio

    Aparicio /dev/mod
    Staff Member

    Se não arranjar outra solução terei de fazer isso, mas gostava de saber se existe uma alternativa.
     
  4. FASC

    FASC Power Member

    A alternativa é mesmo essa. Os ficheiros header possibilitam entre outros, exactamente o que pedes.
     
  5. Aparicio

    Aparicio /dev/mod
    Staff Member

    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.
     
  6. FASC

    FASC Power Member

    "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
     
  7. Aparicio

    Aparicio /dev/mod
    Staff Member

    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.
     
  8. FASC

    FASC Power Member

    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.
     
  9. Aparicio

    Aparicio /dev/mod
    Staff Member

    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.
     
  10. FASC

    FASC Power Member

    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...
     
  11. Aparicio

    Aparicio /dev/mod
    Staff Member

    O Dev-cpp é bastante conhecido no Windows, e o compilador é o gcc.

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

    Baderous Banido

    Os apontadores para funções não são usados com esse propósito que pretendes. São usados por exemplo para callbacks. Apesar de também se poder fazer o que queres, não vejo vantagens nisso, e a solução dos headers é a mais indicada.
     
  13. Aparicio

    Aparicio /dev/mod
    Staff Member

    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.

    Código:
    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.
     

Partilhar esta Página