Página 1 de 1
Duvida sobre do while
Enviado: 16 Abr 2008 19:25
por ABeltrani
No exemplo abaixo:
Código: Selecionar todos
function NETUSE(arquivo,modo,segundos)
local psempre:=(segundos = 0)
do while (psempre .or. segundos >0)
if modo
use &arquivo exclusive new
else
use &arquivo shared new
endif
if !neterr()
return(.t.)
endif
segundos--
inkey(1)
enddo
return(.f.)
Alguem poderia me explicar o porque do uso da linha:
do while (psempre .or. segundos >0)
Não poderia usar:
do while segundos >= 0 ?
Não entendí a função da variável psempre.
Grato
Enviado: 16 Abr 2008 19:46
por gvc
Veja:
Segundos é a quantidade de tentativas para tentar abrir o arquivo. Se vc passar o valor 0, vai ficar tentando "eternamente".
Se vc passar um valor maior que zero, 3 p.e., a função vai fazer uma contagem regressiva de tentativas. Quando chegar a zero, sai do loop e retorna .F., indicando que não conseguiu abrir o arquivo solicitado.
Boa sorte. Espero ter ajudado.
Re: Duvida sobre do while
Enviado: 16 Abr 2008 20:26
por Maligno
ABeltrani escreveu:Alguem poderia me explicar o porque do uso da linha:
do while (psempre .or. segundos >0)
Não poderia usar:
do while segundos >= 0 ?
Sua dúvida procede, já que à primeira vista a variável
psempre parece estar sobrando. Mas não está. Note que, na medida em que psempre é atribuída, ela passa a ser um simples flag lógico, que não tem nada a ver com o tempo decorrido. Se você fatorasse e usasse
segundos >= 0, quando segundos se tornasse zero, aquilo que deveria ser limitado no tempo, passaria a ser infinito, o que seria um erro de lógica. Mas com o uso de psempre não há perigo disso acontecer. Se psempre for FALSE, quando segundos chegar a zero, a malha encerrará, finalizando a função.
Enviado: 16 Abr 2008 20:43
por ABeltrani
Quer dizer entao que se eu nunca for passar o valor de segundos = 0, posso retirar da função todas as declarações de psempre, pois ela só serve para fazer tentativas infinitas
Quer dizer, se eu chamar a função sempre dessa forma por exemplo:
netuse(arquivo,.t.,5) não precisa declarar mais a variavel psempre ?
Maligno, fiz o teste comparando segundos >= 0 e quando segundos checou a -1, saiu do loop. Quer dizer, mesmo quando segundos chega a zero, ele não altera psempre para .T.
Enviado: 17 Abr 2008 07:06
por Maligno
ABeltrani escreveu:Quer dizer entao que se eu nunca for passar o valor de segundos = 0, posso retirar da função todas as declarações de psempre, pois ela só serve para fazer tentativas infinitas

Exatamente. Se você sempre usará um tempo finito, pode remover psempre.
Maligno, fiz o teste comparando segundos >= 0 e quando segundos checou a -1, saiu do loop. Quer dizer, mesmo quando segundos chega a zero, ele não altera psempre para .T.
Mas se você remove o teste de psempre e usa apenas o teste (segundos >= 0), ele sempre sairá da malha quando segundos se igualar a -1. E de acordo com o código mostrado, o valor de segundos nunca interfere no valor lógico contido em psempre, que é fixado antes de entrar na malha.
Enviado: 17 Abr 2008 07:42
por ABeltrani
Ok Maligno !
Mais uma vez obrigado pelos esclarecimentos.
Abraço.
Enviado: 17 Abr 2008 08:55
por Pablo César
Foi bom colega ABeltrani, você ter toca esse assunto. Eu por exemplo removí o PSEMPRE e coloquei um como ntentativas no lugar e inserí mais dois parâmetros um indicando o númeor da área e outro o modo (se Exclusive ou Compartilhado).