|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
[C#] switch annidati
Codice:
switch(calculatorState) {
case CalculatorState.inputVariablesForCalc:
// First and Second function only
if (inThirdFunction)
return;
switch (operationMode) {
case OperationMode.normalMode:
Lo so che non si può fare il fallthrough se tra due label c'è del codice, ma sono due switch DIVERSI!!! Non ditemi che devo cambiare gli switch interni con degli IF, non perchè sarebbe una rottura colossale, ma per principio: SONO VARIABILI DIVERSE! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2002
Messaggi: 2690
|
hai provato a racchiudere il 2° switch dentro a {} ?
__________________
Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Provato adesso, non va -_________-"
P.S.: ho avuto un'illuminazione: ho cannato io! Il problema non è lì, bensì alla fine dei case: non avevo inserito break nonostante dopo non ci fosse più nulla e finisse non solo lo switch ma anche la funzione!! I break ci vogliono assolutamente, al contrario che in C++ (sto portando codice C++ in C# infatti)... Ultima modifica di vendettaaaaa : 23-12-2012 alle 23:50. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2783
|
In realtà il fallthrough è possibile ma va esplicitato con "goto case"
http://msdn.microsoft.com/en-us/library/13940fs2.aspx |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
E prima che intervenga qualcuno: non me ne fotte niente se il goto è sconsigliato. Basta starci attenti |
|
|
|
|
|
|
#6 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Ci sono due situazioni in cui il goto è lecito: una è, come nel tuo caso, uscire da cicli e/o switch case annidati; l'altra è per migliorare le prestazioni come spiega Knuth nel suo bell'articolo "Structure Programming with goto Statements".
E se lo consiglia Knuth ci si può fidare Tratto dall'articolo di cui sopra: Quote:
Ultima modifica di Vincenzo1968 : 24-12-2012 alle 18:09. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2783
|
Veramente io sono uno di quelli che "aborra" i goto, però in questo caso il "goto case" di goto ha solo il nome, almeno quando lo usi per passare al case successivo. L'intenzione alla base è quella di evitare a compile time dei case che non finiscono con break per dimenticanza: dovendo esplicitare sia il break che il fallthrough è più difficile fare errori di distrazione.
|
|
|
|
|
|
#8 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Pure io lo evito(e, a dire il vero, non m'è mai capitato di doverlo usare). Ma, ci sono situazioni in cui può essere utile. Ti consiglio di procurarti una copia dell'articolo di Knuth, è illuminante in proposito(purtroppo non posso postarlo tutto per ovvi motivi di copyright).
Come dice Knuth, amo i programmi ben documentati e ben formati ma non amo affatto quelli inefficienti. Perché privarsi di uno strumento che può notevolmente migliorare l'efficienza? E dove siamo? nel Congo Belga? (Cit. Totò(nel film "I Tartassati")). |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12919
|
Quote:
Mettiamo che hai fatto una serie di allocazioni, e si possono verificare più avanti nel codice un paio di errori diversi tra loro, uno non grave, l'altro grave, ma che hanno una serie di parti comuni... in questo caso oltre ad essere utile è consigliabile usare un goto per gestire la parte comune dell'errore. In questo modo non solo si rende il codice più leggibile ma si evita la replicazione del codice, cosa che potrebbe essere dannosa nel caso in cui si debba effettuare una modifica (ci si può dimenticare di farla in un altro ramo ad esempio). Questo in C, chiaramente altri linguaggi dispongono di soluzioni ad-hoc, come le eccezioni, per gestire gli errori. |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12919
|
Quote:
Chiaramente con tutto il rispetto per Knuth, se il tuo programma ha un problema di prestazioni, vai con un profiler e vedi dov'è il problema, e non è detto che sia l'implementazione, potrebbe benissimo essere l'algoritmo utilizzato ad essere inefficiente. PS: noto ora che l'articolo è del 1974... direi che è il caso di aggiornarsi un po', dubito fortemente che oggi valgano ancora quelle considerazioni. Ultima modifica di WarDuck : 24-12-2012 alle 19:55. |
|
|
|
|
|
|
#11 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
|
|
|
|
|
|
|
#12 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Per esempio, il goto ti consente di evitare la ricorsione nel caso in cui ce ne fosse bisogno(per le prestazioni o per evitare di esaurire lo stack di sistema). Naturalmente è possibile eliminare la ricorsione anche senza goto ma a volte il codice si complica un po' troppo. Un esempio è dato nel Sedgewick che illustra come eliminare la ricorsione dall'algoritmo per l'attraversamento degli alberi binari. Sedgewick prosegue poi mostrando com'è possibile eliminare i goto ed avere un algoritmo non ricosivo. Anche se nell'esempio finale il codice non è molto più complicato rispetto alla versione ricorsiva, il ragionamento da fare per arrivarci è lungo e tortuoso. |
|
|
|
|
|
|
#13 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
|
|
|
|
|
#14 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Altro gran bell'articolo in cui si spiega in quali casi(pochi, pochissimi) è cosa buona e giusta usare il goto:
by Steven C. McConnell http://www.stevemcconnell.com/ccgoto.htm Quote:
|
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12919
|
Quote:
L'altro articolo è del 1993. Ricordo a tutti che siamo all'alba del 2013, per cui già solo un articolo di 5 anni fa può non essere più valido in ambito scientifico, figurarsi uno di 20. Questo non significa che alcune tesi non siano ancora valide oggi, ma andrebbero dimostrate, specie considerati i progressi nell'ambito dei compilatori. Ultima modifica di WarDuck : 25-12-2012 alle 11:18. |
|
|
|
|
|
|
#16 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Questo articolo(del 2012) mostra come si può ottenere un incremento di efficienza tramite goto: http://eli.thegreenplace.net/2012/07...spatch-tables/ Ribadisco comunque che finora, vent'anni che programmo, non m'è mai capitato di dover usare l'istruzione goto. Non sono per l'efficienza a tutti i costi; ma non sono neanche un "gotoless evangelists" |
|
|
|
|
|
|
#17 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Volendo si può usare il goto anche nei linguaggi che non lo prevedono:
Java : http://www.steike.com/code/useless/java-goto/ javascript: http://summerofgoto.com/ Python: http://entrian.com/goto/ Codice:
# Example 1: Breaking out from a deeply nested loop:
from goto import goto, label
for i in range(1, 10):
for j in range(1, 20):
for k in range(1, 30):
print i, j, k
if k == 3:
goto .end
label .end
print "Finished\n"
Ultima modifica di Vincenzo1968 : 25-12-2012 alle 21:50. |
|
|
|
|
|
#18 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
I sorgenti di Python:
Python 2.7: ![]() Python 3.3: ![]() ![]() Però è il colmo: considerano il costrutto goto il male assoluto(tant'è che non lo implementano nel linguaggio) ma non si fanno scrupoli nell'utilizzarlo in CPython per aumentare le prestazioni |
|
|
|
|
|
#19 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
|
|
|
|
|
#20 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
D'altronde cos'è un blocco try/catch se non un goto camuffato, un eufemismo per saltare da qualche parte senza scrivere la parola "goto"?
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:01.























