Italian Domanda da principiante ...

Gottrik

Member
Licensed User
Longtime User
Salve a tutti ...

Myfile (che si trova nella scheda Sd) contiene:

0.0,0.0
1.1,1.1
2.2,2.2
3.3,3.3
4.4,4.4
ecc.
ecc.

Vorrei leggerne il contenuto, attribuendo alle variabili a(5) e b(5) i valori
letti nelle varie linee

1a linea : a = 0.0 e b = 0.0
2a linea : a = 1.1 e b = 1.1
ecc. ecc.

Con VB6 potrei usare il seguente codice:



Private Sub btnCommand1_Click()

Dim I As Integer
Dim a(5), b(5) As Single

Open "Myfile" For Input As #1
I = 1
Do While Not EOF(1)
Input #1, a(I), b(I)
'Print a(I), b(I)
Loop
Close #1

End Sub


Cosa devo fare con Basic4a?

Sub btnCommand1_Click

Dim I as Int
Dim a(5),b(5) as Float

Dim TextReader1 as TextReader
TextReader1.Initialize(File.OpenInput(File.DirRootExternal,"Myfile"))

??? mi sono perso ...
???

'log(a)
'log(b)

TextReader1.Close


Grazie
 

LucaMs

Expert
Licensed User
Longtime User
B4X:
Private lst As List : lst.Initialize
lst = File.ReadList(NomeDirectory, NomeFile)
Private a(lst.Size), b(lst.Size) As Float
For i = 0 To lst.Size - 1
    a(i) = Regex.Split(",", lst.Get(i))(0) ' la funzione split restituisce un array; (0) si riferisce al primo elemento
    b(i) = Regex.Split(",", lst.Get(i))(1)
Next

Non l'ho provato ma dovrebbe funzionare.

Se può servirti, pensa anche che ci sono altre strutture dati, oltre ai singoli array.
Gli array multidimensionali (a(n1,n2)), le List e le Map, che non esistono in VB6 e sono comodissime.
 

Gottrik

Member
Licensed User
Longtime User
Grazie per l'immediata risposta, ho provato così:

Private lst As List : lst.Initialize
lst = File.ReadList(File.DirRootExternal,"myfile")
Private a(lst.Size), b(lst.Size) As Float
For i = 0 To lst.Size - 1
a(i) = Regex.Split(",", lst.Get(i))(0) ' la funzione split restituisce un array; (0) si riferisce al primo elemento
b(i) = Regex.Split(",", lst.Get(i))(1)
Msgbox(a(i),"Valore a")
Msgbox(b(i),"Valore b")
Next

Però Msgbox mi restituisce un valore intero ... 0 invece di 0.0 e 1 invece di 1.1 ecc. ecc. eppure a e b sono dimensionati come float ... dove sbaglio?
 

Gottrik

Member
Licensed User
Longtime User
Scusa, hai ragione tu ... non avevo trasferito il file giusto (con i valori decimali) sul telefono Android.
Adesso va bene, fermo restando l'imprecisione dei float
Grazie ancora!
 

Gottrik

Member
Licensed User
Longtime User
Se non chiedo troppo, vorrei ancora chiarire un punto: la soluzione che mi hai proposto è
quella che più si avvicina al codice VB6?

Oppure esistono soluzioni più semplici ... che allora vorrei conoscere ...

Avrai sicuramente "letto tra le righe" che io non sono un programmatore esperto ...
Ho iniziato a trastullarmi con il Fortran, che veniva programmato utilizzando le
"schede perforate" date poi in pasto a un IBM 360 ( se ricordo bene ... ) grande come
un armadio a quattro ante ...

Poi ho continuato, sempre in Fortran, con un HP 1000 che era grande come un frigorifero,
quindi un poco più piccolo dell'IBM 360 e che vantava una RAM di ben 1024 Kb
( hai letto bene ... 1024 Kb ! ).

Poi arrivarono i PC con il Basic, il QBasic, il Basic 7 e infine il favoloso VisualBasic di Microsoft ...

Con questi linguaggi noi programmatori dilettanti pensavamo di aver risolto ogni problema ...
bastavano poche istruzioni per fare cose fantastiche ( almeno dal nostro punto di vista ... ) :

-Gli operatori matematici
-Print e Lprint
-Read e Write dei files ...
-If ... Else ... End If
-For ... Next

ecc.
ecc.

Ma le carte vincenti dei programmatori "imbranati" come me erano:

Goto e Gosub !!!

Con queste istruzioni potevi andare da Milano a Venezia, non passando da Brescia e Verona ma passando prima da Sondrio, poi da Mantova, poi da Belluno e Trieste ... però a Venezia ci arrivavi sempre e, grazie alla velocità del PC, nessuno si accorgeva delle deviazioni ... veniva distribuito
il File.exe e i "panni sporchi rimanevano in famiglia" ...

Poi gli esperti del settore stabilirono che queste istruzioni erano "poco eleganti" e contribuivano
a rendere il codice "illeggibile" e sostituirono "Goto" con "Try - Catch - End Try" ...

Che bello ... se uno deve scrivere un codice dall'inizio ... va tutto bene ...

Ma se uno come me ( e penso di non essere il solo ... ) deve convertire un vecchio codice da VB6
a Basic4a con moltissimi Goto e Gosub "non a scendere" ma purtroppo "a risalire" ... cosa deve fare?

Mi accorgo che l'ho fatta troppo lunga e chiudo con un'ultima considerazione : ma il buon Erel , non potrebbe valutare la possibilità di reintrodurre Goto e Gosub , guadagnandosi la stima e la benedizione di molti nostalgici ... e siamo in tanti ...

Oppure, come temo, è proprio Java che non accetta queste istruzioni ?

Saluti a tutti
 

LucaMs

Expert
Licensed User
Longtime User
Invece è stato un post molto divertente (dovresti provare l'RPG sui sistemi IBM, hehehe).

Dati i miei pochi byte di memoria cerebrale, non so se la soluzione che ho proposto sia la migliore; guardandola al volo mi sembra soltanto poco chiara, perché un po' concisa.

Questa riga "a(i) = Regex.Split(",", lst.Get(i))(0)", in particolar modo, andrebbe modificata affinché sia più leggibile.

Semplicemente, la funzione Regex.Split suddivide una stringa in base ad alcuni caratteri di separazione contenuti nella stringa stessa, restituendo un normale array unidimensionale. Aggiungendo (0) alla fine, io leggo direttamente l'elemento 0 di questo array. La stringa da suddividere la prendo da una struttura simile agli array che è un List (lst.Get(i)).

Per scriverla leggibile:
B4X:
Private lst As List
lst.Initialize

lst = File.ReadList(File.DirRootExternal,"myfile")

Private a(lst.Size), b(lst.Size) As Float
Private Line as String
For i = 0 To lst.Size - 1
   Line = lst.Get(i)
   Private arrSplitLine() as String
   arrSplitLine() = Regex.Split(",", Line) 
   
   a(i) = arrSplitLine(0)
   b(i) = arrSplitLine(1)

   Msgbox(a(i),"Valore a")
   Msgbox(b(i),"Valore b")

Next

I goto e gosub, come sai, sono stati definitivamente banditi perché portavano a flussi definiti "spaghetti programming", come quasi razzisticamente denominati. Essi non sono stati sostituiti da Try ... Questa è una struttura necessaria raramente, per intercettare errori non prevedibili "al priore di Anzio" e si dovrebbe cercare di evitare di utilizzare anche questa.

Il punto è che B4A è molto più simile a VB.Net che a VB6.

Dai tempi del VB6 i linguaggi sono molto cambiati, ma non solo nelle singole istruzioni; è tutto il concetto di programmazione orientata agli oggetti.

In questo periodo, poi, si è aggiunta qualche complicazione dovuta alla programmazione per i dispositivi mobili.

Se ti serve una mano, noi siamo sempre qui (o, come direbbe Mamo: "LucaMs è sempre qui" :D)
 

LucaMs

Expert
Licensed User
Longtime User
quell'errore non può riferirsi a quella riga:
upload_2014-5-23_8-59-24.png


i parametri sono solo due!
 

Gottrik

Member
Licensed User
Longtime User
Eppure a me da un errore ... questa è la linea:


arrSplitLine() = Regex.Split(",", Line)


e questo è l’errore:

Parsing code. 0.02

Compiling code. Error

Error compiling program.

Error description: Missing parameter.

Occurred on line: 84

arrSplitLine() = Regex.Split(",", Line)

Word: (


Ho usato il programma che mi hai inviato ( lm prova ), sostituendo poi la parte di codice con quella che tu ritenevi più leggibile ...
Non capisco, comunque non importa ... userò il codice che mi hai inviato in precedenza.
Ciao e scusami per il disturbo.
 

Gottrik

Member
Licensed User
Longtime User
E' piuttosto strano, perché quando abilito il codice in rosso tutto funziona bene:

--------------------------------------------------------------------------------------------------------------------------------------

Sub btnProva_Click

'Private lst As List : lst.Initialize
'lst = File.ReadList(File.DirAssets,"myfile.txt")
'Private a(lst.Size), b(lst.Size) As Double
'For i = 1 To lst.Size - 1
' a(i) = Regex.Split(",", lst.Get(i))(0) ' la funzione split restituisce un array; (0) si riferisce al primo elemento
' b(i) = Regex.Split(",", lst.Get(i))(1)
' Msgbox(a(i),"Valore a")
' Msgbox(b(i),"Valore b")
'Next



e quando abilito il codice in blu escludendo quello in rosso ( senza cambiare altro ) , mi da l'errore:


Private lst As List:lst.Initialize
lst = File.ReadList(File.DirAssets,"myfile.txt")
Private a(lst.Size), b(lst.Size) As Double
Private Line As String
For i = 0 To lst.Size - 1
Line = lst.Get(i)
Private arrSplitLine() As String
arrSplitLine() = Regex.Split(",",Line)
a(i) = arrSplitLine(0)
b(i) = arrSplitLine(1)
Msgbox(a(i),"Valore a")
Msgbox(b(i),"Valore b")
Next


End Sub

------------------------------------------------------------------------------------------------------------------------------------

Che bei tempi (con qualche anno di meno ) :

Open "myfile" For Input As #1
I = 1
Do While Not EOF(1)
Input #1, a(I), b(I)
'Print a(I), b(I)
Loop
Close #1

Ciao!
 

IlCasti

Active Member
Licensed User
Longtime User
arrSplitLine = Regex.Split(",",Line)

e dovrebbe passare la paura

poi lo richiami con arrSplitLine(0) etc etc

Luca dicci le cose come stanno... buono il rosso è? :rolleyes:
 
Top