Login Registrati
Stai vedendo 5 articoli - dal 1 a 5 (di 5 totali)
  • Autore
    Articoli
  • #12220 Score: 0 | Risposta

    Fabio
    Partecipante

      Questo codice sotto se utilizzato in questo modo non calcola e rimane bloccato.

      Sub Mischia_carte()
      
      
      
      Dim N, C, R As String
      '
      N = Sheets("CARTE").Range("A40") ' Quantit?     ( Devono essere 96 quelle scelte )
      C = 0  ' Carte
      R = 42 ' Riga
      '
      RIPETI:
      
      
      '
      
      X = Int(Rnd() * N) + 1
      If R = X Then Sheets("CARTE").Range("B" & R) = Sheets("CARTE").Range("A" & R)
      C = C + 1: R = R + 1
      '
      
      
      '
      
      If C = N Then GoTo FATTO Else GoTo RIPETI
      FATTO:
      
      '
      
      If Sheets("CARTE").Range("B40") >= 96 Then GoTo FINE Else GoTo RIPETI
      
      
      
      
      FINE:
      
      
      
      MsgBox ("Finito !")
      
      
      
      
      '---
      End Sub

      Invece se scrivo in questo modo si esaurisce la memoria di stack ma calcola, anche se dopo il messaggio continua a ripetersi all'infinito!! Come risolvo?

      Sub Mischia_carte()
      
      
      
      Dim N, C, R As String
      '
      N = Sheets("CARTE").Range("A40") ' Quantit?     ( Devono essere 96 quelle scelte )
      C = 0  ' Carte
      R = 42 ' Riga
      '
      RIPETI:
      
      
      '
      
      X = Int(Rnd() * N) + 1
      If R = X Then Sheets("CARTE").Range("B" & R) = Sheets("CARTE").Range("A" & R)
      C = C + 1: R = R + 1
      '
      
      
      '
      
      If C = N Then GoTo FATTO Else GoTo RIPETI
      FATTO:
      
      '
      
      If Sheets("CARTE").Range("B40") >= 96 Then GoTo FINE Else Call ricalcola
      
      
      
      
      FINE:
      
      
      
      MsgBox ("Finito !")
      
      
      
      
      '---
      End Sub
      
      Sub ricalcola()
      Call Mischia_carte
      End Sub
      #12227 Score: 0 | Risposta

      Fabio
      Partecipante

        Risolta, funziona!

        Sub Mischia_carte()
        Dim N, C, R, X As String
        '
        N = Sheets("CARTE").Range("A40") ' Quantit?
        C = 0  ' Carte
        R = 42 ' Riga
        '
        RIPETI:
        '
        X = Int(Rnd() * N) + 1
        If R = X Then Sheets("CARTE").Range("B" & R) = Sheets("CARTE").Range("A" & R)
        C = C + 1: R = R + 1
        '
        If C = N Then GoTo FATTO Else GoTo RIPETI
        FATTO:
        '
        N = Sheets("CARTE").Range("A40") ' Quantit?
        C = 0  ' Carte
        R = 42 ' Riga
        '
        If Sheets("CARTE").Range("B40") >= 96 Then GoTo FINE Else GoTo RIPETI
        '
        FINE:
        MsgBox ("Finito !")
        '---
        End Sub
        #12233 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          272 pts

          Fabio ha scritto:

          Risolta, funziona!

          Molto bene, anche se non ci credo 🙂 adesso però osserva che:

          - Manca Option Explicit. O almeno, non mostri che ci sia.

          - I Dim devono essere espliciti per ogni variabile. L'istruzione "Dim N, C, R, X As String" dichiara di tipo String soltanto l'ultima, la X, mentre le altre variabili sono indifferenziate (assumono tipo Variant con spreco di byte di memoria).

          - Hai dichiarato X come String ma poi le assegni un valore numerico ("X = Int(Rnd() * N) + 1"). Questo non va bene perchè forzi il compilatore a trasformare in stringa un numero inutilmente visto che poi effettui dei confronti tra numeri. 

          - Hai utilizzato Rnd ma non hai inizializzato il generatore di numeri casuali (Randomize), quindi otterrai sempre e inequivocabilmente il medesimo numero "casuale".

          - Quei Goto sono da evitare.

          Forse se spieghi scenario e obiettivo ti si può dare qualche consiglio più mirato e più utile.

           

          #12235 Score: 0 | Risposta

          Fabio
          Partecipante

            Quindi devo dichiarare dim ad ogni singola variabile? Non c'è modo di unirle in una sola riga?

            Cavolo sai quante ne ho scritte così adesso devo modificarle tutte.

            Randomize come si applica?

             

            --Ho sistemato i dim all'interno del Gioco.

            #12236 Score: 0 | Risposta

            vecchio frac
            Senior Moderator
              272 pts

              Fabio ha scritto:

              Non c'è modo di unirle in una sola riga?

              Non mi sono spiegato bene, scusa. Puoi dimensionare quante variabili vuoi su una riga, ma per ognuna sarebbe bene specificare il tipo.

              Esempio:

              Dim a as String, b as String, c as String

              Mentre invece:

              Dim a, b, c as String

              Significa che solo "c" è espressamente di tipo stringa, le altre due sono di tipo Variant (cioè assumono il primo tipo di dato che viene assegnato loro e comunque riservano in memoria uno spazio molto più grande del necessario). Con i computer di oggi, dove memoria ce n'è, non si nota molto la differenza di performance. Ma tanto è per essere precisi 🙂

              Comunque non sei affatto costretto a riscrivere il tuo codice. Magari da oggi avrai un attenzione in più.

              Randomize con un argomento imprevedibile (il "seme") imposta il generatore di numeri casuali a essere un po' più casuale (in realtà non genera numeri in modo del tutto casuale). Ti basta dichiararlo a inizio routine (quindi non serve ogni volta che usi Rnd):

              Sub qualcosa()
              Dim ...
              Dim ...
              Dim ...
              
                  Randomize Timer    'imposta un seme diverso ad ogni esecuzione
              
              ... resto del codice
              End Sub

              Fabio ha scritto:

              Ho sistemato i dim all'interno del Gioco.

              Ah ma adesso ricordo... LBDP   

            Login Registrati
            Stai vedendo 5 articoli - dal 1 a 5 (di 5 totali)
            Rispondi a: Non calcola
            Gli allegati sono permessi solo ad utenti REGISTRATI
            Le tue informazioni: