Novità

Per Gennaro o chi vuole spiegarmelo.

  • Creatore Discussione Creatore Discussione xabio
  • Data di inizio Data di inizio

xabio

Super Member >GOLD<
Premetto sempre che sono alle prime armi portate pazienza per tanti saranno cose scontate .
Inserisco un esempio trovato qua nel forum by Gennaro.
Codice:
Sub Main

a = CInt(InputBox("1 numero dell'ambo ","1°",1))
b = CInt(InputBox("2 numero dell'ambo ","2°",2))
c = CInt(InputBox("Inserire la ruota ","Ruota",10))
d = CInt(InputBox("Inizio analisi ","Ini",1))
e = CInt(InputBox("Fine analisi ","Fin",EstrazioneFin))

f = GetPresenzeAmbo(a,b,c,d,e,[B]UltEstraz[/B])

Scrivi("L'ambo " & a & "." & b & " sulla ruota di "  & NomeRuota(c) & " nell'intervallo estrattivo " & d &  "/" & e & " è sortito " & f & " volte.")

Scrivi("L'ultima estrazione in cui si è presentato il suddetto ambo è la numero " & UltEstraz)
	
End Sub

Function GetPresenzeAmbo(IdNum1,IdNum2,IdRuota,IdInizio,IdF  ine,[B]GetEstraz[/B])
	Dim Ruota(1),NumAmbo(2)
	
	Conta = 0
	Inizio = IdInizio
	NumAmbo(1) = IdNum1
	NumAmbo(2) = IdNum2
	Ruota(1) = IdRuota
	
	For Inizio = Inizio To IdFine
		appo = SeriePrima(Inizio,IdFine,NumAmbo,Ruota,2)
		If appo > 0 Then
			Conta = Conta + 1
			Inizio = appo + 1
			GetEstraz = appo
		End If
	Next
	
	GetPresenzeAmbo = Conta
	
End Function

Ok Domanda :

La variabile F contenuta nella Sub restituisce il valore elaborato dalla funzione GetPresenzeAmbo creata da Gennaro
Mi viene da pensare che invece dovrebbe valere 0 visto che si trova in testa prima dello sviluppo della funzione.
Se invece lo script viene rielaborato prima di entrare in output
allora F viene valorizzato con l'ultimo valore acquisito
se cosi' é
qui comincio a sclerare un attimo poiche' pensavo che il codice seguisse le istruzioni riga per riga e le riporti in output
con la funzione scrivi o analoghe.
Quella volta Luigi parlo' di byval e byref
non so se era riferito proprio a questo discorso !!
Se qualcuno puo chiarirmi un attimo grazie .
Saluti Xabio.
 
ciao Xabio , non ho capit bene cosa non hai capito perche da come hai spiegato mi pare che hai gia tutto chiaro quindi sono un po' confuso nel capire cosa non hai capito , pertanto mo ti becchi un po' di teoria a tutto tondo cosi magari nel mezzo c'è la spiegazione
che ti serve.

in vbscript si possono creare procedure e funzioni.
La differenza tra una procedura ed una funzione è costituita dal fatto che le funzioni alla loro uscita tornano (opzionalmente se voluto dal programmatore) un risultato , le procedure invece non tornano nessun valore.
Le procedure si dichiarano con la parola chiave Sub , le funzioni con la parola chiave Function
terminano rispettivamente con End Sub ed End Function.
Al loro interno possono eseguire ambedue le istruzioni previste dal programmatore , quando è necessario ricavare un risultato
si usano ovviamente le unction quando invece bisogna solo eseguire delle istruzioni e non ci interessa avere un valore di ritorno
allora possiamo usare le Sub.
Sia le sub che le function possono essere corredate da parametri (formalmente si chiamano argomenti) , i parametri sono costituiti da variabili , per default il vbscript passa i parametri nella modalità byRef , cio vuol dire che se la tale variabile passata per parametro
alla procedura o alla function viene modificata all'interno del codice della stessa essa (la variabile) all'uscita della sub o della function avrà l'ultimo valore assegnato e tale valore èpossibile elggerlo dalal procedura chiamante.
E' questo il caso dell'esempio da te postato.

F è la variabile che accoglie il risultato della funzione puo valere qualsiasi cosa prima dell'esecuzione della riga ma è sicuro che dopo che la riga è stata eseguita F conterra il risultato della funzione GetPresenze,
Notiamo che tra i parametri della funzione ce ne è uno (quello che hai messo in grassetto) che all'interno della funzione stessa viene modificato sicche quando il controllo del flusso codice ritorna alla procedura chiamante (la sub Main) il suo contenuto (della variabile) si puo leggere ed utilizzare , in verita dato che i parametri per default sono passati byref se all'interno della function venissero modificati anche loro all'uscita avrebbero il nuovo valore assegnato dentro la function. in questo caso solo il parametro identificato dalla variabile GetEstraz viene modificato appositamente per poterlo rileggere all'uscita , qusta funzione infatti torna due risultati per cosi dire , uno il risultato della function stessa , l'altro contenuto nella variabile GetEstraz.

Se c'è qualcosa di non chiaro chiedi pure.

ciao
 
Ultima modifica di un moderatore:
Beh, quale spiegazione migliore potevi avere da LuibiB(oss) :) ahahahha

In effetti neanche io ho capito tanto la domanda...
Come hai detto tu, il codice viene letto in modo sequenziale e la variabile "f" fino a quel momento non ha alcun valore.. esempio:

Codice:
Sub Main


a = CInt(InputBox("1 numero dell'ambo ","1°",1))
b = CInt(InputBox("2 numero dell'ambo ","2°",2))
c = CInt(InputBox("Inserire la ruota ","Ruota",10))
d = CInt(InputBox("Inizio analisi ","Ini",1))
e = CInt(InputBox("Fine analisi ","Fin",EstrazioneFin))


Scrivi ("La variabile f, PRIMA della chiamata di funzione vale : ") & f


f = GetPresenzeAmbo(a,b,c,d,e,UltEstraz)


Scrivi ("La variabile f, DOPO la chiamata di funzione vale : ") & f
Scrivi String(60,"~")


Scrivi("L'ambo " & a & "." & b & " sulla ruota di "  & NomeRuota(c) & " nell'intervallo estrattivo " & d &  "/" & e & " è sortito " & f & " volte.")


Scrivi("L'ultima estrazione in cui si è presentato il suddetto ambo è la numero " & UltEstraz)
    
End Sub


Function GetPresenzeAmbo(IdNum1,IdNum2,IdRuota,IdInizio,IdFine,GetEstraz)
    Dim Ruota(1),NumAmbo(2)
    
    Conta = 0
    Inizio = IdInizio
    NumAmbo(1) = IdNum1
    NumAmbo(2) = IdNum2
    Ruota(1) = IdRuota
    
    For Inizio = Inizio To IdFine
        appo = SeriePrima(Inizio,IdFine,NumAmbo,Ruota,2)
        If appo > 0 Then
            Conta = Conta + 1
            Inizio = appo + 1
            GetEstraz = appo
        End If
    Next
    
    GetPresenzeAmbo = Conta
    
End Function

Se invece tale variabile la dichiariamo in testa alla SUB allora il discorso cambia...come in questo esempio:

Codice:
Sub Main


Dim f


f = 0


a = CInt(InputBox("1 numero dell'ambo ","1°",1))
b = CInt(InputBox("2 numero dell'ambo ","2°",2))
c = CInt(InputBox("Inserire la ruota ","Ruota",10))
d = CInt(InputBox("Inizio analisi ","Ini",1))
e = CInt(InputBox("Fine analisi ","Fin",EstrazioneFin))


Scrivi ("La variabile f, PRIMA della chiamata di funzione vale : ") & f


f = GetPresenzeAmbo(a,b,c,d,e,UltEstraz)


Scrivi ("La variabile f, DOPO la chiamata di funzione vale : ") & f
Scrivi String(60,"~")


Scrivi("L'ambo " & a & "." & b & " sulla ruota di "  & NomeRuota(c) & " nell'intervallo estrattivo " & d &  "/" & e & " è sortito " & f & " volte.")


Scrivi("L'ultima estrazione in cui si è presentato il suddetto ambo è la numero " & UltEstraz)
    
End Sub


Function GetPresenzeAmbo(IdNum1,IdNum2,IdRuota,IdInizio,IdFine,GetEstraz)
    Dim Ruota(1),NumAmbo(2)
    
    Conta = 0
    Inizio = IdInizio
    NumAmbo(1) = IdNum1
    NumAmbo(2) = IdNum2
    Ruota(1) = IdRuota
    
    For Inizio = Inizio To IdFine
        appo = SeriePrima(Inizio,IdFine,NumAmbo,Ruota,2)
        If appo > 0 Then
            Conta = Conta + 1
            Inizio = appo + 1
            GetEstraz = appo
        End If
    Next
    
    GetPresenzeAmbo = Conta
    
End Function


Spero che era questo che nn ti era chiaro.
PS: Anche io sono principiante e come te ho sbattuto la testa molte volte ed ho rotto il sasiccio a santo LuigiB.
 
Questo esempio e' bellissimo e ti fara' ingrippare ancora di piu'...

Codice:
Option Explicit
Sub Main
	
	Dim numero1
	numero1 = 3
	
	'passaggio per valore
	Scrivi("Prima di ByVal numero1 = " & numero1)
	Call quadratoByVal(numero1)
	Scrivi("Dopo ByVal numero1 = " & numero1)
	
	Scrivi	
	
	'passaggio per riferimento
	Scrivi("Prima di ByRef numero1 = " & numero1)
	Call quadratoByRef(numero1)
	Scrivi("Dopo di ByRef numero1 = " & numero1)
End Sub




Sub quadratoByVal(ByVal numero)
	numero = numero * numero
	Scrivi("Quadrato: " & numero)
End Sub


Sub quadratoByRef(ByRef numero)
	numero = numero * numero
	Scrivi("Quadrato: " & numero)
End Sub

E se provi ad invertire l'ordine delle chiamate, guarda che casino succede...

Codice:
Option Explicit
Sub Main
	
	Dim numero1
	numero1 = 3
	
	'passaggio per riferimento
	Scrivi("Prima di ByRef numero1 = " & numero1)
	Call quadratoByRef(numero1)
	Scrivi("Dopo di ByRef numero1 = " & numero1)
	
	Scrivi
	
	'passaggio per valore
	'numero1 = 3 'TOGLI L'APICE PER CORREGGERE IL CASINO CREATO DALL'INVERSIONE DELLE CHIAMATE BYREF BYVAL
	Scrivi("Prima di ByVal numero1 = " & numero1)
	Call quadratoByVal(numero1)
	Scrivi("Dopo ByVal numero1 = " & numero1)


End Sub




Sub quadratoByVal(ByVal numero)
	numero = numero * numero
	Scrivi("Quadrato: " & numero)
End Sub


Sub quadratoByRef(ByRef numero)
	numero = numero * numero
	Scrivi("Quadrato: " & numero)
End Sub

Come vedi, ho dovuto RIVALORIZZARE numero1 prima di richiamare ByVal.

Spero di non averti confuso ancora di piu' le idee haahuhuahahaha
 
Intanto ringrazio Luigi & Gennaro per la disponibilita'.

In effetti non sono riuscito ad esporre la domanda chiaramente probabilmente perche' vado per supposizioni su come opera
il linguaggio Vbs e come lavora il flusso del codice e come possono essere costituite le variabili arrays ecc. ma non voglio
allargarmi troppo col tempo spero di acquisire nozioni complete.
Ma vado al dunque sempre con l'esempio precedente:


Sub Main
Qui si apre la Sub , non viene dichiarata nessuna variabile penso sia possibile perche' non c'e "Option Explicit"
le variabili a,b,c,d,
e, prendono il valore immesso nell'imputbox.

a = CInt(InputBox("1 numero dell'ambo ","1°",1))
b = CInt(InputBox("2 numero dell'ambo ","2°",2))
c = CInt(InputBox("Inserire la ruota ","Ruota",10))
d = CInt(InputBox("Inizio analisi ","Ini",1))
e = CInt(InputBox("Fine analisi ","Fin",EstrazioneFin))

variabile f = a,b,c,d,e,memorizza valori definiti appena prima nei boxes ma UltEstraz ora e' 0.
f = GetPresenzeAmbo(a,b,c,d,e,UltEstraz)

L'istruzione scrivi a questo punto non viene eseguta da quello che capisco altrimenti scriverebbe f = 0
Scrivi("L'ambo " & a & "." & b & " sulla ruota di " & NomeRuota(c) & " nell'intervallo estrattivo " & d & "/" & e & " è sortito " & f & " volte.")
e nemmeno questa riga poiche' UltEstraz = 0
Scrivi("L'ultima estrazione in cui si è presentato il suddetto ambo è la numero " & UltEstraz)

Chiuso blocco sub
End Sub

Ora viene creata la Function per il calcolo presenze ambo x in un dato range estrattivo

Function GetPresenzeAmbo(IdNum1,IdNum2,IdRuota,IdInizio,Idfine,GetEstraz) GetEstraz mi valorizza UltEstraz ?
Dim Ruota(1),NumAmbo(2)

Conta = 0
Inizio = IdInizio
NumAmbo(1) = IdNum1
NumAmbo(2) = IdNum2
Ruota(1) = IdRuota

For Inizio = Inizio To IdFine
appo = SeriePrima(Inizio,IdFine,NumAmbo,Ruota,2)
If appo > 0 Then
Conta = Conta + 1
Inizio = appo + 1
GetEstraz = appo
End If
Next

Variabile Getpresenze assume valore della variabile conta
GetPresenzeAmbo = Conta

End Function
Fine del flusso se cosi' si puo dire ma in realta si torna alla sub e cosi' la variabile f acquisisce anche il valore di UltEstraz.

Ci sono salti di riga nell'elaborazione interattiva e poi la scrittura in Output ?
Cosa mi rimanda alla Sub dopo l'elaborazione della function ?


Se la Function la porto dentro al blocco Sub mi da errore !
Se le istruzioni scrivi le porto sotto mi da errore !

Gennaro mi stai complicando la vita comunque grazie dinuovo .
Ho visto i nuovi esempi ma Aspetta qualche tempo devo assimilare questi primi concetti.

Grazie Luigi della lezione scusa se mi sono dilungato ma e' difficile essere chiari .
Io stesso mi sembro in contraddizione sto cercando delle conferme.
Saluti Xabio


 
Ultima modifica:
Hahahahah mi dispiace averti confuso ankora di piu....ma poi vedrai che la matassa si sbrogliera.
Allora vediamo un po:

Sub Main
Qui si apre la Sub, non viene dichiarata nessuna variabile penso sia possibile perche' non c'e "Option Explicit"
le variabili a,b,c,d,
e, prendono il valore immesso nell'inputbox.

a = CInt(InputBox("1 numero dell'ambo ","1°",1))
b = CInt(InputBox("2 numero dell'ambo ","2°",2))
c = CInt(InputBox("Inserire la ruota ","Ruota",10))
d = CInt(InputBox("Inizio analisi ","Ini",1))
e = CInt(InputBox("Fine analisi ","Fin",EstrazioneFin))

Esatto


variabile f = a,b,c,d,e,memorizza valori definiti appena prima nei boxes ma UltEstraz ora e' 0.

f = GetPresenzeAmbo(a,b,c,d,e,UltEstraz)

NO. A questo punto il linguaggio fa un SALTO alla function GetPresenzeAmbo a cui diamo in "pasto" i valori delle variabili a,b,c,d,e ed essa ci restituisce il valore di UltEstraz ed il valore di GetPresenzeAmbo



L'
istruzione scrivi a questo punto non viene eseguta da quello che capisco altrimenti scriverebbe f = 0
Scrivi("L'ambo " & a & "." & b & " sulla ruota di " & NomeRuota(c) & " nell'intervallo estrattivo " & d & "/" & e & " è sortito " & f & " volte.")
e nemmeno questa riga poiche' UltEstraz = 0
Scrivi("L'ultima estrazione in cui si è presentato il suddetto ambo è la numero " & UltEstraz)

Chiuso blocco sub
End Sub

NO. Una volta chiamata la function abbiamo tutti i valori per poterli scrivere a video


Ora viene creata la Function per il calcolo presenze ambo x in un dato range estrattivo

NO. Non viene creata ma si trova li e verra' interpellata dalla riga : f = GetPresenzeAmbo(a,b,c,d,e,UltEstraz).
Considera le FUNCTION come delle appendici del tuo script


GetEstraz mi valorizza UltEstraz ?
SI

Function GetPresenzeAmbo(IdNum1,IdNum2,IdRuota,IdInizio,Idfine,GetEstraz)
Dim Ruota(1),NumAmbo(2)

Conta = 0
Inizio = IdInizio
NumAmbo(1) = IdNum1
NumAmbo(2) = IdNum2
Ruota(1) = IdRuota

For Inizio = Inizio To IdFine
appo = SeriePrima(Inizio,IdFine,NumAmbo,Ruota,2)
If appo > 0 Then
Conta = Conta + 1
Inizio = appo + 1
GetEstraz = appo
End If
Next

GetPresenzeAmbo = Conta
La variabile GetpresenzeAmbo assume valore della variabile Conta
SI ed e' proprio il valore che daremo alla variabile f

End Function
Fine del flusso se cosi' si puo dire ma in realta si torna alla sub e cosi' la variabile f acquisisce anche il valore di UltEstraz.

Si e No. Si, ritorna indetro ma f varra' CONTA mentre UltEstraz varra' APPO


Spero di averti fatto capire.
 
Grazie Gennaro sei stato chiarissimo .
Devo fare alcuni test per funzioni e procedure ed assimilare i concetti ByVal & ByRef .
Come si comporta il flusso del codice quando viene chiamata in causa una sub o una function
salto elaborazione e ritorno alla riga chiamante continuando il listato.
Prima vedevo tutto lineare adesso sono "Intrippato" diciamo che ragiono anche a " blocchi e riferimenti ".
Grazie ancora .
Ciao.
 
Ultima modifica:
esatto quando vieen richiamata una sub o una function l'esecuziione passa alle istruzioni contenute nella sub o function chiamata ,la quale ne puo chiamare alttre a sua volta , quando tutte le operazioni svolte dalla sub/function sono completate il controllo ritorna lla procedura chiamante che esegue la linea successiva alla chiamata della sub/function.
 

Ultima estrazione Lotto

  • Estrazione del lotto
    martedì 29 luglio 2025
    Bari
    83
    52
    44
    45
    01
    Cagliari
    28
    75
    63
    09
    44
    Firenze
    73
    36
    45
    35
    87
    Genova
    43
    72
    13
    34
    85
    Milano
    36
    52
    50
    41
    10
    Napoli
    73
    16
    23
    27
    48
    Palermo
    70
    53
    74
    58
    48
    Roma
    57
    40
    45
    47
    32
    Torino
    70
    13
    85
    75
    69
    Venezia
    56
    35
    72
    66
    20
    Nazionale
    81
    25
    45
    54
    32
    Estrazione Simbolotto
    Nazionale
    03
    35
    36
    16
    28

Ultimi Messaggi

Indietro
Alto