Newsgroup: it.hobby.elettronica.digitale
Titolo: Subroutine in pic basic pro

Salve!
Mi domandavo cosa succede se da una routine principale c'e' una chiamata ad 
una subroutine che alla fine c'e' ovviamente il comando return per far 
tornare il programma alla routine principale, se in questa subroutine ci 
dovesse essere l'eventualita' di uscire prima con un comando goto cioe' 
prima di arrivare a return, tutto questo viene gestito oppure ci possono 
essere bug imprevisti? 


parli di subroutine di tipo GOSUB o di sottoprogrammi "SUB pippo()..." ?
nel primo caso devi chiudere i GOSUB con i RETURN, SEMPRE!
nel secondo caso non dovresti proprio poter fare GOTO non locali al 
sottoprogramma ( errore riportato direttamente dal compilatore )

 nel primo caso devi chiudere i GOSUB con i RETURN, SEMPRE!
Lo sto facendo pero' il dubbio mi viene se uso una subroutine:
HSERIN 2000,accensione,[WAIT ("+CREG: "),tmp0,tmp1]
PAUSE 100
IF tmp="0" AND tmp1="1" THEN
registro=0
ELSE
registro=registro+1
IF registro>20 THEN
registro=0
GOSUB reset
GOSUB SETUP
endif
tmp=0
tmp1=0
goto main2
endif
return
questo e' un esempio (di subroutine) hserin aspetta 2 secondi che arrivi una 
risposta dopo "+CREG: " metendo i valori in tmp0 e tmp1 se non si ha 
risposta salta alla routine accensione (quindi non si arrivera' alla fine di 
questa routine) inoltre ci sono altre righe che riamandano a main2 (anche in 
questo caso ci possono essere problemi?) 

 ha scritto nel messaggio 
news:472dafe7$0$16028$5fc...@news.tiscali.it...

Scusate se aggiungo altro, ma se sto facendo stro****te tipo annidamenti 
ecc. non dovrebbe essere il compilatore ad avvisarmi che sto sbagliando 
ammesso che questi siano errori. 


rispondo direttamente qui,
SE quello che hai postato e' il corpo di una subroutine e' sbagliata, il 
  "goto main2" lascia nello stack dei gosub un indirizzo di ritorno ( la 
coppia gosub - return e' implementata come uno stack )
che la versione corretta vorrebbe un return al posto del goto main2 e 
subito dopo la chiamata della subroutine eventuali test per decidere il 
salto verso main2
per il compilatore NON e' un errore in quanto non puo' analizzare il 
flusso ( dinamico ) del programma
noto che questo basic HA dei costrutti strutturato ( IF THEN ELSE ENDIF 
) potrebbe anche avere le SUBroutine strutturate, usa quelle sono piu' 
sicure :-)

 sicure :-)
Non dirmi nulla non capisco molto tu cosa intendi per subroutine 
strutturate? comunque anche con ste cose il programma sembra andare benone. 

 
allora, il Basic e' un linguaggio che ha avuto molte evoluzioni nel tempo.
il basic primigenio era fortemente line-oriented negli statement di 
controllo di flusso, e a parte il FOR - NEXT , dove all'interno del 
ciclo potevano esserci un numero arbitrario di linee di codice, tutte le 
strutture di controllo ( IF, GOTO, GOSUB ) insistevano su di una sola 
linea di codice
successive versioni hanno invece introdotto costrutti che possono 
distribuirsi su piu' linee
il primo e' l'  IF THEN ... ELSE ... ENDIF , che tu gia' usi dove i 
blocchi di codice tra THEN ed ELSE e tra ELSE ed ENDIF possono essere 
formati da un numero arbitrario di linee di codice
un altro e' il costrutto SUB Nomesub() .... ENDSUB
questo secondo costrutto e' analogo alle funzioni del C o alle 
procedure del FORTRAN o PASCAL ed era quello a cui facevo riferimento.
tieni conto che in questo caso la subroutine NomeSub viene poi attivata 
  semplicemente scrivendo il suo nome o al limite precedendola dalla 
parola chiave CALL.
sempre in questo caso dall'interno di NomeSub non puoi saltare fuori con 
GOTO o GOSUB

 ha scritto nel messaggio 
news:472d94c6$0$16030$5fc...@news.tiscali.it...

Non è molto 'pulito' ma si è visto fare:
- mettere una label subito prima del return a fine subroutine, e fare 
saltare con goto a questa label in caso di necessità.
- mettere più di un return all'interno di una subroutine, il programma 
quando incontra un return ritorna al chiamante.
In genere su processori con stack e memoria limitati ci si concede qualche 
'libertà' di programmazione che contrasterebbero con una struttura 
'classica' .
Questo anche perchè magari uno si fa tante paranoie per mantenere un codice 
'pulito' ad alto livello, e poi andando a vedere il codice assembler 
generato, ci si accorge che è tutto un goto da una parte all'altra della 
memoria programma..... 

 all'altra della memoria programma.....
La penso esattamente come te, ed anche per questo credo che alla fine usare 
un compilatore in C o in Basic per questi micro sia la stessa cosa (entrambi 
generano linguaggio assembler) 

 ha scritto nel messaggio 
news:472efce7$0$16022$5fc...@news.tiscali.it...

Qui dissento leggermente....
Tutti i compilatori generano codice assembler,o meglio codice macchina.
Ci sono linguaggi che per il loro modo di presenteare le funzioni e le 
procedure consentono una maggiore 'padronanza' di ciò che sarà poi generato 
(gli ottimizzatori di codice compilato poi a volte stravolgono tutto ancora 
una volta...).