1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Duvida no meu programa C

Discussão em 'Programação' iniciada por MAgister, 24 de Setembro de 2008. (Respostas: 6; Visualizações: 792)

  1. ola a todos este é parte do meu codigo para poder explicar o que pretendo:

    Código:
    case 2:
            inicio_semaforos();
            sem_a.vermelho = sem_b.verde + sem_b.amarelo + 1;
            sem_b.vermelho = sem_a.verde + sem_a.amarelo + 1;        
            outportb(LPT1,0x9);
            sleep(1*T);
    
            outportb(LPT1,0xc);
            sleep(sem_a.verde*T);
    
            outportb(LPT1,0xa);
            sleep(sem_a.amarelo*T);
    
            outportb(LPT1,0x9);
            sleep(1*T);
    
            outportb(LPT1,0x21);
            sleep(sem_b.verde*T);
    
            outportb(LPT1,0x11);
            sleep(sem_b.amarelo*T);
         break;
    
    neste "case" os semáforos vão ter um determinado comportamento,
    só que ao chegar ao fim ele faz o break e acaba. eu queria poder
    fazer correr a minha operaçao em laço e decidir, quando
    acaba-la, e fazer o break para voltar ao menu inicia. sera que
    alguem me consegue dar uma luz??
    obrigado.
     
    Última edição pelo moderador: 24 de Setembro de 2008
  2. ups

    ups Power Member

    Metes isso tudo dentro de um loop while...
     
  3. dentro do case ponho o while?.
    a condiçao é repetir a operaçao até, por exemplo, eu carregar numa tecla, e ai faz o break e volta ao menu.

    como fazer isso?
    obrigado.
     
  4. ups

    ups Power Member

    Sim.. dentro do case. Não é a solucao perfeita, mas deve funcionar. Para ficar mais limpo o codigo sugiro que ponhas o codigo a executar nesse case dentro de uma função.

    Mas adiante. O problema aqui é outro: detectar a tecla premida sem bloquear.

    Isso ja depende do sistema operativo.. mas suspeito que seja windows. Assim procura a função kbhit() na biblioteca conio.h . Acho que há outras soluções

    É uma questão de procurares na web o que é mais indicado para o teu SO e compilador.

    Juntando tudo (nao testei) deve ficar qq coisa assim:

    Código:
    case 2:
     inicio_semaforos();
     sem_a.vermelho = sem_b.verde + sem_b.amarelo + 1;
     sem_b.vermelho = sem_a.verde + sem_a.amarelo + 1;        
     ciclo_semaforos();
     break;
    
      ....
    
    void ciclo_semaforos(void){
     while( !kbhit() ){  // while not key pressed
    
      outportb(LPT1,0x9);
      sleep(1*T);
    
      outportb(LPT1,0xc);
      sleep(sem_a.verde*T);
    
      outportb(LPT1,0xa);
      sleep(sem_a.amarelo*T);
    
      outportb(LPT1,0x9);
      sleep(1*T);
    
      outportb(LPT1,0x21);
      sleep(sem_b.verde*T);
    
      outportb(LPT1,0x11);
      sleep(sem_b.amarelo*T);
      }
    }
    
    Infelizmente neste modo ele so quebra, no inicio do ciclo e nao a qq altura. Para ser em qq altura, tinhas que testar a tecla premida em mais alturas e arranjar maneira de interromper o sleep. Para uma solucao dessas tinhas que usar threads.
     
  5. boas.

    o que fizes t da mas acrescentei umas coisas para se tornar mais ou menos naquilo que pretendo.

    esta ai o meu codigo
    Código:
    case 2:
      inicio_semaforos();
      sem_a.vermelho = sem_b.verde + sem_b.amarelo + 1;
      sem_b.vermelho = sem_a.verde + sem_a.amarelo + 1;
      ver_semaforo(sem_a);
      ver_semaforo(sem_b);
      printf("pressione uma tecla para iniciar!");
      getch();
      
      ciclo_semaforos();
      clrscr();
      menu();
     
    assim depois de eu carrgar na tecla en vez de fazer break ele faz m vloar ao menu, como eu queria inicialment, agora en relaçao a terminar em qualquer momento, nao encontro nada j e disseram que era possivel so que nao encontro.
    obrigado pela tua ajuda, é mt precosa.
    Comps.
     
    Última edição pelo moderador: 24 de Setembro de 2008
  6. dark_splinter

    dark_splinter Power Member

    épa ... olha nem li o teu codigo .... mas posso te já dizer que mal vi o outport.... que tás tramado .... que eu também já tentei usar essas funções de acesso as portas e bla bla .... e que o que descobrir é que isso não funciona para maior parte dos compiladores e supostamente devido ao XP e procedentes, não deixarem essa função correr .... deve haver outra alternativa .... eu nunca mais voltei a pegar nisso ... se por acaso conseguires outra maneira diz.....

    Penso que em .NET consegues te safar bem com isso....


    PS: A não ser que teja a mexer em linux... ai já n sei....
     
  7. Boas Dark. Nao por acaso enconrei logo solução para este peoblema de trabalhar com a porta paralela no XP é facil basta inserir un ficheirozinho na pasta do SO e modificar uns numeros( os que designam a pota paralela) e ela fica disponivel para utilizar.
    eu tb no inicio nao sabia e tinha começado a trabalhar com um win95 que, nao tem essa segurança sobra a porta paralela.
    en todo caso se quiseres eu arranjo-te isso.
    Comps.
     

Partilhar esta Página