Ir ao conteúdo
  • Cadastre-se

Ponteiro para função


joubet

Posts recomendados

:wacko:

Agora você conseguiu dar um nó na minha cabeça. Se passar tipos numéricos como ponteiro, não é a melhor a maneira de passa-los, qual seria ? pergunto isso, porque foi a única forma que deu certo. Se eu não declarar os parâmetros como ponteiro não poderei fazer:

func(&a, &b, &c);   

Ao transformar os parâmetros em tipos int comuns, ao compilar o programa, o compilador para nessa linha, e mostra uma série de erros. Realmente estou perdido.

Obrigado.

Link para o comentário
Compartilhar em outros sites

:(

Como fazer essa declaração ? Se eu não passar (a,b,c) como endereço e os argumetros como ponteiro não dá certo.

void Escrevenum( int (*func)(int, int, int) )

{
     int a=1,b=2,c=3;
     func(a, b, c);
      
   return
}

int Textonum(int num1, int num2, int num3 );

Se eu não declarar os parametros dessas funções como ponteiro,dá errado. Como fazer então ?

Pois como acima não funciona

Obrigado

Link para o comentário
Compartilhar em outros sites

:D

OK.

Fiz o seguinte teste:

void EscreveTexto( int (*func)(char*, int, char*) )

{
     char texto[20]={"parametros !"};
     func("passando funcao como argumento e", 3, texto);
  
   /* Executa função que foi passada como referencia */
  
   return;
}

Deu certo.

Quando mudei a linha abaixo, para:

func("passando funcao como argumento e", 3, &texto);

Tive a seguinte mensagem de erro:

C:\Meus documentos\funcarg.c In function `EscreveTexto':

24 C:\Meus documentos\funcarg.c [Warning] passing arg 3 of pointer to function from incompatible pointer type

Por que isso ? afinal estou seguindo as regras de passagem de valor por referência em funções Quando se passa um argumento (variável) por referência, este não deve ser passado por seu endereço ?

Obrigado

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Se você fizer isso:


func("passando funcao como argumento e", 3, &texto[0]);

Vaid ar certo, a variavel texto é uma array, o valor dela seria o endereço para os elementos dessa array, não é possível alterar o valor dela, é uma constante, apenas de seus elementos podem ser alterados, quando você tenta fazer apenas "&texto" ele tenta passar o endereço de uma constante, o que é ilegal, ao passar apenas "texto" ele passa esse endereço, que vai apontar para os elementos da array, quando passa "&texto[0]" ele vai passar o endereço do primeiro elemento dessa array, é equivalente a apenas "texto".

Link para o comentário
Compartilhar em outros sites

:palmas:

Ok. É verdade, além do mais quando se passa matriz por função por referência, somente o entereço do primeio elemento da matriz é passado para a função. Eu tinha esquecido disso.

Acho que podemos finalizar o estudo deste tema por hora. De quaquer forma, comente esse últiimo comentario meu para finalizarmos.

Obrigado.

Link para o comentário
Compartilhar em outros sites

:D

Li na apostila que você me passou, o seguinte tópico:

Modificadores de Funções

A forma geral de uma função é, como já foi visto,

tipo_de_retorno nome_da_função (declaração_de_parâmetros)

{

corpo_da_função

}

Uma função pode aceitar um modificador de tipo. Este vai modificar o modo como a função opera na passagem de parâmetros. A forma geral da função ficaria então:

modificador_de_tipo tipo_de_retorno nome_da_função (declaração_de_parâmetros)

{

corpo_da_função

}

O nosso curso não aborda detalhes do funcionamento interno de funções. Para saber mais, consulte o manual do seu compilador ou algum livro especializado.

- pascal

Faz com que a função use a convenção de funções da linguagem de programação Pascal. Isto faz com que as funções sejam compatíveis com programas em Pascal.

- cdecl

O modificador de tipo cdecl faz com que a função use a convenção para funções do C. Raramente é usado pois é o default. Pode-se pensar no cdecl como sendo o "inverso" do pascal.

- interrupt

Diz ao compilador que a função em questão será usada como um manipulador de interrupções. Isto faz com que o compilador preserve os registradores da CPU antes e depois da chamada à função.

1)Ao ler este tópico, me surpreendi, pois pensei que só os tipos base do C fossem modificadores de tipo de função.

Ex:

int func ( int a, char B)

{

corpo func

}

Como ficar uma função que retornasse esse tipo retorno (desculpe a redundância). Seria ?

interrupt int func ( int a, char B)

{

corpo func

}

Ou no caso teria que escolher entre int ou interrupt ? já que são dois tipos de retorno ? é isso que o texto não deixa claro.

2) Então, como acessar interrupções do computador via C ? e é assim que se consegue mostrar em tempo real o relógio do computador na tela ?

OBS: estou colocando esse tema aqui, por que já estamos discutindo função nesse tópico.

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

O "interrupt" declara uma função que um... interrupt handler...

Essas funções são chamadas em alguma interrupção de software ou hardware, mas antes que você se descabele com elas... No windows você só precisara se preocupar com isso se estiver programando drivers, alias, tentar usa-las sem estar em modo privilegiado resultara em um erro.

O relógio ou qualquer outra coisa você consegue com as APIs do Windows.

Link para o comentário
Compartilhar em outros sites

:D

Ok.

Mas fiquei sem saber, se a forma geral:

interrupt int func ( int a, int 

{ corpo func

return (0)

}

está certa.

É certo fazer modificador (no caso Interrupt) seguido do tipo de retorno da função ?

Poderia dar um exemplo simples (dentro do possível) usando Interrupt, tipo como acessar uma interrupção ?

Qual a vantagem de se modificar uma função para forma do pascal por exemplo ?

Obrigado

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

O "interrupt" não serve para acessar uma interrupção, e sim para fazer uma função que é chamada em uma interrupção...

Como uma interrupção não possui parâmetros de entrada e nem de saida a única forma valida é:


interrupt void teste(void);

Vou ficar devendo o exemplo, não tenho nenhum comigo.

Sobre a forma pascal, ela serve para melhorar a compatibilidade, permitindo que funções externas sejam acessadas, nunca precisei e nem vi alguem precisar dela.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!