Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-06-2010, 23:43   #1
Albitexm
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.
Albitexm è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2010, 00:49   #2
Kenger
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.
Kenger è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2010, 01:50   #3
Albitexm
Senior Member
 
Iscritto dal: Jun 2008
Messaggi: 384
Quote:
Originariamente inviato da Kenger Guarda i messaggi
Le variabili non vengono toccate dal goto
Posso esserne sicuro? In questo caso dovrò azzerarne parecchie io.

Quote:
Puoi dichiarare una sola etichetta.
Come interpreti allora la seguente frase tratta dall'help di VC++ ?
: "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:
Ne sono abbastanza sicuro anche se non vedo un GOTO da quando facevo pascal in 1a superiore.
Tutti i testi,compreso l'help di VC++ sconsigliano di usare GOTO. Va bene..,
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.
Albitexm è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2010, 01:51   #4
Tommo
Senior Member
 
L'Avatar di Tommo
 
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
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2010, 02:57   #5
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Se devi usare GOTO per fare chiarezza, cancella tutto
E' una regola che non mi ha mai tradito
+1
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2010, 09:17   #6
cionci
Senior Member
 
L'Avatar di cionci
 
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
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2010, 14:51   #7
Kenger
Member
 
Iscritto dal: Aug 2005
Messaggi: 168
Quote:
Originariamente inviato da Albitexm Guarda i messaggi
Come interpreti allora la seguente frase tratta dall'help di VC++ ?
: "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.
Quella frase vuol dire: "Una etichetta serve solo ai goto; in tutti gli altri casi viene ignorata. Le etichette non posso essere ridefinite". Praticamente non puoi dichiarare due label con lo stesso nome.

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.
Kenger è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2010, 16:48   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Albitexm Guarda i messaggi
Tutti i testi,compreso l'help di VC++ sconsigliano di usare GOTO. Va bene..,
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.
Hai molti modi per farlo.
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2010, 17:16   #9
cionci
Senior Member
 
L'Avatar di cionci
 
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;
   }
};
Tra l'altro è carino perché potresti scambiare dinamicamente l'ordine di esecuzione dei cicli...

Ultima modifica di cionci : 22-06-2010 alle 17:35.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2010, 17:30   #10
marco.r
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2010, 17:37   #11
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2010, 00:26   #12
Albitexm
Senior Member
 
Iscritto dal: Jun 2008
Messaggi: 384
Quote:
Originariamente inviato da cionci Guarda i messaggi
E' sicuramente overkill, ma era per dimostrare che anche nel caso di 15 cicli annidati il goto in C++ non va usato.
Grazie per il suggerimento, adesso studierò "state pattern" . Un'altro modo
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?".
Albitexm è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2010, 00:56   #13
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Albitexm Guarda i messaggi
Grazie per il suggerimento, adesso studierò "state pattern" . Un'altro modo
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?".
http://it.wikipedia.org/wiki/Spaghetti_code
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2010, 01:13   #14
Albitexm
Senior Member
 
Iscritto dal: Jun 2008
Messaggi: 384
,
Albitexm è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2010, 15:53   #15
Albitexm
Senior Member
 
Iscritto dal: Jun 2008
Messaggi: 384
Quote:
Originariamente inviato da marco.r Guarda i messaggi
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...
Considerate anche che io non sono un programmatore, ed è la prima volta che scrivo un programma. Mi stupisco già che funzioni il programma, ma giustamente è giusto che mi facciate presente che è meglio usare un metodo di stesura migliore se possibile.
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-
Albitexm è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2010, 16:11   #16
banryu79
Senior Member
 
L'Avatar di banryu79
 
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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2010, 19:52   #17
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Quote:
Originariamente inviato da Albitexm Guarda i messaggi
Considerate anche che io non sono un programmatore, ed è la prima volta che scrivo un programma. Mi stupisco già che funzioni il programma, ma giustamente è giusto che mi facciate presente che è meglio usare un metodo di stesura migliore se possibile.
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-
Come ho già detto, metti quel ciclo in una funzione e invece di break usa return

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?
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Il nuovo Qualcomm Snapdragon 8 Gen 5 stu...
Sky e Amazon trasmetteranno la Champions...
'Robot abbastanza forti da fratturare un...
Anche DAZN ha il suo Black Friday: 40 eu...
Carmageddon: Rogue Shift, il prossimo ca...
Redal Alert 2: Command & Conquer si ...
Kingston Technology: memorie e storage c...
Narwal Freo Z10 Ultra: il robot con moci...
In 3 minuti le vedete tutte: sono le mig...
Black Friday da record per Tineco: le sc...
La nuova PS5 con Fortnite manda in tilt ...
Amazon, i tagli hanno colpito soprattutt...
Pazzesco: Panasonic Lumix DC-GH5M2E a 79...
Ecco tutte le offerte Black Friday pi&ug...
DJI Neo a 169€, Flip Combo a 309€ e molt...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:15.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v