Página 1 de 1

Erro no uso de funções no MikroC

MensagemEnviado: 21 Set 2008 09:17
por lpagano
Tenho um programa aqui em que o mesmo tem 6 funções diferentes, incluíndo a main ( ).
Quando estou fazendo o programa e uma segunda função é chamada esta num determinado local chama uma terceira função. Após a chamada desta terceira função, há um local nessa terceira função em que a segunda função é chamada novamente.
Nesse ponto o compilador dá o seguinte erro: Undeclared identifier ["nome da segunda função"].

Para exemplificar melhor veja abaixo:

Código: Selecionar todos



void funcao_1 ( )
{

...
...
       funcao_2 ( );
...
...

}



void funcao_2 ( )
{

...
...
       funcao_1 ( );       // o erro acontece quando eu incluo essa linha
...
...

}



void main ( )
{

...
...
      funcao_1 ( );       
...
...

}






Ou seja, uma função 2 chama a função 3, e vice-versa.
Não necessariamente essas duas vão ficar num loop, isso depende das condições internas de cada uma, mas o compilador não está aceitando.

É claro que dentro das funções que eu falei, tem chamadas para outras funções em que não tive problemas na compilação.

Só para comentar, uma vez me disseram que o PIC tem um limite pequeno para esses "pulos" de programas, mais conhecidos como Stack Pointer. Será que tem alguma coisa em haver ou estou falando besteira?

Valeu!

MensagemEnviado: 21 Set 2008 12:08
por barboza
Seu problema deve estar na montagem do seu projeto e organização dos seus arquivos fontes.

Você fez a declaração dos prototipos das funções?

Poste seu arquivo fonte...

Re: Erro no uso de funções no MikroC

MensagemEnviado: 21 Set 2008 14:06
por Renie
Olá Ipagano,

Não sei como o MikroC vai montar isso, mas, este tipo de estrutura
recursiva é bem perigosa, se não for muito bem controlada, corre o
risco de estourar a pilha do PIC.

MensagemEnviado: 21 Set 2008 15:15
por joao
Ola Lpagano,

Provavelmente você precisa declarar essas funções.
o que acontece é uma função não consegue achar uma outra função que está abaixo dela. Pegando o seu código como exemplo, a função 2 está abaixo da função 1. Então, se vc chamar a função 1 dentro da funçào 2. Ou ainda chamar a função 1 ou 2 dentro do main, não tem problema, porque elas já foram criadas. Mas se a função 1 tentar chamar a funçào 2, você tem erro, porque ela está tentando chamar algo que ainda não foi criada.

Para resolver o seu problema, você precisa criar um prototipo da funções entre os includes e o começo da criacao das funcoes, como no exemplo abaixo:

Código: Selecionar todos
#include....
#include....

//Prototipo
void funcao_1 ( );
void funcao_2 ( );

//Inicio das funcoes
void main ( )
{

...
...
      funcao_1 ( );       
...
...

}

void funcao_1 ( )
{

...
...
       funcao_2 ( );
...
...

}



void funcao_2 ( )
{

...
...
       funcao_1 ( );       // o erro acontece quando eu incluo essa linha
...
...

}


Com os prototipos, agora é até possivel usar as funcoes depois do main.

Espero que tenha entendido.

[]'s

MensagemEnviado: 21 Set 2008 15:16
por joao
mensagem repetida.

MensagemEnviado: 21 Set 2008 15:46
por lpagano
joao,

Não sabia desse detalhe no C.

Por mim eu sempre fiz a função main ( ) como sendo a última da lista, ou seja, sem protótipos.

Mas fiz como você disse e aí na compilação deu erros de "Call Stack Overflow" e "Recursion or Cross-Calling funcao_1".

MensagemEnviado: 21 Set 2008 16:12
por joao
Olha,

Acho que dai esse erro pode ser o problema que o Renie comentou.
Porque é que nem recursividade. Vc acaba colocando na pilha(stack) a cada nova chamada de uma mesma função.
Eu sei que tem um limite no PIC, mas não sei de quanto que é. Quem souber, por favor, poste ai.
Mesmo assim, você pode colocar mais dados sobre os erros?(linha, função e etc)
Quem sabe é outra coisa que está acontecendo...

[]'s

MensagemEnviado: 21 Set 2008 19:33
por Sergio38br
boa noite, linha 16F a pilha é de 8 e a linha 18F é de 31 niveis

[ ]'s

Sergio

MensagemEnviado: 22 Set 2008 16:37
por lpagano
Sérgio,

Você escreveu o que eu iria escrever agora.

Bom, só para complementar eu estou usando o PIC 16F877A que tem 8 posições de pilha. Quando eu mudei para o 18F4520 que tem 31 posições o problema continuou.

No assembly desse código eu verifiquei que tenho 25 instruções "CALL" e nenhuma interrupção, portanto no 18F deveria funcionar.

Esse meu programa é aquele famoso reloginho com o DS1307 em que os comandos de configuração e leitura do barramento I2C criam vários CALLs no assembly.

O que vou tentar agora é eliminar essa chamada de função que está dando esse problema, ou seja, tentar voltar na função anterior de outra forma.


Valeu!

MensagemEnviado: 22 Set 2008 17:10
por turuna
Mas pra estourar a pilha da linha 16 só se; o programa está no main vc chama uma subrotina ai dentro desta se vc chamar outras 8 subrotinas sem um return ai sim estoura a pilha, mas se chamar e retornar ao main houve um desempilhamento e tudo permanece como antes...........

Turuna

MensagemEnviado: 23 Set 2008 13:45
por lpagano
turuna,

Então o meu problema não é esse pois tenho várias funções. Só na chamada da configuração do I2C que tem alguns CALLs. Mas antes nunca tive problema com isso.

Ontem eu já consegui fazer um jeito de evitar isso. Deu certo. Fiz vários SEs um dentro do outro.

Obrigado pela ajuda de todos!!!!