Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408

    [C] Blocco del programma all'interno di un ciclo

    Buonasera ragazzi

    Scusatemi per il titolo ma non sapendo cosa causa l'errore non sapevo cos'altro scrivere.
    Nel codice che sto scrivendo ho un ciclo dove chiamo due volte una funzione che genera dei numeri casuali. Alla prima iterazione nessun problema, alla seconda iterazione si blocca (senza andare in crash). Nella compilazione non risultano errori/warning, nel debug non segnala nulla. Penso si blocchi prima di entrare in generatoreIndiciCasuali, perchè con delle stampe nel main ho capito che si ferma lì. Escluderei quindi che l'errore sia nella funzione creaNuovoQuiz.

    Questo è il codice con il ciclo:
    codice:
    for(i=0; i<ripetizioni; i++){
        // Genero indici casuali per domande e risposte
        generatoreIndiciCasuali(indiciDomande, dim);
        generatoreIndiciCasuali(indiciRisposte, NUM_RISPOSTE);
        // Creo il nome del file, in modo progressivo
        char filename[30];
        sprintf(filename, "file%d.txt", i);
        // Creo un nuovo questionario con le domande mescolate
        printf("\n**Creazione nuovo quiz**");
        creaNuovoQuiz(q, dim, indiciDomande, indiciRisposte, filename);
        printf("\n\n");
    }
    La funzione generatoreIndiciCasuali è questa qui:
    codice:
    void generatoreIndiciCasuali(int indici[], int numDomande){
        int i=0, j=0;
        int n;
    
    
        srand(time(0));
    
    
        // Il primo numero generato posso inserirlo senza problemi
        n = (rand() % numDomande) + 1;
        indici[j]=n;
        j++;
    
    
        // Genero i numeri rimanenti
        for(i=1; i<numDomande; i++){
            n = (rand() % numDomande) + 1; // Generazione
            while(cercaElemento(indici, numDomande, n)==1){ // Verifica
                n = (rand() % numDomande) + 1;
            }
            indici[j] = n; // Inserimento nel vettore..
            j++;           // ..e incremento dell'indice
        }
    }
    Qualche delucidazione in proposito?

  2. #2
    Controlla i valori dei vari parametri che invii alla funzione, alla prima chiamata, e poi alla seconda

    la srand(time(0)); è meglio se la togli dalla funzione, magari all'inizio del main, o comunque in una posizione tale da venir richiamata una sola volta.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Penso si blocchi prima di entrare in generatoreIndiciCasuali, perchè con delle stampe nel main ho capito che si ferma lì. Escluderei quindi che l'errore sia nella funzione creaNuovoQuiz.
    Ma se la seconda volta non entra nemmeno in generatoreIndiciCasuali come fa ad essere lì il problema? Prova a mettere qualche breakpoint(o qualche printf) dopo creaNuovoQuiz e controlla se vengono mai raggiunti(o eseguiti).


    Nota: esistono algoritmi più efficienti per generare una sequenza casuale di numeri differenti e se ne è ampiamente discusso in numerosi altri post.

  4. #4
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Ho spostato la srand(time(0)) all'inizio del main. Ho provato a fare un ciclo for su indiciRisposte, per vedere che valori aveva. Mi da un ciclo infinito, non si ferma più. Non riesco proprio a capire perchè.

    codice:
        // Ciclo le operazioni
        for(i=0; i<ripetizioni; i++){
            printf("**Generazione indici casuali**\n");
            // Genero indici casuali per domande e risposte
            generatoreIndiciCasuali(indiciDomande, dim);
            generatoreIndiciCasuali(indiciRisposte, NUM_RISPOSTE);
              int k;
              for(k=0; k<4; i++){
                  printf("%d\t", indiciRisposte[k]);
              } 
    
    
            // Creo il nome del file
            char filename[30];
            sprintf(filename, "quiz%d.txt", i);
            // Creo un nuovo questionario con le domande mescolate
            printf("\n**Creazione nuovo quiz**");
            creaNuovoQuiz(q, dim, indiciDomande, indiciRisposte, filename);
            printf("\n\n");
        }

  5. #5
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Quote Originariamente inviata da lovesemiramide Visualizza il messaggio
    Ma se la seconda volta non entra nemmeno in generatoreIndiciCasuali come fa ad essere lì il problema? Prova a mettere qualche breakpoint(o qualche printf) dopo creaNuovoQuiz e controlla se vengono mai raggiunti(o eseguiti).


    Nota: esistono algoritmi più efficienti per generare una sequenza casuale di numeri differenti e se ne è ampiamente discusso in numerosi altri post.
    CreaNuovoQuiz lo raggiunge, perchè in quella funzione viene effettuata una stampa su file e il file viene creato correttamente. Quando inizio la seconda iterazione si blocca qualcosa.

  6. #6
    Hai scritto i++ invece che ++k...

    creaNuovoQuiz lo raggiunge, ma sei sicuro che esca dalla funzione?

  7. #7
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Quote Originariamente inviata da lovesemiramide Visualizza il messaggio
    Hai scritto i++ invece che ++k...

    creaNuovoQuiz lo raggiunge, ma sei sicuro che esca dalla funzione?
    Ho visto l'errore, ho corretto e i valori li stampa ora. Ma il problema non è risolto. Esce per forza dalla funzione perchè poi mi ristampa la
    codice:
    printf("**Generazione indici casuali**");

  8. #8
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Ho notato che nella prima iterazione genera sempre gli stessi numeri. Non capisco proprio perché.

    EDIT: avevo cancellato la srand, per questo dava sempre gli stessi numeri. Sto al computer da troppe ore, evidentemente.
    Ultima modifica di goatboy; 06-01-2015 a 20:47

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.