[C] risoluzione ciclo infinito

davide84

Utente Attivo
45
0
Ciao a tutti, il seguente ciclo(posto all'interno del mio codice) mi si esegue all'infinito....quindi la domanda che vi faccio è la seguente:
come posso fare per fare in modo che non esegua all'infinito.....
praticamente quello che dovrebbe fare è eseguire il codice finchè in viennot1[o][p] c'è almeno un 3......



while(1){
for(o=0;o<=9;o++){
for(p=0;p<=9;p++){
if(viennot1[o][p]==3){
for(o=0;o<=9;o++){
for(p=0;p<=9;p++){
if(viennot1[o][p]==3)
{
viennot1[o][p]=1;
}
else
{
viennot1[o][p]=0;
}
}
}
esegui(viennot1);//è una funzione
}//chiusura while


Grazie a tutti.
Ciao.
 

ElFo!

Utente Attivo
1,053
12
CPU
Intel Pentium4 531 @ 3,6GHz
Scheda Madre
Asus P5B Deluxe WiFi
HDD
2x320 GB Hitachi - Raid 0
RAM
1 Gb Geil Ultra PC6400
GPU
Ati Sapphire Radeon X1300XT
Audio
Intel HD Audio (Azalia)
Monitor
Eizo Nanao FlexScan L367
PSU
460W Tagan
OS
Sabayon Linux 3.4e Core install :D - kernel 2.6.22 modificato
Il ciclo viene ripetuto finchè il while viene valutato vero.
Nel tuo caso siccome 1 è != da 0, il ciclo viene SEMPRE valutato vero, quindi ripetuto. Potresti modificarlo così:

codice ha detto:
int Cicle=1;

while(Cicle){
for(o=0;o<=9;o++){
for(p=0;p<=9;p++){
if(viennot1[o][p]==3){
for(o=0;o<=9;o++){
for(p=0;p<=9;p++){
if(viennot1[o][p]==3)
{
viennot1[o][p]=1;
Cicle=0;
}
else
{
viennot1[o][p]=0;
}
}
}
esegui(viennot1);//è una funzione

}//chiusura while
Spero di aver capito come deve funzionare il tutto, così quando trova 3 in viennot[o][p] lo sovrascrive con 1 e poi impone Cicle a 0, in modo che alla prossima valutazione della condizione di ciclo, trovi 0 ed esca.
 

davide84

Utente Attivo
45
0
Grazie ELFO per l'aiuto ma però così facendo il ciclo viene fatto solo una volta....invece il ciclo potrebbe ripetersi anche più di una volta......perchè dalla funzione esegui ritorna una matrice con dei 3.....e il mio ciclo deve andare avanti fino a che la matrice non presenta nessun tre....

se qualcuno mi può dare ancora un aiuto...lo ringrazio tantissimo...
 

ElFo!

Utente Attivo
1,053
12
CPU
Intel Pentium4 531 @ 3,6GHz
Scheda Madre
Asus P5B Deluxe WiFi
HDD
2x320 GB Hitachi - Raid 0
RAM
1 Gb Geil Ultra PC6400
GPU
Ati Sapphire Radeon X1300XT
Audio
Intel HD Audio (Azalia)
Monitor
Eizo Nanao FlexScan L367
PSU
460W Tagan
OS
Sabayon Linux 3.4e Core install :D - kernel 2.6.22 modificato
Fammi capire... Tu hai una matrice con dei numeri, la devi controllare tutta e se in una cella c'è un 3, nella stessa cella metti 1; altrimenti metti 0. Giusto?

EDIT: Per fare eseguire il ciclo più volte, basta che prima di richiamarlo rimetti cicle=1;
Se questo è il corpo di una funzione, basta anche solo la dichiarazione per "resettare" il valore.
 

davide84

Utente Attivo
45
0
Si praticamente se nella matrice che mi arriva dalla funzione c'è un 3 diventa 1 altrimenti 0.....li trasformo così perchè poi nella funzione la matrice viene modificata lavorando sugli 1 e 0 ma poi ne uscirà un'altra dove ci potrebbero essere dei 3.....
quindi ELFO cosa mi consigli di fare.....
intanto grazie....
 

ElFo!

Utente Attivo
1,053
12
CPU
Intel Pentium4 531 @ 3,6GHz
Scheda Madre
Asus P5B Deluxe WiFi
HDD
2x320 GB Hitachi - Raid 0
RAM
1 Gb Geil Ultra PC6400
GPU
Ati Sapphire Radeon X1300XT
Audio
Intel HD Audio (Azalia)
Monitor
Eizo Nanao FlexScan L367
PSU
460W Tagan
OS
Sabayon Linux 3.4e Core install :D - kernel 2.6.22 modificato
mmm ho capito...
La cosa migliore sarebbbe creare una funzione che controlli la matrice e la "sistemi" con 1 e 0.

comunque a questo punto il controllo io lo farei così:

codice ha detto:
while(Cicle){
for(o=0;o<=9;o++)
for(p=0;p<=9;p++)
{
if(viennot1[o][p]==3)
viennot1[o][p]=1;
else
viennot1[o][p]=0;
};;

//E fin qua controlla la matrice mettendo 1 dove trova 3 e 0 dove trova altri //numeri

esegui(viennot1);//è una funzione

}//chiusura while

Scusami sarà che sono lento, ma non capisco esattamente quando dovrebbe finire di eseguire il ciclo...
Il ciclo finora prende la matrice e la trasforma. Poi la passa alla funzione esegui() dando come argomento viennot1[0][0].
Da quello che ho capito poi esegui() compie altre azioni sulla matrice stessa e il ciclo deve esere rieseguito sulla matrice "nuova". Fin qua ci sono.
Però non capisco che condizione vorresti avere per terminare il tutto, intendo ad esempio dopo tot volte che lo fa, esce dal ciclo, oppure premo un tasto ed esce dal ciclo... Scusa ma non lo capisco proprio :(
 

davide84

Utente Attivo
45
0
Praticamente dopo tot volte esce dal ciclo....ovvero quando dalla funzione esegui gli arriva la matrice ma senza neanche un 3....
questa è la condizione che si deve verificare affinchè il ciclo si concluda.....
hai in mente qualcosa....
 

ElFo!

Utente Attivo
1,053
12
CPU
Intel Pentium4 531 @ 3,6GHz
Scheda Madre
Asus P5B Deluxe WiFi
HDD
2x320 GB Hitachi - Raid 0
RAM
1 Gb Geil Ultra PC6400
GPU
Ati Sapphire Radeon X1300XT
Audio
Intel HD Audio (Azalia)
Monitor
Eizo Nanao FlexScan L367
PSU
460W Tagan
OS
Sabayon Linux 3.4e Core install :D - kernel 2.6.22 modificato
ok ho capito allora.

Dunque io metterei una variabile in più che viene posta a 0 a inizio ciclo, viene incrementata ogni volta che il for trova un tre.
In questo modo ad ogni ciclo n, avrai in questa variabile il numero di 3 che erano presenti nella matrice al ciclo n-1.
Alla fine del ciclo basta quindi fare un if per controllare se non c'0erano 3 e in caso esci.

Una cosa del genere:

codice ha detto:
int Volte3=1; //Diverso da 0 in modo che il ciclo venga eseguito almeno una volta

while(Volte3!=0){
Volte3=0;

for(o=0;o<=9;o++)
for(p=0;p<=9;p++)
{
if(viennot1[o][p]==3)
{
viennot1[o][p]=1;
Volte3++;
}
else
viennot1[o][p]=0;
};;

if(Volte3!=0)
esegui(viennot1);//è una funzione

}//chiusura while

Dovrebbe andare proviamo... Al primo ciclo Volte3=1, quindi while viene eseguito (!=0), nel ciclo controlla la matrice e mettiamo ci siano due 3.
Lui cambia i 3 in 1 e gli altri numeri in 0, e Volte3 vale due.
Chiama esegui che rida una matrice senza 0.
Il ciclo riparte, volte3 è diverso da 0 quindi viene eseguito, la matrice viene scansionata e sistemata. Siccome non ci sono 3, stavolta Volte3 viene messo a 0, quidni al prossimo giro il qhile non funziona più ;)
In caso non ci siano 3, esegui() non viene chiamata...
Dovrebbe essere ok... Fammi sapere...
 

davide84

Utente Attivo
45
0
Elfo 6 Un Grande!!!!!!!!
Adesso Va In Maniera Perfetta!!!!!!!
Non So Come Ringraziarti!!!!!!!!
Finalmente Ho Potuto Concludere Uno Dei Miei Quattro Mini-progetti Per La Tesi!!!!!!
Grazie Ancora!!!!!!
 

ElFo!

Utente Attivo
1,053
12
CPU
Intel Pentium4 531 @ 3,6GHz
Scheda Madre
Asus P5B Deluxe WiFi
HDD
2x320 GB Hitachi - Raid 0
RAM
1 Gb Geil Ultra PC6400
GPU
Ati Sapphire Radeon X1300XT
Audio
Intel HD Audio (Azalia)
Monitor
Eizo Nanao FlexScan L367
PSU
460W Tagan
OS
Sabayon Linux 3.4e Core install :D - kernel 2.6.22 modificato
davide84 ha detto:
Elfo 6 Un Grande!!!!!!!!
Adesso Va In Maniera Perfetta!!!!!!!
Non So Come Ringraziarti!!!!!!!!
Finalmente Ho Potuto Concludere Uno Dei Miei Quattro Mini-progetti Per La Tesi!!!!!!
Grazie Ancora!!!!!!

Il mio servizio è birraware :birra: o in alternativa, puoi darmi una mano a fare la mia di tesi :lol: :lol: :lol:

Scherzo! In bocca al lupo! :ok:
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili