Newsgroup: it.comp.lang.visual-basic
Titolo: Istruzione mancante in VB

Buongiorno a tutti.
Possibile che non esiste in VB un'istruzione che interrompe l'iterazione
corrente di un ciclo e avvia una nuova iterazione?
Mi spiego:
for i = 0 to 100
    if m(i) = "A"  then [Vai Alla Prossima Iterazione]
    ...............
    ..............
next

 ha scritto nel messaggio
news:hZNt9.70212$RO.17...@twister1.libero.it...

Brutto come la fame, ma funziona:
Private Sub Command1_Click()
Dim i As Long
For i = 1 To 100
Inizio_Loop:
Debug.Print "Entro nel Loop con i=" & CStr(i)
If i = 50 Then Exit For
If i = 25 Then
    i = i + 1
    GoTo Inizio_Loop
End If
Debug.Print "Esco dal Loop con i=" & CStr(i)
Next i
End Sub
Osservare il caso i=25 e i=49 come ultimo.
Ciao
Alberto

 ha scritto


     if m(i) = "Z"  then Exit For
     if m(i) <> "A"  then
         ...............
         ..............
    End If
 next

      if m(i) = "Z"  then Exit For
No, non era questo che intendevo, non volevo uscire dal ciclo, ma solo
riprenderlo dall'iterazione successiva, cioč uscire e rientrare con l'indice
incrementato.
Altri linguaggi hanno istruzioni tipo Continue che lo fanno, per farlo in VB
bisogna mettere un'etichetta all'inizio del loop e incrementare
"manualmente" il contatore, come ha postato Alberto.


 next
Semplicemente perchè una logica di questo tipo è errata (per fortuna *NON*
lo fa fare!)
for i = 0 to 100
    if m(i) <> "A"  then
        'fai quello che devi fare
    end if
next
Ciao
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.net
"

 >      if m(i) <> "A"  then
Ma questo l'hai visto?


 "manualmente" il contatore, come ha postato Alberto.
Oppure, e ci ho pensato dopo, una label prima del next e fare goto su
quella, cosě si evita anche di dover gestire lo step. Perň a questo punto
diventa di fatto uguale a quella di Lupo.
Ciao
Alberto

 (per il mio modo di lavorare), ma indubbiamente funziona.
Ti capisco: Anch'io, quando le indentazioni sono tante e con blocchi lunghi
preferisco decisamente fare un Goto nome_parlante_della_label. Può essere
(anche se il Goto non è, si dice, elegante) più leggibile/comprensibile.

 > >  next
E' vero, ho letto di corsa e non avevo capito.
Ciao

 (per il mio modo di lavorare), ma indubbiamente funziona.
Perchè? qual è la differenza in leggibilità e cicli macchina tra
 for i = 0 to 100
    if m(i) <> "A"  then
    End If
 next
e
 for i = 0 to 100
    if m(i) = "A"  then Goto Label
Label:
 next
?
A me sembra che la prima sia più pulita e forse anche più veloce.


 [SNIP]
Meno brutto ;-) :
   For i = 0 to 100
      If m(i) = "A"  Then Goto NextValue
      '.....
NextValue:
   Next i
End Sub
hth,
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt

 A me sembra che la prima sia più pulita e forse anche più veloce.
La differenza è nelle cose che non ci sono negli esempi.
Immagina di avere, dentro all'IF, duecento righe di codice, a loro volta
composte da If, Case, ecc...
E immagina di avere, anzichè un solo punto in cui può capitare di dover
uscire, altri cinquanta punti sparsi qua e là.
Questo significherebbe usare 50 IF annidati, con relativo caos di
indentazioni e codice che ti sparisce a destra dell'area visible, ecc...
Io il Goto generalmente lo uso solo per l'On Error, ma in casi come quello
che cito come esempio, non ci penserei due volte.
Certo, se ci fosse il Continue, come in altri linguaggi, potrebbe far
comodo.
Ciao
Alberto

 A me sembra che la prima sia più pulita e forse anche più veloce.
E' certamente più elegante (sulla velocità non ho idea alcuna), ma, come si
diceva (Albe e io), se fra l'IF e End If ci sono 200 istruzioni, comunque
tante da "scappar" fuori dal video, complicate da ulteriori If e Do
all'interno, pur graficamente indentate, a volte, ai soli fine della
leggibilità, può essere più comodo scrivere Goto ripeti_ciclo, oppure Goto
ho_finito, etc., dove, IMHO, il "segreto" sta proprio nel fatto che la label
ha un nome chiaro, "parlante", come si diceva.

 Immagina di avere, dentro all'IF, duecento righe di codice,
[cut]
La cosa è semplicissima. *NON* si devono scrivere funzioni più
linghe di 20-30 righe (e che svolgano più di un compito). E
scrivendo funzioni "corte" non si hanno i problemi da te
lamentati.
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

 comodo.
mi ricorda tanto la cara vecchia programmazione strutturata.
imposti bene i blocchi di codice e li richiami dagli if.
puoi anche annidarne molti (anche se a quel punto di solito c'e'
qualcosa da rivedere alla base), ma se rinvii a sub o funzioni, il
codice sta decentemente pulito e non diventa un nido di vipere :)

 end
Ma non va, mi segnala errore di sintassi... ;-PP

 Ma non va, mi segnala errore di sintassi... ;-PP
il debug di outlook fa veramente schifo :P