Problema con un programma in C

di il
16 risposte

Problema con un programma in C

Buonasera apro questo topic perchè è da 6 ore che mi trovo bloccato su di una esercitazione su di un programma in linguaggio c.
Il problema è che questo programma quando lo giro sul terminale dopo aver inserito il valore che mi chiede lo scanf si blocca, cioè entra in qualche sorta di loop infinito senza mai arrivare alla fine , con alcune azioni di debug ho scoperto anche che mettendo un printf subito dopo la funzione che mi chiede di inserire il valore delle navi della flotta esso non viene letto dal compilatore .
Vi inserisco il link che vi manda al pdf con tutte le foto del programma poichè non sono riuscito ad inserirle come allegati qui, grazie per la pazienza! .

Link programma: http://www.fileconvoy.com/dfl.php?id=g254a5532a63a87439997793464a8423d68b380945

16 Risposte

  • Re: Problema con un programma in C

    Potresti postare il codice in forum con il tag
    ?
    e ti consiglierei di editare il titolo pure... è troppo generico
  • Re: Problema con un programma in C

    Classico problema col buffer dello stream. Puoi fare così
    
    setlinebuf(stdin);
    
    oppure
    
    void clearKeyboardBuffer(void);
    ....
    void clearKeyboardBuffer(void)
    {
      char ch;
      while((ch=getchar())!= EOF);
    }
    
    Il primo codice sostanzialmente dice al sistema di ripulire il buffer per stdin non appena viene premuto invio dopo l'immissione dei dati. Il comportamento varia molto in base al sistema operativo in uso.

    il secondo codice contiene una funzione per ripulire il buffer ed è stata rubacchiata a MAW. Il fatto che abbia incluso anche il prototipo di funzione non è un caso o un capriccio di estetica, ma serve al compilatore a rilevare più facilmente gli errori e dunque a prevenire l'introduzione di bug nel nostro programma.
  • Re: Problema con un programma in C

    Buongiorno , purtroppo ho messo il link perchè utilizzo una macchina virtuale che non mi permette di copiare il codice, se sapete un altro modo per ottenerlo me lo dite e cerco di farlo sicuramente.
    Invece loopunrolling ho usato il primo codice mettendolo nel int main() sia provandolo prima dello scanf e sia dopo ma continua a darmi lo stesso problema, la seconda funzione invece non la ho usata perchè non ho ben capito da che parte dovrei richiamarla nel int main

    ps:il titolo non riesco a cambiarlo.
  • Re: Problema con un programma in C

    giuseppe2009 ha scritto:


    Buongiorno , purtroppo ho messo il link perchè utilizzo una macchina virtuale che non mi permette di copiare il codice, se sapete un altro modo per ottenerlo me lo dite e cerco di farlo sicuramente.
    In questo caso la cosa più semplice è montare nella macchina virtuale una chiavetta USB e copiarci sopra i sorgenti (questo lo devi fare, almeno per fare un backup ogni tanto ): poi puoi collegare la chiavetta alla macchina vera (non virtuale) e visualizzare i files con un normale editor di testo
  • Re: Problema con un programma in C

    Il primo codice come già detto si comporta diversamente da sistema a sistema e talvolta viene ignorato. Il secondo codice va messo dopo la scanf che dà problemi. Chiaramente non va usata indiscriminatamente, ma con criterio che poi scoprirai continuando nello studio del C.

    Non avevo letto il codice prima,sorry. Il problema risiede in getint che è una funzione davvero orribile perché:

    - non effettua alcuna validazione degli argomenti.
    -non effettua nemmeno una minima validazione dell'input.
    - le funzioni devono ritorna bool o niente(quindi void)

    Prova a passare NULL,10,20 alla tua funzione getint e vedi che succede.
  • Re: Problema con un programma in C

    Candaluar putroppo già ci avevo provato solo che uso un file già pronto per la macchina virtuale dove esercitarmi il quale ha una password a me sconosciuta per fare questo tipo di procedure.
    Loopunrolling ho provato anche il secondo metodo ma continua a darmi lo stesso problema .
  • Re: Problema con un programma in C

    Potresti fare, anche via solo via debug, una prova stampando a video min, max e ris e prima della verifica della condizione falli stampare

    vedi intanto se i dati si recepisce in modo corretto.
  • Re: Problema con un programma in C

    giuseppe2009 ha scritto:


    Candaluar putroppo già ci avevo provato solo che uso un file già pronto per la macchina virtuale dove esercitarmi il quale ha una password a me sconosciuta per fare questo tipo di procedure.
    Curiosità: quindi hai una macchina virtuale "blindata" in cui non puoi collegare una chiavetta e non puoi nemmeno collegarti in rete?
  • Re: Problema con un programma in C

    Candulaur praticamente si , è blindata.
    Mikelius da quanto ho scoperto se metto un printf tipo "ciao mondo" prima della stringa N=getint(ecc.) mi printa il messaggio , mentre se la metto subito dopo questa funzione non me lo printa , come se non lo leggesse o entrasse in conflitto con qualcosa .
    Ho provato anche ad usare la seconda funzione che mi ha scritto <loopunrolling ma non funziona ugualmente , dopo che inserisco il valore nello scanf si blocca o fa delle operazioni infiniti che però io non vedo come potete vedere dalla foto del terminale nel link
  • Re: Problema con un programma in C

    Dicevo subito dopo la scanf, prima del controllo del while, dentro getint()
  • Re: Problema con un programma in C

    Allora se lo metto dentro la funzione getint il printf mi printa i valori corretti che inserisco, infatti se premo 13 mi printa che ris è 13 e min 10 e max 20, però poi mi rida sempre lo stesso problema che non va avanti
  • Re: Problema con un programma in C

    Il problema quindi è tutto nel while, non sarà problema di buffer...

    con dev-c++ una volta mi è capitato che non gli piacevano le ||..

    prova dentro il while !(!(ris<min) && !(ris>max)) che è la stessa identica cosa
  • Re: Problema con un programma in C

    Fatto ma non cambia nulla uguale a prima i valori dentro geint con il printf me li printa bene poi si blocca però secondo me il problema non è la funzione getint perchè essa funziona bene , poichè se metto 9 per esempio mi fa reinserire il valore , secondo me c'è qualcosa che gli da fastidio o nel corpo della funzione da quando inizia il do più esterno o sennò qualche altra cosa che lo fa entrare in un loop infinito .Perchè prima con alcune operazioni di debug ero riuscito a fare printare cosa accadeva all'interno del primo for più esattamente nel secondo do while e vedevo che lui mi printava all'infinito il numero casuale tra 0 e navirimstaaliene(esempio) come se appunto la condizione del while( array[]<=0) venisse sempre verificata e quindi non uscisse mai dal primo do while nel primo for
  • Re: Problema con un programma in C

    Adesso ho fatto un ulteriore prova mettendo subito dopo la funzione getint nel int main la funzione fprintf(stderr,"prova"); e con questo tipo di funzione invece il messaggio me lo stampo , non so se questo vi può essere d'aiuto
Devi accedere o registrarti per scrivere nel forum
16 risposte