Autore Topic: [RISOLTO] Errore in una funzione con Rnd()  (Letto 912 volte)

Offline Francoiky

  • Gamberetto
  • *
  • Post: 33
    • Mostra profilo
[RISOLTO] Errore in una funzione con Rnd()
« il: 16 Gennaio 2011, 16:38:57 »
Salve a tutti!
Mi servirebbe un aiuto per comprendere il mio errore in queste righe di codice:
Codice: [Seleziona]
PUBLIC SUB Button1_Click()
IF RadioButton1.Value = TRUE THEN
  Estratti[0] = Int(Rnd(1, 91))
  Label1.Text = Estratti[0]
ELSE IF RadioButton2.Value = TRUE THEN
  DO
    Estratti[0] = Int(Rnd(1, 91))
    Estratti[1] = Int(Rnd(1, 91))
  LOOP UNTIL Estratti[0] <> Estratti[1]
  Label1.Text = Estratti[0]
  Label2.Text = Estratti[1]
ENDIF
END

Sto cercando di creare un programma il quale, se il RadioButton1 è selezionato estrae a caso un numero e lo "stampa" nel Label1, mentre se invece è il RadioButton2 ad essere selezionato estrae due numeri (che devono essere differenti) e li "stampa" rispettivamente nel Label1 e nel Label2. Quando però vado ad eseguire il programma, premendo il Button1 (per innescare la funzione) con il RadioButton2 selezionato, mi restituisce un messaggio di errore con scritto "Null Object" (In basso a destra: "Stato dello stack: FMain.Button1_Click.498"; la riga 498 è quella immediatamente sotto al DO).

Grazie in anticipo :hatecomputer:
« Ultima modifica: 16 Gennaio 2011, 23:56:31 da Francoiky »

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Errore in una funzione con Rnd()
« Risposta #1 il: 16 Gennaio 2011, 16:45:05 »
Rnd() solitamente richiede l'uso di RANDOMIZE prima per inizializzare il seme con cui vengono estratti i numeri. Quindi prima di utilizzare rdn() mettici un bel RANDOMIZE

Codice: gambas [Seleziona]
PUBLIC SUB Button1_Click()
RANDOMIZE
IF RadioButton1.Value = TRUE THEN
  Estratti[0] = Int(Rnd(1, 91))
  Label1.Text = Estratti[0]
ELSE IF RadioButton2.Value = TRUE THEN
  DO
    Estratti[0] = Int(Rnd(1, 91))
    Estratti[1] = Int(Rnd(1, 91))
  LOOP UNTIL Estratti[0] <> Estratti[1]
  Label1.Text = Estratti[0]
  Label2.Text = Estratti[1]
ENDIF
END


Inoltre non hai messo nel pezzetto di codice l'istruzione con cui dichiari l'array Estratti. L'errore potrebbe risiedere proprio lì.

Offline Francoiky

  • Gamberetto
  • *
  • Post: 33
    • Mostra profilo
Re: Errore in una funzione con Rnd()
« Risposta #2 il: 16 Gennaio 2011, 16:56:59 »
Innanzitutto grazie. Allora: l'array l'ho dichiarato (l'ho solo omesso dal post :P ; "PUBLIC Estratti As Array"), adesso aggiungo RANDOMIZE e provo. :coder:

Edit: con RANDOMIZE non risolvo :-\
« Ultima modifica: 16 Gennaio 2011, 16:59:05 da Francoiky »

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Errore in una funzione con Rnd()
« Risposta #3 il: 16 Gennaio 2011, 17:05:51 »
Mi posti la riga precisa in cui dichiari l'array?

Offline Francoiky

  • Gamberetto
  • *
  • Post: 33
    • Mostra profilo
Re: Errore in una funzione con Rnd()
« Risposta #4 il: 16 Gennaio 2011, 17:41:02 »
Codice: gambas [Seleziona]
PUBLIC Estratti AS Array

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Errore in una funzione con Rnd()
« Risposta #5 il: 16 Gennaio 2011, 17:41:43 »
per poter scrivere

estratti[0]= un valore devi aver dichiarato estratti in questo modo

dim estratti as new integer[2]

e non solamente estratti  as integer[]


inoltre il randomize serve solo per fare in modo che la casualità sia ripetuta , inserendo come argomento sempre lo stesso valore.
normalmente invece viene omesso


Offline Francoiky

  • Gamberetto
  • *
  • Post: 33
    • Mostra profilo
Re: Errore in una funzione con Rnd()
« Risposta #6 il: 16 Gennaio 2011, 18:05:42 »
Quindi dovrebbe essere così:
Codice: gambas [Seleziona]
PUBLIC Estratti AS Array

PUBLIC SUB Button1_Click()
IF RadioButton1.Value = TRUE THEN
  DIM Estratti AS NEW Array[0]
  Estratti[0] = Int(Rnd(1, 91))
  Label1.Text = Estratti[0]
ELSE IF RadioButton2.Value = TRUE THEN
  DIM Estratti AS NEW Array[0]
  DIM Estratti AS NEW Array[1]
  DO
    Estratti[0] = Int(Rnd(1, 91))
    Estratti[1] = Int(Rnd(1, 91))
  LOOP UNTIL Estratti[0] <> Estratti[1]
  Label1.Text = Estratti[0]
  Label2.Text = Estratti[1]
ENDIF
END


Giusto? ???

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Errore in una funzione con Rnd()
« Risposta #7 il: 16 Gennaio 2011, 22:22:57 »
io scriverei cosi:

Codice: gambas [Seleziona]

 
 PUBLIC SUB Button1_Click()  
DIM Estratti AS NEW Array[2]  

 IF RadioButton1.Value = TRUE THEN  
  
  Label1.Text = cInt(Rnd(1, 91))  
  
 ELSE IF RadioButton2.Value = TRUE THEN  
  
  DO  
    Estratti[0] = cInt(Rnd(1, 91))  
    Estratti[1] = cint(Rnd(1, 91))  
  LOOP UNTIL Estratti[0] <> Estratti[1]  
  Label1.Text = Estratti[0]  
  Label2.Text = Estratti[1]  
 ENDIF  
 END  
 


la dichiarazione delle variabili viene eseguita una volta sola ad inizio funzione
se dichiari una variabile come pubblica è bene non dichiarare un altra variabile con lo stesso nome di tipo privato
« Ultima modifica: 16 Gennaio 2011, 22:26:54 da fsurfing »

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Errore in una funzione con Rnd()
« Risposta #8 il: 16 Gennaio 2011, 23:07:12 »
Piccola precisazione.
RANDOMIZE usato senza argomento serve proprio per inizializzare il generatore di numeri pseudo-casuali con il valore di data/ora per avere sempre una sequenza differente. Diversamente, ad ogni avvio del tuo programma RND restituirebbe sempre la stessa sequenza di numeri.

Se invece si usa con un argomento (RANDOMIZE seme) allora il generatore viene inizializzato per riprodurre una particolare sequenza.

Di questo son certo perché fui proprio io a chiedere a Benoit di inserire l'argomento "seme" per poter ottenere le stesse sequenze su richiesta.  ;D
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Errore in una funzione con Rnd()
« Risposta #9 il: 17 Gennaio 2011, 00:47:09 »
Piccola precisazione.
RANDOMIZE usato senza argomento serve proprio per inizializzare il generatore di numeri pseudo-casuali con il valore di data/ora per avere sempre una sequenza differente. Diversamente, ad ogni avvio del tuo programma RND restituirebbe sempre la stessa sequenza di numeri.

Se invece si usa con un argomento (RANDOMIZE seme) allora il generatore viene inizializzato per riprodurre una particolare sequenza.

Di questo son certo perché fui proprio io a chiedere a Benoit di inserire l'argomento "seme" per poter ottenere le stesse sequenze su richiesta.  ;D

E io che ho detto... :-\

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: [RISOLTO] Errore in una funzione con Rnd()
« Risposta #10 il: 17 Gennaio 2011, 09:06:35 »
Non era rivolto a te ma a fsurfing.  :P
Visita il mio sito personale: http://www.leonardomiliani.com

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: [RISOLTO] Errore in una funzione con Rnd()
« Risposta #11 il: 17 Gennaio 2011, 19:41:11 »
quello che volevo dire io oltre al seme è che comunque il randomize è inutile perche se omesso viene generato automaticamente ponendo come seme la data e ora di quell ' istante , ovvero tanto vale utilizzarlo soamente se si vuole utilizzare un certo seme per avere la stessa sequenza

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: [RISOLTO] Errore in una funzione con Rnd()
« Risposta #12 il: 18 Gennaio 2011, 09:24:49 »
Ah, sì. E' vero: senza esplicitarlo, viene cmq chiamato Randomize con la data/ora la prima volta che viene incontrato Rnd.
Visita il mio sito personale: http://www.leonardomiliani.com