Autore Topic: [Risolto]Re:Array  (Letto 1439 volte)

Offline LuMo

  • Gamberetto
  • *
  • Post: 8
    • Mostra profilo
[Risolto]Re:Array
« il: 21 Gennaio 2018, 14:50:16 »
Salve a tutti, mi sono avvicinato a Gambas da poco e ho un problema con la gestione degli array.
Dunque creo un file che contiene dei numeri separati da "|" carico questo file e lo trasformo in un array di testo lo ciclo con un
for each stampo gli elementi e fin qui tutto bene. Dopo ho la necessità di trasformalo in un array di tipo float, nel ciclo
dò il comando arrayFloat.Add(Val(elementi_arrayString). Ma mi ritorna un errore che dice che vuole numeri di tipo float e non null. Grazie per l'aiuto fin da ora
« Ultima modifica: 22 Gennaio 2018, 22:23:29 da LuMo »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Array
« Risposta #1 il: 21 Gennaio 2018, 15:10:30 »
Tu fai una cosa più o meno come questo esempio ?

Codice: [Seleziona]
Public Sub Main()

  Dim ss As String[] = ["1", "2", "3", "4"]
  Dim s As String
  Dim ff As New Float[]
 
   For Each s In ss
     ff.Push(Val(s))
   Next

End
« 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:Array
« Risposta #2 il: 21 Gennaio 2018, 16:59:14 »
Concettualmente il codice di LuMo è corretto pertanto l'errore è nel passaggio dei dati al vettore float
Mi sono permesso di variare leggermente il codice di vuott per dimostrarlo:

Codice: [Seleziona]
Public Sub Main()

  Dim ss As String[] = Split("11,11|22,22|33,33|44,44", "|") '["1", "2", "3", "4"]'
  Dim s As String
  Dim ff As New Float[]
  Dim f As Float
  ' add o push sono praticamente la stessa funzione se devi solo accodare i valori'
  For Each s In ss
    ff.Push(Val(s))
  Next
  For Each f In ff
    Print f
  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.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Array
« Risposta #3 il: 21 Gennaio 2018, 17:10:17 »
  Dim ss As String[] = Split("11,11|22,22|33,33|44,44", "|") '["1", "2", "3", "4"]'
 
Sembrerebbe, invece, che la stringa di caratteri nel file sia composta da un numero e da la barra e così via.   :-\
Ad esempio così:
"1|2|3|4|5|6"

LuMo dovrebbe spiegare un po' meglio la questione, mostrando possibilmente la parte essenziale del codice usato per ottenere il vettore di tipo stringa.
« 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:Array
« Risposta #4 il: 21 Gennaio 2018, 17:15:45 »
...
LuMo dovrebbe spiegare un po' meglio la questione, mostrando possibilmente la parte essenziale del codice usato per ottenere il vettore di tipo stringa.

Si, hai perfettamente ragione  :ok:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline LuMo

  • Gamberetto
  • *
  • Post: 8
    • Mostra profilo
Re:Array
« Risposta #5 il: 21 Gennaio 2018, 20:31:51 »
Grazie a tutti per le risposte. I numeri che salvo su file sono di tipo float in pratica:
Codice: [Seleziona]
dim n as float = 21.2
dim hFile as file
dim path as string = application.path &/ "nomeFile"
hFile = Open path For Write Append
Write #hFile, str(n) & "|"
Close hFile
---------------------------
dim s as String = File.Load(application.path &/ "nomeFile"
dim arrString as New String[]
dim elem as String
dim arrFloat as New Float[]

arrString = Split(s, "|")

For Each elem in arrString
print elem
arrFloat.Add(Val(elem))
Next

Naturalmente ora provo i vostri suggerimenti

Offline LuMo

  • Gamberetto
  • *
  • Post: 8
    • Mostra profilo
Re:Array
« Risposta #6 il: 21 Gennaio 2018, 20:38:26 »
Ciao ho provato i vostri suggerimenti ma continuo ad avere l'errore "Type mismatch: wanted Float, got Null instead

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Array
« Risposta #7 il: 21 Gennaio 2018, 21:51:29 »
Così funziona, ma non capisco perché Split restituisce anche i null  :-\
Codice: [Seleziona]
Public Sub Main()

  Dim n As Float = 21.2
  Dim hFile As File
  Dim path As String = application.path &/ "nomeFile.txt"
  Dim b As Byte
 
  hFile = Open path For Write Append
  For b = 0 To 9
    Write #hFile, Str(n) & "|"
  Next
  Close hFile
  File_Read()

End


Public Sub File_Read()

  Dim s As String = File.Load(application.path &/ "nomeFile.txt")
  Dim arrString As String[]
  Dim arrFloat As New Float[]
  Dim f As Float

  arrString = Split(s, "|", Null, True)
  For Each s In arrString
    'Print s
    If Not IsNull(s) Then arrFloat.Push(Val(s))
  Next
  For Each f In arrFloat
    Print f
  Next

End

Nota: Occorre ricordare che i valori salvati nell'applicazione una volta compilato il programma diventano inservibili perché di sola lettura.
« Ultima modifica: 21 Gennaio 2018, 22:46:58 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.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Array
« Risposta #8 il: 22 Gennaio 2018, 00:38:02 »
...non capisco perché Split restituisce anche i null

Sembra che, quando la stringa da processare termina con il carattere separatore (specificato nel 2° argomento) da eliminare, la funzione "Split( )" elimina l'ultimo separatore (come previsto), ma inserisce comunque un elemento, il quale - non essendo specificabile - assume il valore predefinito del tipo "String", ossia Null.

Così, per non incorrere nell'errore rilevato da LuMo, bisognerà settare a "True" il 4° parametro formale della funzione "Split( )", come appunto hai fatto tu:
Codice: [Seleziona]
Split(s, "|", Null, True)
affinché in questo caso l'ultimo elemento della variabile vettoriale ritornata non venga considerato e impostato a Null.
« Ultima modifica: 22 Gennaio 2018, 00:44:43 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:Array
« Risposta #9 il: 22 Gennaio 2018, 09:47:53 »
Sembra che, quando la stringa da processare termina con il carattere separatore (specificato nel 2° argomento) da eliminare, la funzione "Split( )" elimina l'ultimo separatore (come previsto), ma inserisce comunque un elemento, il quale - non essendo specificabile - assume il valore predefinito del tipo "String", ossia Null.
Si, è così come dici  :ok:
Citazione
Così, per non incorrere nell'errore rilevato da LuMo, bisognerà settare a "True" il 4° parametro formale della funzione "Split( )"
Stamane leggendo quanto hai scritto ho riprovato il codice togliendo
Codice: [Seleziona]
If Not IsNull(s) Then
e ha funzionato.
Chissa per quale motivo ieri il codice continuava a darmi wanted Float, got Null instead

Eppure ieri ho anche provato con compila tutto, a ciclare fino a Max -1 ecc... mistero  :-\

P.S. Questa mia frase:
Citazione
Nota: Occorre ricordare che i valori salvati nell'applicazione una volta compilato il programma diventano inservibili perché di sola lettura.
è sbagliata avrei dovuto scrivere:
Nota: Una volta compilato il programma sarà impossibile salvare i valori in un file all'interno della nostra applicazioni diventando di sola lettura.
La cosa migliore da fare per evitare di sporcare le cartelle è come fa vuott, cioè prendere l'abitudine a salvare in tmp cartella che viene pulita ad ogni riavvio del sistema.
« Ultima modifica: 22 Gennaio 2018, 10:05:13 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.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Array
« Risposta #10 il: 22 Gennaio 2018, 10:16:29 »
La cosa migliore da fare per evitare di sporcare le cartelle è come fa vuott, cioè prendere l'abitudine a salvare in tmp cartella che viene pulita ad ogni riavvio del sistema.

Eh !   
« 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 LuMo

  • Gamberetto
  • *
  • Post: 8
    • Mostra profilo
Re:Array
« Risposta #11 il: 22 Gennaio 2018, 21:12:15 »
Grazie a tutti ho applicato il vostro suggerimento e così funziona alla perfezione. Però non ben capito la puntualizzaione
Citazione
Nota: Una volta compilato il programma sarà impossibile salvare i valori in un file all'interno della nostra applicazioni diventando di sola lettura.
La cosa migliore da fare per evitare di sporcare le cartelle è come fa vuott, cioè prendere l'abitudine a salvare in tmp cartella che viene pulita ad ogni riavvio del sistema.
Significa che devo salvare il file in una directory diversa da quella in cui ho salvato il programma? In temp non posso salvare perché il file deve durare un intero anno.
« Ultima modifica: 22 Gennaio 2018, 21:25:52 da LuMo »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Array
« Risposta #12 il: 22 Gennaio 2018, 22:16:20 »
In temp non posso salvare perché il file deve durare un intero anno.

Gianluigi suggeriva il salvataggio nella cartella temporanea /tmp, limitatamente ai casi di prova oppure ai casi in cui non serva conservare il file anche dopo la chiusura del sistema.

Il tuo caso, invece, è diverso, dato che il file deve durare a lungo.
« 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:Array
« Risposta #13 il: 22 Gennaio 2018, 23:22:22 »
Significa che devo salvare il file in una directory diversa da quella in cui ho salvato il programma? In temp non posso salvare perché il file deve durare un intero anno.

Come ha già precisato vuott, la cartella tmp è utile per fare delle prove abituandoci a non salvare nella cartella dell'applicazione avendo cosi codice pronto con piccolo ritocco per l'applicazione finale.
Nel tuo caso potresti salvare come si fa abitualmente in User.Home &/ "." & Application.Name se vuoi salvare in una cartella nascosta nella home dell'utente (in questo caso te stesso) oppure senza "." & se vuoi controllare il file più agevolmente.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:[Risolto]Re:Array
« Risposta #14 il: 22 Gennaio 2018, 23:49:44 »
W San Giovanni !
« 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. »