Duvida sobre do while

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

ABeltrani
Usuário Nível 2
Usuário Nível 2
Mensagens: 54
Registrado em: 09 Nov 2007 10:05
Localização: Porto Ferreira-SP

Duvida sobre do while

Mensagem 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
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem 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.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Duvida sobre do while

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
ABeltrani
Usuário Nível 2
Usuário Nível 2
Mensagens: 54
Registrado em: 09 Nov 2007 10:05
Localização: Porto Ferreira-SP

Mensagem 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.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
ABeltrani
Usuário Nível 2
Usuário Nível 2
Mensagens: 54
Registrado em: 09 Nov 2007 10:05
Localização: Porto Ferreira-SP

Mensagem por ABeltrani »

Ok Maligno !

Mais uma vez obrigado pelos esclarecimentos.

Abraço.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem 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).
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder