PDA

Visualizza la versione completa : [C] Blocco del programma all'interno di un ciclo


goatboy
06-01-2015, 18:50
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:

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:


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? :confused:

Samuele_70
06-01-2015, 19:13
Controlla i valori dei vari parametri che invii alla funzione, alla prima chiamata, e poi alla seconda:bh:

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.

lovesemiramide
06-01-2015, 19:23
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.

goatboy
06-01-2015, 19:25
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.



// 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");
}

goatboy
06-01-2015, 19:27
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.

lovesemiramide
06-01-2015, 19:27
Hai scritto i++ invece che ++k...

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

goatboy
06-01-2015, 19:33
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


printf("**Generazione indici casuali**");

goatboy
06-01-2015, 19:44
Ho notato che nella prima iterazione genera sempre gli stessi numeri. Non capisco proprio perch. :confused:

EDIT: avevo cancellato la srand, per questo dava sempre gli stessi numeri. Sto al computer da troppe ore, evidentemente.

Loading