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

yan35 185 Messages postés dimanche 29 juin 2003Date d'inscription 20 juin 2013 Dernière intervention - 10 juin 2006 à 19:30 - Dernière réponse : yan35 185 Messages postés dimanche 29 juin 2003Date d'inscription 20 juin 2013 Dernière intervention
- 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
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 11 juin 2006 à 12:22
3
Merci
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

Merci Gobillot 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de Gobillot
Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 12 juin 2006 à 04:02
3
Merci
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]

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de PCPT
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 10 juin 2006 à 20:13
0
Merci
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 !
Commenter la réponse de mortalino
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 10 juin 2006 à 20:20
0
Merci
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
Commenter la réponse de Gobillot
yan35 185 Messages postés dimanche 29 juin 2003Date d'inscription 20 juin 2013 Dernière intervention - 11 juin 2006 à 10:47
0
Merci
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
Commenter la réponse de yan35
yan35 185 Messages postés dimanche 29 juin 2003Date d'inscription 20 juin 2013 Dernière intervention - 12 juin 2006 à 19:58
0
Merci
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
Commenter la réponse de yan35

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.