Hai posto una medesima variabile sia in modalità globale che locale
No, non incide, però occorre chiarire bene cosa intendiamo per variabile globale. Se essa è estesa a tutto il progetto deve essere dichiarata Public in un modulo e deve essere intercettata con NomeModulo.Variabile. In questo caso se nella :
' Gambas class file
Private Variabile as integer
Public Sub MiaProcedura_Click()
.......bla.......bla.......bla.......
if Variabile = 100 then
print "Sto utilizzando la Variabile dichiarata [i]Private[/i] nella Form"
Endif
End
Sono sicuro di interrogare la variabile globale a livello di Form
Se invece ho:
' Gambas class file
Private Variabile as integer
Public Sub MiaProcedura_Click()
Dim Variabile as Integer
.......bla.......bla.......bla.......
if Variabile = 100 then
print "Sto utilizzando la [i]Variabile[/i] locale"
Endif
End
Posso incappare in un esito non prevedibile, perchè sto pensando di utilizzare la variabile dichiarata come Private a livello di Form, mentre Gambas assume come corrente quella dichiarata nella DIM in testa alla stessa procedura.
Quindi bisogna stare ben attenti a quello che si sta scrivendo.
Spero di essermi spiegato con sufficienza.
:ciao:
Puoi spiegare come funziona ?
Più precisamente: quali campi dobbiamo valorizzare lì sul Form per verificare l'errore da te rilevato ?
Devi mettere dei valori nei campi in alto, "Totale elementi", "Elementi da usare" e, opzionale, "Ripetizioni", poi premere il bottone Calcola.
Ho provato ad eseguire il programma passo passo e ho trovato la linea che crea il problema, è nella funzione Calcoladisp:
Public Function Calcoladisp(Elementi As String, Dausare As String, Optional Ripeti As String) As BigInt ''ripeti è optional perchè non sempre serve
Dim Risultato, NElementi, NDausare, NRipeti, i As BigInt ''il risultato finale, num. elementi, num. elementi da usare, num. ripetizioni e indice in formato BigInt
NElementi = BigInt.FromString(Elementi) ''convertiamo le stringhe in BigInt
NDausare = BigInt.FromString(Dausare)
NRipeti = BigInt.FromString(Ripeti) <---E' QUESTA CHE DA ERRORE DI SEGMENTAZIONE
If NRipeti Then 'se ci sono delle ripetizioni...
Risultato = NElementi ^ NRipeti '...è sufficiente un elevamento a potenza
Return Risultato
Endif
Risultato = NElementi 'si parte da numero di elementi da usare conteggiando all'indietro
For i = NElementi To NElementi - NDausare + 2 Step -1 'il calcolo senza ripetizioni
Risultato *= i - 1 'ogni elemento viene moltiplicato con quello che lo precede
Next
Return Risultato
End
Ma la cosa particolare è che lo fa solo se spunto la casellina davanti al campo "Combinazioni", e quindi quando esegue questa Function una seconda volta, Se non spunto la casellina l'errore non si produce.
Infatti in questa maniera e usando dei Print ho visto che Calcoladisp non da il risultato corretto, quindi devo correggerla, mentre Calcolaperm da dei numeri pazzeschi, quindi funziona. :D
Inoltre ho visto che non mi visualizza i risultati nella rispettive ValueBox, anche qui devo capire il perchè.
ho trovato la linea che crea il problema, è nella funzione Calcoladisp
Sì.
Sembra che alla riga:
NDisposizioni = Calcoladisp(Elementi, Dausare) 'calcoliamo le disposizioni
tu debba comunque passare anche il terzo argomento, anche se nella corrispondente routine della funzione chiamata il 3° parametro è dichiarato come "opzionale".
Correggendo dunque così:
NDisposizioni = Calcoladisp(Elementi, Dausare, Ripeti)
a me non viene sollevato alcun errore.