Concaténer deux tableaux dynamiques [Résolu]

Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Dernière intervention
5 juillet 2010
- - Dernière réponse : Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 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 }
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Dernière intervention
5 juillet 2010
3
Merci
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 }

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de ni69
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de Caribensila
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
3
Merci
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 ="" />

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de Cirec
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
3
Merci
@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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
Bonnes fêtes à toi, Nico!

Les tableaux dynamiques étant implicitement des pointeurs, je ne pense pas que ce soit possible.
Commenter la réponse de Caribensila
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
0
Merci
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;

Commenter la réponse de f0xi
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
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.
Commenter la réponse de cs_Delphiprog
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
Y'a qq chose qui m'échappe. 
Chez moi, ça ne fonctionne pas.
Commenter la réponse de Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
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...
Commenter la réponse de Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
... Avec D7
Commenter la réponse de Caribensila
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Dernière intervention
5 juillet 2010
0
Merci
@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 }
Commenter la réponse de ni69
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
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..?
Commenter la réponse de Caribensila

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.