Italian Concatenare array di byte...

Discussion in 'Italian Forum' started by stefanoxjx, Feb 20, 2015.

  1. stefanoxjx

    stefanoxjx Active Member Licensed 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ì:

    Code:
    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.
     
  2. LucaMs

    LucaMs Expert Licensed 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 likes this.
  3. stefanoxjx

    stefanoxjx Active Member Licensed 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.
     
  4. LucaMs

    LucaMs Expert Licensed User

    Beh, una soluzione funzionante l'ho trovata:
    Code:
    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:
    Code:
    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 and ellpopeb4a like this.
  5. stefanoxjx

    stefanoxjx Active Member Licensed User

    Ciao Luca, praticamente hai messo in pratica il consiglio di Erel.
    Effettivamente con poche righe di codice si risolve il problema :)
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice