Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-06-2010, 22: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 22:48.
Albitexm è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2010, 23: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, 00: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, 00: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, 01: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, 08: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, 13: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, 15: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 15:52.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2010, 16: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 16:35.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2010, 16: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, 16: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 22-06-2010, 23: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 22-06-2010, 23: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, 00: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, 14: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, 15: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, 18: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


Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
Le 10 migliori offerte Amazon di Pasqua:...
Nuove fotografie dagli astronauti di Art...
La toilette della capsula Orion Integrit...
GeForce NOW: ecco tutte le novità in arr...
Il Realme 16 5G debutta sul mercato glob...
HONOR svela tre nuovi tablet: il più int...
Tineco Floor One S9 Master: aspira e pul...
Vivo X300 Ultra, il lancio globale è ini...
Offerte robot aspirapolvere Amazon: ECOV...
L'AI genera codice in 8 minuti e i senio...
Ring Intercom Audio a 44,99€ su Amazon: ...
Apple iPhone 16 crolla a 689€: ecco perc...
Google Pixel 9 a 449,90€ con caricatore ...
Ecco la top 7 delle offerte Amazon, aggi...
Ex ingegnere ammette il sabotaggio: migl...
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: 10:58.


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