Stavo sperimentando questo modo di azzerare all'interno di un file (composto ad esempio da questi 9 byte: 66 66 66 66 66 66 66 66 66) un certo numero di byte successivi (mettiamo... i primi 4):
Public Sub Button1_Click()
Dim aFl As File
Dim buff As New Byte[4]
Dim b As Byte
aFl = Open "/tmp/mio_file" For Write
Write #aFl, buff As Byte[]
aFl.Close
End
...ma non comprendo perché, andando poi con un editor esadecimale a controllare il risultato all'interno del file, ottengo questo strano risultato:
41 02 04 00 00 00 00 66 66
Cioè sembra che ai primi tre byte venga attribuita una sorta di codice. Infatti ho notato che il 1° ed il 2° byte, pur variando il valore della dimensione nell'array Byte[n], non mutano; mentre il 3° byte varia con il variare nel valore posto come dimensione dell'array Byte[n].
Inoltre, i quattro byte azzerati li ottengo solo dopo questa specie di codice formato dai primi 3 byte.
Perché accade questo ? ???
P.S. Ho notato, invece, che quello strano risultato non accade se pongo l'array diversamente:
buff[4] As Byte
Public Sub Button1_Click()
Dim aFl As File
Dim b As Byte
aFl = Open "/tmp/mio_file" For Write
Write #aFl, buff As Byte[]
aFl.Close
End
In questo caso, invece, ottengo il vero risultato che volevo, ossia:
00 00 00 00 66 66 66 66 66
Sembra ti abbia memorizzato il puntatore all'array, invece del suo contenuto.
Invece di usare "FOR EACH B...", prova ad usare un normale integer e poi azzeri il valore del singolo item dell'array, così:
DIM i AS Integer
FOR i = 0 TO buff.Max
buff[i] = 0x00
NEXT
Invece di usare "FOR EACH B...", prova ad usare un normale integer e poi azzeri il valore del singolo item dell'array, così:
Allora, ho fatto:
Public Sub Button1_Click()
Dim aFl As File
Dim buff As New Byte[4]
Dim i As Integer
aFl = Open "/tmp/a" For Write
For i = 0 To buff.Max
buff[i] = &00
Next
Write #aFl, buff As Byte[]
aFl.Close
End
...niente... stesso risultato ! :hatecomputer:
Per azzerare un dato di tipo byte, l'istruzione che conosco io è bDato=Cbyte(0). Quindi nel tuo caso sarebbe:
For i = 0 To buff.Max
buff[i] = CByte(0)
Next
:ciao:
Puoi ancora provare ad azzerare i bit del singolo bute ad uno ad uno
Es.: BClr(205, 4). il numero 205 ("11001101" in numerazione binaria) viene modificato in 197 ("11000101)".
Dim ii As Integer
Dim bCrt As Byte
.............................................
For i = 0 To buff.Max
for ii = 0 to 7
buff[i] = BClr(buff[i] ,ii)
Next
Next
Va be'... ho coinvolto anche la ML di Minisini su 'sto problema. Lui me l'ha risolto, conservando l'array (che era la cosa che volevo appunto conservare), suggerendomi di usare il Metodo Write di Byte[], e non Write come istruzione:
« To write the contents of an array, use its Write method, not the Write instruction.
The Write instruction *serializes* the data by writing both datype
information and data, so that the Read instruction can read it back later. »
Quest'ultima informazione viene confermata anche da un altro utente della Mailing List internazionale di Gambas, il quale mi dice:
« If you
Write #File, aArr As Array
then Gambas has to be able to
aArr = Read #File As Array
the data back. To do so, the type of array and its size must be available and thus are written before the actual data. »
Ed allora il codice finale, giusto è:
Public Sub Button1_Click()
Dim aFl As File
Dim buff As New Byte[4]
aFl = Open "/tmp/mio_file" For Write
buff.Write(aFl)
aFl.Close
End
...ed ora come risultato nel file ottengo, coerentemente con quanto volevo, i primi quattro byte = 0 .
Altro esempio pratico dimostrativo:
Public Sub Button1_Click()
Dim aFl As File
Dim buff As New Byte[4]
Dim b as byte
aFl = Open "/tmp/mio_file" For Write
' carichiamo nell'array 4 valori da 0 a 3:
For b = 0 To 3
buff[b] = b
Next
' li andiamo a scrivere nel nostro file
' partendo sempre dal suo 1° byte:
buff.Write(aFl)
aFl.Close
End
...avremo coerentemente questo risultato: 00 01 02 03
P.S. Minisini ha precisato che i tre strani dati, che prima ottenevo nel file
41 02 04 00 00 00 00 ......
stanno a rappresentare:
41 è l'Array (il carattere 'A' sta appunto per Array).
02 significa Byte.
04 è (come ipotizzavo) il numero della dimensione dell'Array.
...quindi poi seguono i byte del contenuto dell'array.