Autore Topic: [C++] uscire da due cicli annidati con break  (Letto 6826 volte)

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
[C++] uscire da due cicli annidati con break
« il: 21 Dicembre 2011, 22:13:37 »
Ciao a tutti,
com'è possibile in C++ uscire da 2 cicli annidati/innestati usando una istruzione break inserita nel più interno dei cicli? E' possibile farlo in maniera "elegante"?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [C++] uscire da due cicli annidati con break
« Risposta #1 il: 21 Dicembre 2011, 22:28:31 »
mmh... goto?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: [C++] uscire da due cicli annidati con break
« Risposta #2 il: 21 Dicembre 2011, 22:52:32 »
Citazione da: "TheKaneB"
mmh... goto?
Per  elegante intendevo tutto il contrario di goto! :lol:  :lol:
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re: [C++] uscire da due cicli annidati con break
« Risposta #3 il: 22 Dicembre 2011, 07:22:25 »
Col break, per com'è implementato adesso, non puoi.

O usi il goto, come suggerito, oppure fai ricorso al teorema di Böhm-Jacopini.

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [C++] uscire da due cicli annidati con break
« Risposta #4 il: 22 Dicembre 2011, 10:48:25 »
Citazione da: "clros"
Citazione da: "TheKaneB"
mmh... goto?
Per  elegante intendevo tutto il contrario di goto! :lol:  :lol:


Lo so che il goto è diventato un tabù (a ragion veduta), ma l'uscita da cicli annidati è l'unico modo elegante di usarlo.
Sempre meglio di quella porcata platform-dependent di setjump/longjump, che tra l'altro non fa parte del linguaggio e non è detto che funzioni su tutte le piattaforme (e complica l'uscita dei cicli perchè devi sporcare il codice con flag di condizione e in generale rende il tutto difficilmente comprensibile e debuggabile).
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: [C++] uscire da due cicli annidati con break
« Risposta #5 il: 22 Dicembre 2011, 13:00:06 »
Mamma mia!! Non uso il goto da quando ero in seconda media e usavo il Basic 2 del C64!!  :lol:
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3498
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re: [C++] uscire da due cicli annidati con break
« Risposta #6 il: 22 Dicembre 2011, 13:45:22 »
non farlo clros! il goto non dovrebbe essere neanche nominato! Resisti!  :lol:
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: [C++] uscire da due cicli annidati con break
« Risposta #7 il: 22 Dicembre 2011, 14:48:37 »
Citazione da: "Allanon"
non farlo clros! il goto non dovrebbe essere neanche nominato! Resisti!  :lol:

 :lol:  :lol:  :lol:
Siete fantastici!!!
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [C++] uscire da due cicli annidati con break
« Risposta #8 il: 22 Dicembre 2011, 14:52:53 »
Non piace a nessuno, eppure è l'istruzione perfetta per questo specifico caso.
Rielaborando il codice in modo da usare solo cicli e if..then..else a catena, puoi tranquillamente ottenere lo stesso risultato ma avresti un codice più complicato da mantenere e da debuggare rispetto all'uso "oculato" di una istruzione goto messa nel posto giusto.

Si tratta di uno strumento di programmazione che potenzialmente fa danni a pacchi, ma in specifici ed isolati casi è lo strumento corretto da usare :-)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: [C++] uscire da due cicli annidati con break
« Risposta #9 il: 22 Dicembre 2011, 14:54:33 »
Adesso seriamente; ho trovato qst esempio su StackOverflow:

Codice: [Seleziona]
for(unsigned int z = 0; z < z_max; z++)
{
    bool gotoMainLoop = false;
    for(unsigned int y = 0; y < y_max && !gotoMainLoop; y++)
    {
        for(unsigned int x = 0; x < x_max && !gotoMainLoop; x++)
        {
                          //do your stuff
                          if(condition)
                            gotoMainLoop = true;
        }
    }

}

Solo che..mi sembra che si perda troppo tempo (devono essere valutate 2 condizioni prima di uscire dai due cicli più interni).
Voi cosa ne pensate?

Mi sa che usare il goto a questo punto sia davvero la giusta soluzione...
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: [C++] uscire da due cicli annidati con break
« Risposta #10 il: 22 Dicembre 2011, 14:56:54 »
Citazione da: "TheKaneB"
Non piace a nessuno, eppure è l'istruzione perfetta per questo specifico caso.
Scusa TheKaneB, ho letto il tuo messaggio dopo aver inserito il mio.
E vabbè, userò il goto! :)
(ma quante "strane cose" mentali che mi faccio!!!  :lol: )
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re: [C++] uscire da due cicli annidati con break
« Risposta #11 il: 22 Dicembre 2011, 14:57:20 »
Se vuoi ottimizzare, sì.

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: [C++] uscire da due cicli annidati con break
« Risposta #12 il: 22 Dicembre 2011, 15:00:41 »
Citazione da: "cdimauro"
Se vuoi ottimizzare, sì.
Ooook! :dance:
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline Z80Fan

  • Administrator
  • Guru
  • *****
  • Post: 1671
  • Karma: +13/-2
    • Mostra profilo
    • http://z80fan.altervista.org
Re: [C++] uscire da due cicli annidati con break
« Risposta #13 il: 22 Dicembre 2011, 15:12:45 »
Citazione da: "clros"
Adesso seriamente; ho trovato qst esempio su StackOverflow:

Codice: [Seleziona]
for(unsigned int z = 0; z < z_max; z++)
{
    bool gotoMainLoop = false;
    for(unsigned int y = 0; y < y_max && !gotoMainLoop; y++)
    {
        for(unsigned int x = 0; x < x_max && !gotoMainLoop; x++)
        {
                          //do your stuff
                          if(condition)
                            gotoMainLoop = true;
        }
    }

}
Che è il modo "corretto" di uscire da una situazione del genere usando solo codice strutturato (ed è come lo insegnano nelle scuole, anche per uscire da un ciclo singolo invece di usare il break).

Cmq mi aggiungo ai sostenitori del goto; personalmente una volta dovevo uscire da un codice tipo:
Codice: [Seleziona]
while(qualcosa)
{
    uscita:
    if(...) {
        ....
    }
    else if(condizione chilometrica)
    {
        ....
        while(condizione chilometrica)
        {
            if(condizione)
                goto uscita;
            ...
        }
        ...
    }
}
Se avessi seguito "le regole", avrei dovuto mettere altre variabili flag e altri test per evitare il resto del codice.
Ti immagini che divertimento poi? Già il codice era write only... :lol:
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

AmigaCori

  • Visitatore
Re: [C++] uscire da due cicli annidati con break
« Risposta #14 il: 22 Dicembre 2011, 15:50:35 »
Citazione da: "Allanon"
non farlo clros! il goto non dovrebbe essere neanche nominato! Resisti!  :lol:

Perche'?  :?  , IMHO e' uno "strumento"...e come tale sta al programmatore saperlo usare bene.  :)
Si puo' essere ordinati senza essere dei fissati  :mrgreen:

EDIT
Facciamo una cosa, si ha diritto al massimo ad un "GOTO" ogni 1000 linee di codice scritto  :mrgreen:
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Tags: