Concaténer deux tableaux dynamiques [Résolu]

Signaler
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
-
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
-
Bonjour,

Je cherche depuis un petit moment le moyen de concaténer deux tableaux dynamiques (dynamic array of char).
Existe-t-il une fonction simple du genre concat ou insert permettant de réaliser cette opération sans être obligé de devoir s'occuper de tous les éléments des deux tableaux par l'intermédiaire d'une boucle?
Merci d'avance

Bonnes fêtes de fin d'année
@+
Nico { www.ni69.info }

12 réponses

Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
Merci à tous pour votre contribution !
Effectivement la fonction move est adaptée à ce genre de situations.
Je ne savais pas que l'on pouvait l'employer comme cela sur des tableaux dynamiques!

Il y a cependant une petite erreur dans to code f0xi :

move(A1[L1+1], A2[0], L2);
doit être modifié en :
move(A2[0], A1[L1], L2);

L'ordre des paramètres de move est en effet : Source, Dest, Count
De plus, L1 est déjà la longueur de A1 (indexé à partir de 0), dont inutile d'ajouter 1

@+
Nico { www.ni69.info }
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
Génial le truc de f0xi! 




NB: (extrait de l'aide)
Quand vous transmettez un tableau comme paramètre tableau ouvert par valeur, le compilateur crée une copie locale du tableau à l'intérieur du cadre de pile de la routine. Attention : vous ne devez pas provoquer de débordement du cadre de pile en transmettant de gros tableaux.
Messages postés
3825
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 février 2021
42
ouai c'est chouette mais attention à la taille des données ...

ici, par chance, le problème ne se pose pas puisque SizeOf(Char) = 1

mais pour bien faire il faudrait l'écrire comme ceci :

Move(A2[0], A1[L1], L2 * SizeOf(Char) );

 
@+
Cirec

<hr siz ="" />
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
@cari : l'aide précise bien le type de passage des paramètres :
"
Quand vous transmettez un tableau comme paramètre tableau ouvert par valeur".

Dans presque tous les cas de figure, il est préférable de transmettre par adresse (var, const ou encore out) car cela peut aussi améliorer sensiblement les performances.

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
Bonnes fêtes à toi, Nico!

Les tableaux dynamiques étant implicitement des pointeurs, je ne pense pas que ce soit possible.
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
type
  TDAOC = array of char;

procedure ConcatDAOC(var A1: TDAOC; const A2: TDAOC);
var L1, L2: integer;
begin
  L1 := Length(A1);
  L2 := Length(A2);
  SetLength(A1, L1+L2);
  Move(A1[L1+1], A2[0], L2);
end;

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Ok foxi (comme d'hab'), mais à condition que ce soit deux tableaux simples, pas des tableaux multidimensionnels ou je me trompe ?

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
Y'a qq chose qui m'échappe. 
Chez moi, ça ne fonctionne pas.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
J'ai essayé comme ça :

type
  TDAOC = array of char;



procedure ConcatDAOC(var A1: TDAOC; const A2: TDAOC);
  var L1, L2: integer;
  begin
  L1 := Length(A1);
  L2 := Length(A2);
  SetLength(A1, L1+L2);
  Move(A1[L1+1], A2[0], L2);
end;



procedure TForm1.Button1Click(Sender: TObject);
  var   A, B : TDAOC;
         i : Integer;
  begin
  SetLength(A, 2);
  A[0] :='a';
  A[1] :='b';
  SetLength(B, 3);
  B[0] :='c';
  B[1] :='d';
  B[2] :='e';
  ConcatDAOC(A,B);
  for i := 0 to 4 do Memo1.Lines.Add(A[i]);
end;

Dans le Memo, je n'ai que le tableau A...
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
... Avec D7
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
@Delphiprog :

Je n'arrive pas trop à me représenter ce que serait une concaténation de tableaux multidimensionnels dynamiques... Ca doit être assez exotique! 

@+
Nico { www.ni69.info }
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
Oui. C'est d'ailleurs ce qu'a fait f0xi. Et que je voulais, maladroitement, souligner.

Et, si j'ai bien compris, on pourrait concaténer des tableaux dynamiques de types différents..?