Concaténer 2 tableau d'octets [Résolu]

Signaler
Messages postés
185
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
20 juin 2013
-
Messages postés
185
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
20 juin 2013
-
Bonjour,

Une question toute bête :
Est-ce qu'on peut concaténer 2 tableaux d'octets, si oui comment ?
ex : on aurait
dim tablo1()
dim tablo2()
dim tablo3()
redim tablo1(10)
redim tablo2(20)
redim tablo3(30)
' les tableaux sont remplis d'octets par lecture d'1 fichier réparti dans les tableau 1 et  2
'je voudrais obtenir la fusion des tableaux 1 et 2 dans tablo3

'on ne peut pas faire tablo3=tablo1 & tablo2
Y'a-t-il 1 truc tout simple ?
Merci

6 réponses

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
25
Re,

suivant que le type Byte ou String, la réponse sera différente

un problème de taille de tableau ? je vois pas, ça dépend de la taille de la mémoire.

peut être le mieux c'est de lire directement dans un seul Tableau dès le début.


Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

'exemple de tableaux
    Dim Tablo1() As Byte

    Dim Tablo2() As Byte

    Dim Tablo3() As Byte

   

    ReDim Tablo1(2)

    Tablo1(0) = 65

    Tablo1(1) = 66

    Tablo1(2) = 67

   

    ReDim Tablo2(3)

    Tablo2(0) = 68

    Tablo2(1) = 69

    Tablo2(2) = 70

    Tablo2(3) = 71

'solution par CopyMemory
    Dim nb1      As Integer

    Dim nb2      As Integer

    nb1 = UBound(Tablo1) + 1

    nb2 = UBound(Tablo2) + 1

    ReDim Tablo3(nb1 + nb2 - 1)

    CopyMemory Tablo3(0), Tablo1(0), nb1

    CopyMemory Tablo3(nb1), Tablo2(0), nb2

'une autre solution surement moins rapide
    Tablo3 = StrConv(StrConv(Tablo1, vbUnicode) & StrConv(Tablo2, vbUnicode), vbFromUnicode)

'avec des String c'est encore plus lent
    Dim Tablo1() As String

    Dim Tablo2() As String

    Dim Tablo3() As String

   

    ReDim Tablo1(2)

    Tablo1(0) = 65

    Tablo1(1) = 66

    Tablo1(2) = 67

   

    ReDim Tablo2(3)

    Tablo2(0) = 68

    Tablo2(1) = 69

    Tablo2(2) = 70

    Tablo2(3) = 71


    Tablo3 = Split(Join(Tablo1, "/") & "/" & Join(Tablo2, "/"), "/")

Daniel
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
salut,
autre solution sans API (sans doute pas la plus rapide....)

Private Sub Form_Load() 
    Dim Tablo1(2) As Byte 
    Dim Tablo2(3) As Byte 
    Dim Tablo3()  As Byte 
    Dim i         As Long 
    Dim j         As Long 

    Tablo1(0) =  65 
    Tablo1(1) = 66 
    Tablo1(2) = 67 

    Tablo2(0) = 68 
    Tablo2(1) = 69 
    Tablo2(2) = 70 
    Tablo2(3) = 71 

    ReDim Tablo3( UBound (Tablo1) + UBound(Tablo2) + 1) 
    For i  = 0 To UBound(Tablo1) 
        Tablo3(i) =  Tablo1(i) 
    Next i 

    j =  UBound (Tablo1) 
    For i  = 0 To UBound(Tablo2) 
        j = j + 1 
        Tablo3(j) = Tablo2(i) 
    Next i 

'    For i = 0 To UBound(Tablo3)
'        Debug.Print Tablo3(i)
'    Next i
End Sub

<small> Coloration
syntaxique automatique [AFCK]</small>
       

++
PCPT   [AFCK]
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
Salut,

Je sais pas car je travaille pas avec les octets mais ta syntaxe me choque sur un point :

tablo3=tablo1 & tablo2

Si ce sont des tableaux, il faut un Index
Ex :
tablo3(1) = tablo1(1) & tablo(2)

Peut-être que cela fonctionnera !

@++

--Mortalino--
Le Mystérieux Chevalier "Provençal, le Gaulois"
N'oubliez pas de lire le règlement !
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
25
Salut,

tu peux faire Tabl3 = Tabl2

mais il n'y a pas de concaténation de Tableaux

il faut les recopier un par un

le plus rapide c'est d'utiliser CopyMemory


Ps: attention tes tableaux sont en Variant
    dim tablo1() As Byte

    dim tablo2() As Byte

    dim tablo3() As Byte

Daniel
Messages postés
185
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
20 juin 2013

Bonjour,

Merci de vos réponses mais je n'y trouve pas de solutions.
Je vais reprendre mon code autrement, et de toutes façons à vouloir regrouper plusieurs tableax d'octets dans 1 seul, je rencontre 1 autre problème, celui de sa taille...

Pour info Mortalino, on peut faire tablo3 = tablo1 sans passer par les index, voir le commentaire de Gobillot. Par contre on ne peut pas concaténer, ce que j'aurais souhaiter.

Merci
Messages postés
185
Date d'inscription
dimanche 29 juin 2003
Statut
Membre
Dernière intervention
20 juin 2013

Merci pour ces solutions.
Finalement, comme je le disais précédemment, j'ai changé mon code et du coup je me sers plus de tableaux à assembler, par contre maintenant, je sais comment faire et ça me resservira.
Je crois que la méthode par CopyMemory est + rapide.
Pour le problème de taille de tableaux => c'était lorsque je voulais copier 1 fichier de 250 Mo par : ReDim Tablo1(LOF(#1) - 1) où Tablo1 était déclaré : dim Tablo1() as Byte
J'avais un message Mémoire insuffisante, or j'ai 1 Go sur ma bécane !
Salut et Merci