Aiutino

di il
8 risposte

Aiutino

Ciao a tutti

sto facendo un programmma, ma ho un problema ovvero quando lo mando in esecuzione mi si impalla.
Facendo un debug ho visto fino a dove riesce a farmi eseguire e ho visto dfove si impalla ma non riesco a risolvere il problema. Spero ci riusciate voi

Praticamente ho un qualcosa del genere

int main(void)
{
....
....
while (time()<te)
{
if (i<reader)
{
....
....
switch(event)
{
case 1:
............
i=i++;
break;
case 2:
............
i=i++;
break;
}
}
}
return 0;
}

praticamente lui mi fa il primo case poi si blocca non appena esce dal case1 con il break. mi sapete dire il perchè??????

sto impazzendo

se avete bisogno del codice completo ditemelo che ve lo mando.

8 Risposte

  • Re: Aiutino

    Ciao,

    Dal poco che hai postato mi pare abbastanza chiaro il problema...

    la case la esegui dentro ad una if(i<reader) che sta dentro al ciclo... non appena entri nella case che ti interessa aumenti i (tra l'altro perché usi un ridondante i=i++? un semplice i++; è più che sufficiente...)... otteni per tanto dopo la prima case (o, a seconda del valore di reader, dopo un po'di iterazioni) una cosa del genere:
    while(...)
    {
      if(i<reader) //FALSO
      {
         case che non viene mai raggiunta perché l'espressione soprastante è sempre falsa...
      }
    }
    Ciaociao
  • Re: Aiutino

    Ciao

    ho provato allora a fare una cosa di questo tipo

    int main(void)
    {
    ....
    ....
    while (time()<te)
    {
    if (i<reader)
    {
    ....
    ....
    switch(event)
    {
    case 1:
    ............
    break;

    case 2:
    ............
    break;

    }
    i++;
    }
    }
    return 0;
    }

    questa volta mi fa le operazioni ma dopo mi si impalla lo stess

    cioè fa quello che deve fare ma un avolta che irisaulta > reader mi si impalla e non mi estituisce i risultati.
    proprio non capisco aiutami
  • Re: Aiutino

    Ciao,

    Devi studiarti bene la logica che vuoi dare al programma...
    Hai spostato il problema fuori dallo switch, ma la cosa si ripresenta, come hai notato, non appena i diventa maggiore di reader (dopo un tot di iterazioni ottieni, come prima, un ciclo while con dentro una condizione sempre falsa).

    Spostare un incremento a caso non ha molto senso... la cosa deve essere studiata in base al comportamento che deve avere il programma.

    Probabilmente è errato usare i per il confronto con reader (è un'ipotesi), o comunque mantenere nello switch la condizione di terminazione e la if com'è adesso (immagino che l'interruzione del ciclo while dipenda in qualche modod da uno dei case). Altrimenti si può pensare ad un else che fa qualcosa quando la condizione diventa falsa (esce dal ciclo while o altro).

    Insomma, le soluzioni possono essere tante, ma tutte legate alla specifica implementazione e al comportamento che vuoi ottenere nel tuo codice. Se hai ben chiaro quello che deve succedere prova a ripensare il tutto in modo che le condizioni non si intersechino... cerca di avere ben chiaro cosa deve far terminare il ciclo e cosa implichi l'if (supponiamo che quando i<reader tu gestisci lo switch... la domanda giusta da farsi è: cos'è i? A cosa serve o cosa indica? E quando i diventa maggiore di reader cosa deve succedere a livello logico?)

    Ciaociao
  • Re: Aiutino

    Ora ti spiego un po' il tutto.

    Allora time è una funzione che mi fa avanzare il tempo di simulazione mentre te rappresenta il limite massimo.

    quindi con il while io dico svolgi quello che c'è dentro il while mentre il tempo di simulazione è inferiore al limite massimo (time<te).

    Dopo di questo voglio far si che ogni reader che vuole comunicare può svolgere una dei case presenti nello switch.
    Quindi servo il primo reader esco dallo switch mi chiedo se time<te, mi chiedo se ho finito di analizzare i reader i<reader se così vado avanti altrimenti esco e faccio esaurire il tempo di simulazione.

    Una volta che tutti i reader sono stati serviti e una volta che il tempo di simulazione è terminato il programma mi restituisce i risultati.

    Così ffacendo però ho il probema che mi si inceppa e non riesco a capire il motivo

    Ti prego aiutamiiiiiii
  • Re: Aiutino

    Ciao,

    L'inghippo è più evidente adesso che hai esplicato il problema...
    -il ciclo attende fino ad un certo tempo
    -all'interno del ciclo vuoi servire tutti i reader al momento disponibili, uno al giro (i reader sono 0..n).

    Quello che manca è qualcosa che fa ripartire i da 0 quando ha servito tutti ed n gli "utenti"... basterà quindi, come supposto più sopra, una i=0 in una else (quando i supera il numero di reader).
    In alternativa potresti processare reader utenti ad ogni iterazione della while, sostituendo la if con una for i=0;i<reader;i++

    Ciaociao
  • Re: Aiutino

    Ma io non voglio che gli n utenti siano riserviti.

    Cioè una volta serviti gli n reader voglio che finisca il tempo di simulazione e mi siano dati i risultati.

    Non so se ora è chiaro

    aspetto tue notizie
  • Re: Aiutino

    Ciao,

    Se vuoi uscire quando hai servito n reader (indipendentemente dal tempo raggiunto) basterà inserire una break nella else descritta più sopra (in questo modo, indipendentemente dal tempo, uscirà dalla while quando avrà servito tutti i lettori).
    Alternativamente alla break puoi:
    - impostare un booleano (supponiamo di chiamarlo -finito-) su false fuori dalla while
    - modificare la while (..tempo..) in while(..tempo.. && !finito) che uscirà dalla while o quando il tempo è scaduto oppure quando il booleano diventa true
    - impostare il booleano a true quando si deve avverare la condizione (ad esempio quando hai servito n utenti, nella else summentovata).

    Se invece vuoi che, una volta serviti tutti, l'algoritmo attenda solo il tempo per uscire dalla while (in sostanza serve n utenti ed aspetta che time() sia >= te), probabilmente c'è qualcosa che non va con te... come l'hai valorizzato esattamente? Sei certo che quella while termini (puoi provare rimuovendo temporaneamente tutto il codice da dentro alla while e guardando se sembra bloccarsi)?

    Ciaociao
  • Re: Aiutino

    Ok farò queste prove.

    cmq quello che a me serve mi pare che è proprio l'ultima opzione ovvero una volta servito gli n reader aspettoche finisca il tempo di simulazione e esco dal while.

    P.S. Siccome ora devo andare e torno verso le 19.00 io ti lascio il mio indirizzo msn così magari mi aggiungi e possiamo parlare istantaneamente e forse in modo più chiaro fammi sapere questo è il mio inidirizzo msn:

Devi accedere o registrarti per scrivere nel forum
8 risposte