Newsgroup: it.hobby.elettronica.digitale
Titolo: PIC18 exit da ciclo for()

Ho del codice simile a questo:
void Sequenza14(unsigned char passo)
{  for(i1=0;i1<20;i1++)
   {   mio codice;
       if(PORTCbits.RC0==0)
      { goto fine;
      }
   }
fine:
}
Ho bisogno che con PORTCbits.RC0=0
esegua il salto a fine:
Ricevo errore!
Esiste un modo che funzioni?
Grazie saluti.

Dany ha scritto:

Bisognerebbe capire cosa vuoi dire con "ricevo errore", però se è così 
come l'hai scritto, anche se orribile, dovrebbe funzionare.
Un modo più elegante sarebbe stato togliere il goto, togliere la label 
"fine", e mettere al posto del goto un semplice break.
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org

 -- 
Ok Francesco, ho utilizzato il break.
Saluti. 


Metti un break al posto del goto
oppure metti un "i1=99" al posto del goto
oppure togli il controllo e riscrivi la for come 
for(i1=0;(i1<20)&&(PORTCbits.RC0!=0);i1++)
Sulle ultime due se il compilatore è schizzinoso potresti avere qualche 
problema, ma la prima è il modo giusto per uscire da un ciclo (qualunque 
ciclo: for, do, while) prima del suo termine canonico.

 ciclo: for, do, while) prima del suo termine canonico.
onestamente a me il for come scritto sopra sembra l'unica soluzione 
pulita, non vedo perchè il compilatore dovrebbe lamentarsi. Le altre mi 
fanno schifo in modo più o meno marcato... Questione di gusti estetici, 
niente di personale ;-)
-- 
bikerfab
Viaggi in bicicletta, report foto e informazioni
Travelling by bicycle, report, pics and information
http://bikerfab.altervista.org/

 niente di personale ;-)
Tra le prime due e la terza c'è una differenza che potrebbe essere 
influente a seconda di quello che deve fare l'OP: la parte del codice prima 
della "goto" potrebbe venir eseguita una volta di "troppo" a seconda 
dell'istante in cui il bit cambia stato. 
(E poi vuoi mettere? Cambiare i valori delle variabili di controllo 
internamente al ciclo rende il codice meravigliosamente illeggibile :D)

 pulita
Non sarň certo io a negare ciň.
A pensarci bene, opinerei sulla pulizia.

 A pensarci bene, opinerei sulla pulizia.
qualsiasi cosa meglio di goto :-)
Comunque se non ricordo male (non ho il libro sottomano) anche sul K&R 
ci sono degli esempi simili di uso dell'espressione booleana del for.
Ovviamente tutto � opinabile; per dire, a me fa schifo vedere il codice 
scritto cos�:
void myfunction(void) {
....
...
}
invece che cos�:
void myfunction(void)
{
....
...
}
Ho anche qualche difficolt� a digerire il nome scritto come "MyFunction" 
invece che "myFunction". Questi sono residui di quando mi ero 
appassionato a Java, che considero il linguaggio di programmazione pi� 
elegante di tutti i tempi, tra quelli di mia conoscenza (non sono molti).


 ci sono degli esempi simili di uso dell'espressione booleana del for.
Ma l'uso del for in quel modo � assolutamente lecito, cos� come � lecita la 
forma for(;;){} per creare un loop infinito. 
Il fatto � che a causa delle "ottimizzazioni" (chiamiamole cos� :-) ) i 
compilatori da microcontroller spesso e volentieri gestiscono le variabili 
di controllo del ciclo in modo anomalo. Aggiungerci una condizione esterna 
pu� creare problemi. 

 Il fatto è che a causa delle "ottimizzazioni" (chiamiamole così :-) )
da un bel po' ho l'abitudine di disattivare tutte le "ottimizzazioni", 
evito di spaccarmi la testa su cose assurde senza senso. Se non funziona 
almeno so che è colpa mia.


 quelli di mia conoscenza (non sono molti).
Io ne conosco molti di più (non che ne abbia usati più di sei, contando per
uno l'assembly, che forse non è il caso), e qui affermo che più elegante
del C non può esistere nulla.

 almeno so che č colpa mia.
Sě, ma rimani comunque presuntuoso.
Non so se tutti i compilatori vengano scritti comme il faut,ma la teoria
relativa non č malaccio.
O ancora non credi che, oltre a non essere andati sulla Luna, gli umani non
siano riusciti a creare un computer che li batta a scacchi?

 }
A me fa schifo la seconda... anche perchè spesso e volentieri le graffe 
vengono messe male, e se dentro la funzione ci sono altri costrutti che le 
usano, rischiano di confonderti. Io sono uno di quelli che mette un commento 
accanto alla graffa chiusa per capire a chi si riferisce (oltre a indentare, 
ovviamente) :)
Mi è capitato anche di riconoscere la differenza tra due programmatori dal 
loro "stile" della suite di programmazione:
1) informatico - sfondo bianco, scritte nere, tipi blu, preprocessore verde, 
ecc.
2) elettronico - sfondo nero, scritte bianche, tipi verdi, preprocessore 
giallo, ecc.
Dite la verità.... :)
Ciao
CG