Concaténer deux tableaux dynamiques

Résolu
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 - 29 déc. 2008 à 19:05
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 30 déc. 2008 à 22:42
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 }
A voir également:

12 réponses

ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
30 déc. 2008 à 17:55
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 }
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
30 déc. 2008 à 19:23
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.
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
30 déc. 2008 à 19:36
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 ="" />
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
30 déc. 2008 à 22:17
@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.
3

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

Posez votre question
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
29 déc. 2008 à 19:43
Bonnes fêtes à toi, Nico!

Les tableaux dynamiques étant implicitement des pointeurs, je ne pense pas que ce soit possible.
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
30 déc. 2008 à 05: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;

0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
30 déc. 2008 à 16:34
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.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
30 déc. 2008 à 16:38
Y'a qq chose qui m'échappe. 
Chez moi, ça ne fonctionne pas.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
30 déc. 2008 à 16:49
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...
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
30 déc. 2008 à 17:11
... Avec D7
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
30 déc. 2008 à 18:00
@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 }
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
30 déc. 2008 à 22:42
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..?
0
Rejoignez-nous