|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2008
Messaggi: 384
|
[C++] GOTO istruzione, chiarimenti
Due domande sull'uso dell'istruzione di salto GOTO in C++ :
1°: quando viene chiamata l'istruzione GOTO e l'esecuzione "salta" all'etichetta specificata, le variabili memorizzate fino a quel punto vengono resettate? Se si, vengono distrutte anche eventuali variabili dichiarate prima dell'etichetta? Ovvero esempio: mettiamo che ho un codice del tipo> cin>>A cin>>B start: cin>>C ... if () goto start; in questo caso, quando si torna a start viene distrutta solo la variabile C: o anche A e B? 2°: leggo che ogni singola istruzione GOTO deve fare riferimento a una singola etichetta. Ma se io ho bisogno di 5 istruzioni goto in punti differenti, che mi ritornano tutte 5 allo stesso punto del codice devo dichiarare 5 etichette diverse anche se nello stesso punto? Ovvero, devo scrivere: start1: start2: start3: start4: start5: ... if () goto start1; ... if () goto start2 ; ecc.. oppure posso scrivere un'unica etichetta? : start: ... if () goto start; ... if () goto start; ecc.. Ultima modifica di Albitexm : 21-06-2010 alle 23:48. |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Aug 2005
Messaggi: 168
|
Le variabili non vengono toccate dal goto e puoi dichiarare una sola etichetta.
Ne sono abbastanza sicuro anche se non vedo un GOTO da quando facevo pascal in 1a superiore. |
|
|
|
|
|
#3 | ||
|
Senior Member
Iscritto dal: Jun 2008
Messaggi: 384
|
Posso esserne sicuro? In questo caso dovrò azzerarne parecchie io.
Quote:
: "A statement label is meaningful only to a goto statement; otherwise, statement labels are ignored. Labels cannot be redeclared". E' questa frase che mi ha creato dei dubbi. Quote:
ma il mio programma è costituito da molti loop do while annidati. In più di 15 punti differenti devo ritornare all'inizio. Ho già fatto fatica a "incastrare" i vari cicli, non riesco a trovare altri modi per "saltare" fuori da quel groviglio. |
||
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Se devi usare GOTO per fare chiarezza, cancella tutto
E' una regola che non mi ha mai tradito ![]() Ti consiglierei di trovare quali sono i moduli base della tua funzione, metterli in funzioni separate (massimo un while per funzione) e quindi ricostruire il flusso dell'algoritmo. Perchè se è come dici non si può vedere
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
+1
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
In C il goto lo posso anche capire, al limite, ma proprio al limite per gestire le condizioni di errore. Ma in C++ mi rifiuto
|
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Aug 2005
Messaggi: 168
|
Quote:
Mi accodo agli altri comunque. I GOTO sono considerati delle bestemmie in informatica ormai e sarebbe meglio non usarli. Se hai tutti quei cicli annidati direi che è il caso di rifattorizzare il tuo codice. |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
I primi che mi vengono in mente sono le eccezioni, ma probabilmente è ancora migliore lo state pattern. Ultima modifica di cionci : 22-06-2010 alle 16:52. |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ad esempio:
Codice:
class CycleMap
{
map<string, BaseCycle *> cycleMap;
public:
CycleMap()
{
map.push_back("MainCycle", new MainCycle());
map.push_back("Cycle1", new Cycle1());
map.push_back("Cycle2", new Cycle2());
map.push_back("Cycle3", new Cycle3());
}
};
class BaseCycle
{
BaseCycle(){};
virtual BaseCycle * run() = 0;
virtual bool continue() { return true; };
};
class MainCycle: public BaseCycle
{
public:
MainCycle(){};
virtual BaseCycle * MainCycle::run()
{
do
{
state = state.run();
}
while(state.continue())
}
virtual bool continue() { return false; };
};
class Cycle1: public BaseCycle
{
public:
Cycle1() {};
virtual BaseCycle * run()
{
BaseCycle * next;
do
{
someThing();
if(condition)
next = cycleMap["Cycle2"].run();
}
while(next == this);
return next;
}
};
class Cycle2: public BaseCycle
{
public:
Cycle2() {};
virtual BaseCycle * run()
{
BaseCycle * next;
do
{
someThingOther();
if(condition)
next = cycleMap["Cycle3"].run();
else if(other condition)
next = cycleMap["Cycle4"].run();
else
next = cycleMap["MainCycle"].run();
}
while(next == this);
return next;
}
};
Ultima modifica di cionci : 22-06-2010 alle 17:35. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Premesso che se l'autore ha n cicli annidati con 15 punti in cui puo' uscirne e' forse il caso che riveda il design del programma, la tua soluzione mi sembra molto overkill...
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
E' sicuramente overkill, ma era per dimostrare che anche nel caso di 15 cicli annidati il goto in C++ non va usato.
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jun 2008
Messaggi: 384
|
Quote:
che mi era venuto in mente era di usare più volte "Break" per uscire da ogni ciclo. Ma ora per un principante come me, la domanda nasce spontanea: "perchè il goto in C++ non va usato?". |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jun 2008
Messaggi: 384
|
,
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jun 2008
Messaggi: 384
|
Quote:
Ma io avevo pensato di usare "continue" e "break" per uscire dai loop. Ma non vedo la differenza, tra usare l'istruzione di "uscita" -continue- invece che goto. Anche se viene consigliato di usare -continue- o -break- o -return- invece che goto- |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Diciamo che l'istruzione continue in un for loop è un caso d'uso specifico del salto incondizionato goto. Lo usi solo nel for loop per interrompere l'esecuzione di una singola iterazione e continuare con la seguente.
Invece goto lo puoi usare per fare "salti" nel codice in modo molto più "arbitrario". In teoria, con le istruzioni e i costrutti che si hanno a disposizione in C++ non dovrebbe essere neccessario ricorrere al goto, poichè esistono alternative che è raccomandabile usare poichè meno error-prone. Poi uno può fare quello che gli pare
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
Vedrai che se metti un ciclo per funzione viene parecchio più pulito... scommetto che quello che ti impone breaks e continues è la difficoltà di portare risultati fuori dai cicli no? |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:15.





















