Autore Topic: [RISOLTO] Dove stò sbagliando?  (Letto 1276 volte)

Offline vir1966

  • Gamberetto
  • *
  • Post: 39
    • Mostra profilo
[RISOLTO] Dove stò sbagliando?
« il: 01 Febbraio 2017, 21:24:58 »
Ciao a tutti....e scusate la mia ignoranza, sono alle prese di un codice che ha funzionato (con vari adattamenti) con GwBasic, Qbasic, VisualBasic per Dos, VisualBasic 5 e 6, Gambas 2 ma non ne vuol sapere di funzionare su Gambas 3 versione 3.9.2, dove stò sbagliando?
Codice: [Seleziona]
Dim v[i] As Integer ' su questa riga mi da errore: Embedded arrays are forbidden here
Dim i As Integer
Dim min As Integer
Dim j As Integer
Dim SWP As Integer
Dim R As Integer
Dim Int As Integer



For i = 0 To 5
 
'Next
Randomize

ricalcola:
v[i] = Int[Rnd * 90] + 1
If i = 0 Then Goto vai

If i = 1 Then
   If v[i] = v[i - 1] Then Goto ricalcola
End If

If i = 2 Then
   If v[i] = v[i - 1] Or v[i] = v[i - 2] Then Goto ricalcola
End If

If i = 3 Then
   If v[i] = v[i - 1] Or v[i] = v[i - 2] Or v[i] = v[i - 3] Then Goto ricalcola
End If

If i = 4 Then
   If v[i] = v[i - 1] Or v[i] = v[i - 2] Or v[i] = v[i - 3] Or v[i] = v[i - 4] Then Goto ricalcola
End If

If i = 5 Then
   If v[i] = v[i - 1] Or v[i] = v[i - 2] Or v[i] = v[i - 3] Or v[i] = v[i - 4] Or v[i] = v[i - 5] Then Goto ricalcola
End If

vai:
Next
'Rem 170 REM Ordinamento crescente con Selection Sort
For i = 0 To 5
Min = i
For J = i + 1 To 5
If v[J] < v[Min] Then Min = J
Next
SWP = v[i]
v[i] = v[Min]
v[Min] = SWP
Next
« Ultima modifica: 02 Febbraio 2017, 21:02:14 da vir1966 »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:Dove stò sbagliando?
« Risposta #1 il: 01 Febbraio 2017, 22:04:09 »
dim v As Integer[]

dovrebbe andare
se corri, morirai stanco (motto degli sniper)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Dove stò sbagliando?
« Risposta #2 il: 01 Febbraio 2017, 22:25:53 »
Intanto come già ti ha detto Allegfede le matrici dinamiche si dichiarano come ha detto, poi le matrici sono degli oggetti e vanno istanziate ed esiste una funzione Rand per gli interi, ma mi puoi spiegare il significato di questo passaggio:
Codice: [Seleziona]
If v[i] = v[i - 1] Then Goto ricalcola
quando mai si potrà verificare che i sia uguale a i-1?

Comunque ora vado a dormire, buonanotte.
« Ultima modifica: 01 Febbraio 2017, 22:27:18 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vir1966

  • Gamberetto
  • *
  • Post: 39
    • Mostra profilo
Re:Dove stò sbagliando?
« Risposta #3 il: 01 Febbraio 2017, 23:17:25 »
dim v As Integer[]

dovrebbe andare
Ho già provato e funziona ma poi si blocca su questa riga:
Codice: [Seleziona]
v[i] = Int[Rnd * 90] + 1       ' mi da errore con NOT AN OBJECT


Per Gianluigi:
Codice: [Seleziona]
If v[i] = v[i - 1] Then Goto ricalcola
questo programmino genera 6 numeri da 1 a 90 in modo casuale,diversi e in ordine crescente....per cui se v è uguale al precedente valore ....allora ricalcola

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re:Dove stò sbagliando?
« Risposta #4 il: 02 Febbraio 2017, 00:32:31 »
Piccolo suggerimento: invece di tutti quegli If... Then usa Select Case che rende tutto più semplice e leggibile.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Dove sto sbagliando?
« Risposta #5 il: 02 Febbraio 2017, 01:20:09 »
In Gambas i Vettori sono degli Oggetti, ossia entità individuali concrete di un insieme più ampio, di un Universale che li trascende, chiamato Classe, e che rappresenta per essi un Modello, una Categoria assoluta delle loro caratteristiche (Proprietà, Metodi, Eventi) possedute che li distinguono dagli Oggetti appartenenti ad altre Classi.
Pertanto gli Oggetti, singolarità di una Classe, per esistere devono, come ogni entità concreta immanente, essere creati. In particolare, la creazione dei Vettori, se questi non sono istanziati in modo esplicito e diretto (modo "statico" dell'istanziazione di un vettore), richiede imprescindibilmente l'uso della parola-chiave "New".

Giunti a questa fase, va deciso se la variabile vettoriale (l'Oggetto Vettore) deve prevedere una ri-allocazione - in esecuzione - dell'area di memoria da esso occupata per la memorizzazione dei suoi dati, ossia se debba avere un numero indeterminato o determinato di elementi indicizzati.

Da ciò deriva che se si opta per una dichiarazione indeterminata del numero degli elementi dell'array, la dichiarazione andrà fatta come segue:
 
Codice: [Seleziona]
Dim v As New Integer[]
L'Oggetto array, seppur creato e individuato con una specifica variabile vettoriale, non possiede in quel momento alcun elemento indicizzato, al quale possa essere assegnato un valore. Va da sé che bisognerà attribuire all'array un nuovo elemento ogni volta che si voglia in esso immagazzinare un dato aggiuntivo.
Questa operazione va effettuata con il Metodo .Push( ) dell'Oggetto Vettore.

Ma detta soluzione non è utile alle necessità del codice in questione, poiché il vettore è suscettibile di vedersi assegnato un valore più volte nel medesimo elemento a causa dei previsti possibili richiami del GOTO alla correlata etichetta "ricalcola: ".
Dunque, tralasciando, per ora, la parte destra di quella riga, va detto che è possibile così assegnare "staticamente" già in dichiarazione della variabile "v" il numero dei suoi elementi, come segue:
 
Codice: [Seleziona]
Dim v As New Integer[6]
Ciò consente al programmatore, volendo, di impostare l'estremo maggiore del ciclo "For" con la Proprietà ".Max della variabile array:
 
Codice: [Seleziona]
For i = 0 To v.Max
Inoltre, la soluzione "statica" dell'indicizzazione degli elementi vettoriali, consente in codice di conservare l'impostazione originaria almeno della parte sinistra dell'assegnazione della predetta riga di comando, appunto come segue:
 
Codice: [Seleziona]
v[i] = .....

Riguardo alla parte destra dell'assegnazione della riga di comando "v[ i ] = Int[Rnd * 90] + 1", vanno rilevati almeno due errori.
1) il primo - meno importante - si collega direttamente alla dichiarazione formale dell'indirizzo simbolico di memoria identificato con "Int". Infatti, tale identificatore di variabile "Int" è perfettamente uguale al nome della funzione nativa di Gambas "Int( )". Questa scelta, seppur indubitabilmente funzionante, non si rivela valida sotto il profilo della "opportunità".
2) il secondo rileva una asimmetria fra dichiarazione della varibile di tipo Intero "Int" e suo uso concreto in routine. Infatti, la variabile "Int" viene dichiarata come variabile ad allocazione automatica della memoria di tipo Intero, ma viene poi formalmente utilizzata sintatticamente e morfologicamente come una variabile array di tipo Intero.


Riguardo alla variabile di tipo Intero denominata "min", varrebbe il medesimo discorso di cui al punto 1) visto appena sopra per la variabile "Int".

In ordine, poi, agli "If i = ...." mi associo al suggerimento di Top Fuel di usare più elegantemente la risorsa di controllo decisionale "Select Case....End Select".

La riga "If i = 0 Then Goto vai" mi sembra essere superflua, non risultando influente l'eventuale valore della variabile "i" uguale a zero nel prosieguo delle righe presenti all'interno del ciclo "For". In tal caso verrebbe meno anche la connessa etichetta "vai: " .

...ci sarà un modo di sostituire quei GOTO con altro ?




« Ultima modifica: 02 Febbraio 2017, 17:39:11 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Dove stò sbagliando?
« Risposta #6 il: 02 Febbraio 2017, 09:23:44 »
Per Gianluigi:
Codice: [Seleziona]
If v[i] = v[i - 1] Then Goto ricalcola
questo programmino genera 6 numeri da 1 a 90 in modo casuale,diversi e in ordine crescente....per cui se v è uguale al precedente valore ....allora ricalcola

È vero che sciocco, ti chiedo scusa, vedi sono anziano lento di ragionamento e con scarsa autonomia, a quell'ora ormai la mente è annebbiata e il tuo codice pieno di errori assomigliava così tanto alla parodia di Bill Gates fatta da un comico che francamente non sono riuscito a prenderlo sul serio.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vir1966

  • Gamberetto
  • *
  • Post: 39
    • Mostra profilo
Re:Dove stò sbagliando?
« Risposta #7 il: 02 Febbraio 2017, 13:11:25 »
Per vuott:
Ti ringrazio di cuore per la spiegazione....mi metterò all'opera per ripristinare questo programmino seguendo le tue indicazioni  :ok:

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Dove stò sbagliando?
« Risposta #8 il: 02 Febbraio 2017, 14:22:42 »
Ci saranno senz'altro algoritmi più efficienti di questo, ma almeno questo rispetta il basic di Gambas.

Codice: [Seleziona]
' Gambas module file

Public Sub Main()

  Dim cc As New Byte[]
  Dim ii As New Byte[]
  Dim b, c As Byte 
 
  Randomize
  For b = 0 To 89   
    cc.Push(Rand(1, 90))
  Next
 
  For b = 0 To 5
    ii.Push(cc[b])
    If b > 1 Then
      For c = 0 To b - 1
        If ii[b] = ii[c] Then
          ii.Delete(b)
          b -= 1         
        Endif
      Next
    Endif
  Next
  ii.Sort
  For Each b In ii
    Print b
  Next
 
End

Finalmente, forse è quello giusto  ;D

 :ciao: :ciao:
« Ultima modifica: 02 Febbraio 2017, 14:58:02 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Dove stò sbagliando?
« Risposta #9 il: 02 Febbraio 2017, 15:50:07 »
Finalmente, forse è quello giusto
Dal test sembra essere necessaria una breve attesa
 
Codice: [Seleziona]
Sleep 0.01
all'interno del ciclo "If b > 1 Then"
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Dove stò sbagliando?
« Risposta #10 il: 02 Febbraio 2017, 16:15:57 »
Finalmente, forse è quello giusto
Dal test sembra essere necessaria una breve attesa
 
Codice: [Seleziona]
Sleep 0.01
all'interno del ciclo "If b > 1 Then"

Si ora che me lo fai notare vedo che qualche volta si inceppa, ma a me lo fa anche con sleep messo li  :-\
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Dove stò sbagliando?
« Risposta #11 il: 02 Febbraio 2017, 16:55:26 »
Finalmente, forse è quello giusto
Dal test sembra essere necessaria una breve attesa
 
Codice: [Seleziona]
Sleep 0.01
all'interno del ciclo "If b > 1 Then"

Il punto debole credo fosse nel passaggio che decrementa il contatore del secondo loop, così non dovrebbe dare problemi:
Codice: [Seleziona]
' Gambas module file

Public Sub Main()

  Dim cc As New Byte[]
  Dim ii As New Byte[]
  Dim b, c, i As Byte 
 
  Randomize
  For b = 0 To 89   
    cc.Push(Rand(1, 90))
  Next
 
  For Each b In cc
    ii.Push(b)
    Inc i
    If i > 1 Then
      For c = 0 To i - 2
        If b = ii[c] Then
          ii.Delete(c)
          Dec i
        Endif
      Next
    Endif
    If i = 6 Then Break
  Next
  ii.Sort
  For Each b In ii
    Print b
  Next
 
End
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Dove stò sbagliando?
« Risposta #12 il: 02 Febbraio 2017, 16:58:11 »
così non dovrebbe dare problemi:
Ottimamente.
Bravo.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vir1966

  • Gamberetto
  • *
  • Post: 39
    • Mostra profilo
Re:Dove stò sbagliando?
« Risposta #13 il: 02 Febbraio 2017, 21:01:30 »
Complimenti per il vostro codice per ottenere la stessa cosa per cui ho chiesto aiuto, oltre che funzionale è anche bello da vedere  :ok: ritornando al mio ormai secolare programmino che in Gambas2 funzionava e una volta convertito da Gambas3 non ne voleva sapere, ho modificato
Codice: [Seleziona]
Dim v[i] As Integer
che non funzionava con
Codice: [Seleziona]
Dim v As New Integer[6]
Ho modificato
Codice: [Seleziona]
For i = 0 To 5
con
Codice: [Seleziona]
For i = 0 To v.Max
ho modificato
Codice: [Seleziona]
v[i] = Int[Rnd* 90] +1
che non funzionava e per il fatto delle parentesi quadre mi vedeva Int come variabile con
Codice: [Seleziona]
v[i] = Int(Rnd(1, 90))
adesso il programmino è ripartito e quidi RISOLTO
Grazie a tutti  :2birre:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Dove stò sbagliando?
« Risposta #14 il: 02 Febbraio 2017, 22:08:54 »
Complimenti per il vostro codice
Il codice è di Gianluigi.
" Date a Cesare quel che è di Cesare... "


oltre che funzionale è anche bello da vedere 
Sì, è vero. Utilizzando proprietà e Metodi dei Vettori, Gianluigi ha scritto un codice efficace e davvero molto elegante.



e quidi RISOLTO
Quello che più a noi interessa è che tu abbia capito, anche e soprattutto per il futuro, le motivazioni delle cose spiegate e le funzionalità delle risorse alternative utilizzate.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »