"Concaténation" de tableaux

Résolu
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 - 2 avril 2007 à 11:58
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 - 2 avril 2007 à 16:19
Salut à tous.
(pas très important mais bon): W2k SP4=> VB6 SP6

après avoir cherché un peu, je n'ai pas trouvé mon bonheur.
J'aimerais savoir si il existe une API permettant d'ajouter le contenu d'un tableau à un autre tableau
Dans mon exemple suivant que je sais incorrect
Dim Tbl1() As Byte
Dim Tbl2() As Byte
Tbl1 = Tbl1 + Tbl2, ----
[code.aspx?ID=41455 By Renfield]

Est il possible d'obtenir ce "résultat" simplement (avec une API ou autre). faire en sorte que le Tbl1 garde sont contenu et y ajoute à la fin le contenu de Tbl2. et ce sans avoir à passer par de Redim Preserve ou Ubound....
J'ai vu du CopyMermory mais je ne pense que cela reponde à mes besoins.

Si quelqu'un pouvait me mettre sur le chemin, ca serait cool.
D'avance merci.
@+: Ju£i?n
En attendant, Google is myfriend

7 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
2 avril 2007 à 12:15
A ma connaissance non, il n'existe as de fonction permettant de concatener un tableau.

A la limite CopyMemory pourrait t'éviter la boucle de copie, mais il faudra tout de même faire un Redim auparavent

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
2 avril 2007 à 13:02
Redim obligatoire, de par la nature d'un tableau : "'Ensemble d'elements contigüs en mémoire"

donc pour en coller deux, il faut agrandir le premier, et recopier le contenu du deuxieme a la suite.

CopyMemory est donc clairement ton ami ici.

Renfield
Admin CodeS-SourceS- MVP Visual Basic
3
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
2 avril 2007 à 12:48
Euh...
Bonjour Julien...
Les concaténations de tableaux ?
Pourquoi pas ? (avec une boucle, forcément) ...

Mais voyons donc : concaténation "horizontale", "verticale", ou en "ajout d'éléments" sans modifier le nombre de colonnes" ?
car ce serait bien évidemment différent ...

Je m'explique par 2 exemples :
1)
 tabl1 d'une colonne
 tabl2 d'une colonne
 tabltotal de 2 colonnes

et

2)
 tabl1 d'une colonne et 3 éléments
 tabl2 d'une colonne et 5 éléments
 tabltotal d'une colonne et 8 éléments


ls cas 1) et 2) ne seraient évidemment pas les mêmes ...


quelle est donc la "concaténation" qui t'intéresse, de ces 2 types ?

 
0
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
2 avril 2007 à 13:30
Re all[auteurdetail.aspx?ID= 615490 ]
Merci pour les réponses.
> [auteurdetail.aspx?ID=333139 casy]
,[auteurdetail.aspx?ID =2359 Renfield] je vais donc essayer de mettre mieux en pratique le CopyMemory.
>,[auteurdetail.aspx?ID=615490 jmfmarques] .celui qui m'intéresse est le cas 2) (sauf que ce n'est pas un troisième tableau mais le premier qui s'agrandit avec les éléments du second.
Aller je vais essayer cela.
@+: Ju£i?n
Pensez: Réponse acceptée
0

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

Posez votre question
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
2 avril 2007 à 15:21
Re,
Bon alors j'ai fait ceci qui semble répondre à mes attentes. Merci donc à [auteurdetail.aspx?ID= 333139 casy] , et à [auteurdetail.aspx?ID=2359 Renfield] .
Dim IndiceDepart As Integer
On Error Resume Next
   If UBound(My_TblBytes) = 0 Then
       IndiceDepart = 0
       On Error GoTo 0
   Else
       IndiceDepart = UBound(My_TblBytes) + 1
   End If
   ReDim Preserve My_TblBytes(IndiceDepart + UBound(BRecu))
   Call CopyMemory(My_TblBytes(IndiceDepart), BRecu(0), UBound(BRecu) + 1)

, ----
[code.aspx?ID=41455 By Renfield]
avec My_TblBytes, et BRecu des tableaux de Byte
Dernière petite question.
Ma "gestion" d'erreur n'est pas très "propre" à mon goût. y aurait il une meilleure facon de faire (c'est pour le cas où le tableau n'ai pas encore été dimensionné)

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
2 avril 2007 à 15:52
Pour ta gestion d'erreur, dans le cas ou le tableau n'est pas dimentionné, tu traite l'erreur puis tu annule la gestion d'erreur.

Par contre dans le cas ou le tableau est déjà dimentionné, ta gestion d'erreur est active jusqu'à la fin de la procedure.

C'est pas très logique. Soit tu la laisse active jusqu'à la fin dans tous les cas, soit tu l'arrete àprès le test dans tous les cas. A ce moment là déplacer le On Error Goto  après le End If

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
2 avril 2007 à 16:19
Casy a raison..

J'opteraio pour ne pas rester "englué" avec un "on error resume next" et choisirais un goto, mais très "rapproché" popur faciliter les lectures suivantes ..
Genre :

Private Sub Command1_Click()
  Dim toto() ' pas dimensionné, donc
  On Error GoTo 1
  ret = UBound(toto)
  GoTo 2
1:
  MsgBox "pas dimensionné ! "  ' à supprimer dans ton code, bien sur
  ReDim toto(0) ' on le dimensionne donc à 0
2:
   MsgBox UBound(toto) ' à supprimer  dans ton code, bien sur
  '  tu continues
End Sub
0