Concaténer 2 tableau d'octets

Résolu
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013 - 10 juin 2006 à 19:30
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013 - 12 juin 2006 à 19:58
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

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
11 juin 2006 à 12:22
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
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
12 juin 2006 à 04:02
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]
3
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
10 juin 2006 à 20:13
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 !
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
10 juin 2006 à 20:20
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
11 juin 2006 à 10:47
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
0
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
12 juin 2006 à 19:58
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
0
Rejoignez-nous