Italian Goto ... ?

marco.canta

Active Member
Licensed User
Longtime User
Ciao ragazzi, nei programmi che ho realizzato finora, non ne ho mai avuto la necessita', ma ora mi servirebbe di poter utilizzare una istruzione goto ... non ho trovato nulla in merito ... mi potete aiutare ?


Procedura:
... ....
... ....
GoTo Procedura


non riesco a definire "Procedura:" e "GoTo Procedura"

Grazie Marco
 

djveleno

Active Member
Licensed User
Longtime User
Se per procedura intendi una Activity che hai creato all'interno di una app, basta un comando StartActivity(nomeactivity), certo per poterti aiutare bisognerebbe avere più dati disponibili sul programma, che cosa fa, quante activity hai creato ecc...
 

Gianni M

Well-Known Member
Licensed User
Longtime User
fantozzi: "GOTO è una ga..ta pazzesca!"
 

fiaful

Member
Licensed User
Longtime User
ciao marcoffio... il GOTO da un po' di tempo (un paio di decenni almeno) è rientrato in quelli che molti definirebbero "bad practice"... in quanto favorisce lo spaghetti-code (ne avrai sentito parlare) ovvero codice tanto ingarbugliato da risultare, a distanza di tempo, illegibile.

detto questo trovo naturale che tale pratica sia sconsigliata in B4A... venirne fuori però è semplice... prendi tutto il codice presente tra l'etichetta Procedura e il termine "funzionale" di quello che deve essere fatto al salto nell'etichetta e spostalo in una Sub... a questo punto metti una chiamata alla Sub sia dove definiresti l'etichetta, sia dove la richiameresti... ed hai fatto (ovviamente le variabili che usando nell'etichetta troveresti nello stesso scope devi passarle come parametri alla sub... ti sconsiglio l'utilizzo delle variabili globali (altra bad practice) anche se, in effetti, in B4A le variabili globali diventano proprietà della classe... io però prefereirei sempre l'utilizzo dei parametri.

spero di non averti confuso ulteriormente le idee.

happy coding
 

coslad

Well-Known Member
Licensed User
Longtime User
Ciao a tutti,

per quanto mi riguarda dopo piu' di due decenni passati a programmare , ritengo invece il goto un comando da usare si con parsimonia ma a volte indispensabile.

L' uso del goto puo' semplificare alcune procedure, magari Erel lo implementasse !!
 

ivanomonti

Expert
Licensed User
Longtime User
vi sembra strano ma in c# ho trovato goto dovuto usare in un solo pezzo di codice dove nel caso certe istruzioni non avessero finito o trovato dei risultati di tornare indietro fino a che i risultati non arrivano, ovviamente nella stessa funzione e non da funzione a funzione.

Insomma il framework windows di visual studio lo mette a disposizione e credo si possa usare con intellegenza. in certi casi per attendere il risultato creavo un for che azzerava incremento fino a che i risultati non arrivavano, ma e una soluzione sporca per me.

Se ci fosse sarebbe carino piùttosto che non averlo.
 

fiaful

Member
Licensed User
Longtime User
Ciao a tutti,

per quanto mi riguarda dopo piu' di due decenni passati a programmare , ritengo invece il goto un comando da usare si con parsimonia ma a volte indispensabile.

L' uso del goto puo' semplificare alcune procedure, magari Erel lo implementasse !!

Ciao coslad... credimi... so come ti senti... io programmo da più di trent'anni e per una buona prima ventina ho utilizzato freneticamente goto e gosub anche per i trucchetti più disparati... ma poi un giorno mi sono reso conto, leggendo che la pratica del goto era aborrita da chiunque lavorasse ad un certo livello, che era ora di andare avanti... all'inizio è stata dura perchè stravolge il modo di vedere il codice nel suo insieme... ma è un passo che va fatto... anche perchè troverai sempre meno linguaggi ad implementarlo o a portarlo avanti (oggi parliamo di OOP e di AOP... in questo contesto il goto suona quantomeno anacronistico! :) )

Come già ti scrivevo, non esiste alcuna situazione in cui il goto non si possa eliminare rivedendo il codice. Anzi... in linea generale... se hai bisogno di un goto da qualche parte, forse quella parte può essere scritta meglio (parlo per me in primis).

La mia non vuole assolutamente essere una critica o una polemica... ma solo uno spunto per provare a pensarla in maniera diversa...

Posso dire, dalla mia, che se riuscirai ad abituarti a pensare senza i goto ne trarrai sicuramente giovamento (almeno per quanto riguarda la lettura del codice a distanza di tempo!)
 

marco.canta

Active Member
Licensed User
Longtime User
il GOTO l'ho usato pochissime volte in Visual Basic e solamente in quei casi dove la procedura si ripetava all'infinito finche non si verificavano eventi all'interno di essa ...
Questo è un esempio di come l'ho usata e come mi servirebbe di trasportare questo codice in B4A
Rimango bloccato in questa procedura finche non arrivano dei dati sulla seriale.


-------------------------------------------------

Private Sub RicezioneDati()
Dim ValRX as String
Pollig:
Do
DoEvents
Loop Until MSComm1.InBufferCount >= 1
ValRX = MSComm1.Input
If ValRX = Chr$(173) Then GoTo RxATTESA
GoTo Pollig
end sub

Private Sub RxATTESA()
... ...
end sub

-------------------------------------------------


Chi mi puo' aiutare ??

Grazie Marco
 
Last edited:

fabio_linate_milano

Member
Licensed User
Longtime User
Non ho guardato il codice sopra
ma in genere una soluzione equivalente deve esistere per forza per il teorema di Bohm Jacopini.
Ripeto non ho guardato il codice sopra ma una soluzione (in genere) è quella di introdurre delle variabili flag aggiuntive.

fabio
 

ivanomonti

Expert
Licensed User
Longtime User
Puoi postare il codice corretto mi servirebbe per una mia procedura se non ti crea problemi
 

fiaful

Member
Licensed User
Longtime User
ok... allora

B4X:
Private Sub RicezioneDati()
  Dim ValRX as String
  Dim Polling as Boolean = true
  Do While Polling
    Do
      DoEvents
    Loop Until MSComm1.InBufferCount >= 1
    ValRX = MSComm1.Input
    If ValRX = Chr$(173) Then
      RxATTESA
      Polling = false ' se invece non vuoi farlo uscire dopo la chiamata a RxATTESA togli la riga ma devi provvedere un altro modo per uscire.
    End If
  Loop
end sub

Private Sub RxATTESA()
... ...
end sub

il giro Polling: ... Goto Polling (che in questo caso di fatto non è altro che un ciclo) puoi tranquillamente sostituirlo con un qualsiasi costrutto "ciclo" del linguaggio

(avresti potuto utilizzare anche un semplice do - loop senza alcuna condizione sostituendo la riga Polling = false con Return uscendo così dalla funzione)

il Goto RxATTESA è semplicemente una chiamata ad una funzione, quindi non serve il goto (anzi... non so neanche se funziona col goto :) )

ho visto che hai utilizzato un do - loop until... se posso darti un altro consiglio (e non mi sputi in un occhio :) ) abituati ad utilizzare i do while - loop ... qual è la differenza? do - loop until esegue il ciclo sempre almeno una volta, il do while - loop potrebbe non eseguirlo neanche una volta (dipendentemente dalla condizione)... nella vita ti torna molto più utile il secondo...

ciao
 
Last edited:

marco.canta

Active Member
Licensed User
Longtime User
Perfetto !!! Grazie !
... ora mi è rimasto solamente da capire come leggere i dati dalla seriale, sto utilizzando la Libreria USB-Serial ... e funziona tranquillamente nel ricevere i dati quando presenti come evento.
Quello che devo capire come andarli a leggere quando decido io. Praticamente quello che nel codice di esempio VB faccio con MSComm1.
 

marco.canta

Active Member
Licensed User
Longtime User
Spero di risolvere ... ho l'impressione di essere vicinissimo alla soluzione ma di non riuscirla a vedere.

Comunque appena trovata la posto ;)
 

ivanomonti

Expert
Licensed User
Longtime User
E come fare un ciclo con if

B4X:
For i =0 to 1
   if data.lengh <= 0 or data = null then i = 0
Next
In sostanza se data e vuoto o non esiste rimetti i a zero, come data e pieno esci dal ciclo. Devi comunque prevedere un uscita forzata nel senso che data non arrivano dati dopo tot esci, qui puoi inserire un count
B4X:
Dim count as int
count = 0

For i =0 to 1
  If data.lengh <= 0 or data = null then
    i = 0
    count = count+1
  End if
  If count >= 5000 then exit for
Next
 
Top