Italian Concatenare array di byte...

stefanoxjx

Active Member
Licensed User
Longtime User
Ciao ragazzi,
avrei la necessità di creare un byte array di dimensioni variabili sul quale poter accodare tutto il flusso dati che arriva dalla porta seriale.
Quindi, la cosa scritta in maniera banale e non funzionante dovrebbe essere così:

B4X:
Sub Process_Globals
   Dim     b1() As Byte
end sub

Sub AStream_NewData (Buffer() As Byte)
   b1=b1+buffer
end sub

Ovviamente questa soluzione non funziona, anche perchè sennò non sarei qui a chiedere un vostro parere :D
C'è modo di farlo?

Grazie.
Ciao.
 

LucaMs

Expert
Licensed User
Longtime User
Servirebbe la funzionalità di VB.Net, il ReDim Preserve, che conserva i dati di un array quando questo viene ridimensionato, ma purtroppo non c'è ("e allora che me lo dici a fare?" :D)

Potresti utilizzare i RandomAccessFile, con un minimo di perdita di tempo perché ovviamente scrive files su "disco".
 

stefanoxjx

Active Member
Licensed User
Longtime User
Infatti facendo ricerche in merito ho visto che avevi discusso direttamente con Erel su questa storia del ReDim che in questo caso sarebbe stata una manna.
La soluzione di scrivere tutto in un file l'avevo già in mente ma volevo tenerla come ultima possibilità.
Per il rallentamento non credo ci siano problemi, anche perchè nella peggiore delle ipotesi la dimensione massima dei byte da scrivere è di 512K.
In questi giorni ho provato un po' tutte le soluzioni che mi sono venute in mente, ma non ho avuto soddisfazione :(
Come ultima soluzione ho provato ad archiviare tutti i dati in una list che da quello che ho capito dovrebbe essere un contenitore per qualsisi tipo di dato, ma con
determinati valori mi da un errore e non capisco il perchè.
Erel dice di creare un nuovo array ogni volta e usare byteconverter.copyarray.
Potrebbe essere una soluzione anche questa, ma essendo che l'array viene inizialmente creato su process_global, non so se ci sono dei problemi a ridimensionarlo
dall'interno di una sub.
 

LucaMs

Expert
Licensed User
Longtime User
Beh, una soluzione funzionante l'ho trovata:
B4X:
Sub Button1_Click
    Dim OldgBSize As Int = gB.Length
 
    ' Conserva i byte memorizzati fin qui
    Dim Dummy(OldgBSize) As Byte
    mByteConverter.ArrayCopy(gB, 0, Dummy, 0, OldgBSize)
 
    ' Simula l'arrivo dei dati
    Dim x As Int = Rnd(1,11)
    Dim Buffer(x) As Byte
    Log("buffer:")
    For i = 0 To x-1
        Buffer(i) = Rnd(0,256)
        Log(i & TAB & Buffer(i))
    Next
    Log("")
  
    ' ReDim senza Preserve, sigh
    Dim gB(OldgBSize + Buffer.Length) As Byte

    ' Copia i vecchi byte
    mByteConverter.ArrayCopy(Dummy, 0, gB, 0, OldgBSize)
    ' Copia i nuovi byte
    mByteConverter.ArrayCopy(Buffer, 0, gB, OldgBSize, Buffer.Length)
    Log("gB")
    For i = 0 To gB.Length - 1
        Log(i & TAB & gB(i))
    Next
    Log("")
End Sub

In questa, gB è il tuo array globale (io normalmente uso il prefisso g per variabili Process_Global e m per le Global, che in realtà sono variabili a livello di modulo).

Io ho usato la routine evento di un button per la simulazione, nel tuo esempio dovrebbe essere:
B4X:
SubAStream_NewData (Buffer() As Byte)
    Dim Oldb1Size As Int = b1.Length
 
    ' Conserva i byte memorizzati fin qui
    Dim Dummy(Oldb1Size) As Byte
    mByteConverter.ArrayCopy(b1, 0, Dummy, 0, Oldb1Size)
   
    ' ReDim senza Preserve, sigh
    Dim b1(Oldb1Size + Buffer.Length) As Byte

    ' Copia i vecchi byte
    mByteConverter.ArrayCopy(Dummy, 0, b1, 0, Oldb1Size)

    ' Copia i nuovi byte
    mByteConverter.ArrayCopy(Buffer, 0, b1, Oldb1Size, Buffer.Length)

End Sub
 

stefanoxjx

Active Member
Licensed User
Longtime User
Ciao Luca, praticamente hai messo in pratica il consiglio di Erel.
Effettivamente con poche righe di codice si risolve il problema :)
 
Top