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).