Sair de rotina por 'goto' e não por 'return' pode?

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Sair de rotina por 'goto' e não por 'return' pode?

Mensagempor zielpunkt » 20 Out 2006 17:41

Olá, pessoal.
A dúvida é a seguinte: chamo (call) uma rotina de, por ex, aquisição de dados (teclas, usart, etc) e nela eu trato a ocorrencia de algum possível erro (timeout, dados corrompidos, etc). Que problema pode causar uma saida incondicional, do tipo "goto", dessa rotina caso ocorra esse erro. Pode haver, em algum momento, problemas na pilha do PIC? A estrutura seria mais ou menos assim:

;------------------------------------------------------
leitura

le_entrada
erro ?
. sim -> goto main
(deu erro, não devolve nada e volta pro 'main' - essa é a dúvida)
salva entrada -> dado_temp
return
;------------------------------------------------------
grava_dados

call leitura
recupera & grava dado_temp -> dado
trata_dado
.....
return
;------------------------------------------------------
main
.....
call grava_dados
.....
call qquer_coisa
.....
goto main
;------------------------------------------------------

Obrigado.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Re: Sair de rotina por 'goto' e não por 'return' pode?

Mensagempor Renie » 20 Out 2006 18:04

Olá Zielpunkt!

Se você não utilizar os return's devidos , vai estourar a pilha, após o 8o CALL, os endereços de retorno serão sobrepostos, e fatalmente seu programa irá se perder ao encontrar algum Return (voltará para um endereço errado) .
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor zielpunkt » 20 Out 2006 19:02

Olá, Renie!

Então, a idéia seria evitar de ficar tratando uma excessão em cascata regressiva, o que nem sempre é necessário. Uma ou outra vá lá, mas quando vc tem uma série delas (to trabalhando num caso agora), a coisa fica muito repetitiva. Não existiria nenhum 'truque' que pudesse normalizar a pilha num caso desses sempre que se iniciasse o loop do 'main' (como no exemplo)?

Valeu!
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Re: Sair de rotina por 'goto' e não por 'return' pode?

Mensagempor Renie » 20 Out 2006 22:45

Olá Zielpunkt!

Basta colocar return no lugar do goto
le_entrada
erro ?
. sim -> RETURN (deu erro, não devolve nada e volta pro 'main' - essa é a dúvida
salva entrada -> dado_temp
return
;------------------------------------------------------

Se precisar voltar ao início da sua rotina principal conforme o resultado
da subrotina, ao invés de RETURN, use RETLW xx e teste o retorno
após a chamada da subrotina

le_entrada
erro ?
. sim -> RETLW x01 (deu erro, não devolve nada e volta pro 'main' - essa é a dúvida)
salva entrada -> dado_temp
RETLW 0
;------------------------------------------------------

...
...
CALL le-entrada
ANDLW 01
SKPZ
goto main
.....
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor zielpunkt » 21 Out 2006 08:43

Ôh, Renie, bom dia!

Essa estrutura padrão é a que utilizo. Na verdade, aplico uma série de flags para controle de fluxo nos meus programas, pra ficar mais inteligível e tal. A curiosidade era, exatamente, sobre a real inviabilidade de uso de outra estratégia para casos como citei. O que gerou minha questão é que às vezes existem algumas técnicas que desconhecemos, nada convencionais, e que proporcionam bons resultados. Mas que, definitivamente, não se aplica aqui. É isso.

Muito obrigado :wink:
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x