Tableau dynamique [Résolu]

Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Statut
Membre
Dernière intervention
2 octobre 2014
- - Dernière réponse : Guillemouze
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
- 5 janv. 2010 à 09:16
Bonjour,

J'avais une procedure dans laquelle j'utilisait la fonction FillChar avec un tableau statique. J'ai modifié cette procedure, pour avoir un tableau de taille variable. Seulement, maitenant la procedure FillChar ne fonctionne pas correctement avec le tableau dynamique


//Appel avec TailleBufSource =4

procedure MaProcedure ( TailleBufSource : byte); var
BufSource : Array of Char;
begin
SetLength(BufSource, TailleBufSource);
ShowMessage(IntToStr(Length(BufSource))); //--> affiche 4
FillChar( BufSource, SizeOf(BufSource), #0 );
ShowMessage(IntToStr(Length(BufSource))); //--> affiche 0
.../...
BufSource[0]:='c' --> Plantage

Comment initializer mon tableu ? Avec initialize(BufSource) idem plantage sur BufSource[0]:='c'

Merci pour votre aide.
Afficher la suite 

10 réponses

Meilleure réponse
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
4
3
Merci
FillChar( BufSource[0], Length(BufSource) * SizeOf(BufSource[0]), #0 )

Dire « Merci » 3

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

Codes Sources 140 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Guillemouze
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Statut
Membre
Dernière intervention
2 octobre 2014
1
0
Merci
je précise plus "propre" que cela :

for i:=0 to TailleBufSource do
begin
BufSource[i]:=#0;
end;

Merci
Commenter la réponse de jderf
0
Merci
Salut,

Et hop en cherchant un peu, on trouve la solution et les explications :

http://www.delphifr.com/forum/sujet-REINITIALISER-VARIABLE_669851.aspx

Vilain coquinou, va tu as pas cherché beaucoup .


Allez hop

*un truc avec FillChar

Var
BufSource : array of char;
i:integer;
begin
  SetLength(BufSource, TailleBufSource);
  FillChar(BufSource[0],TailleBufSource, 0);
  for i:=0 to TailleBufSource-1 do
    begin
      BufSource[i]:=#97;
      showmessage(BufSource[i]);
     end;
  SetLength(BufSource,0);
end;


*un truc avec Initialize

Var
  BufSource : Array of Char;
  i:integer;
begin
  initialize(BufSource);
  SetLength(BufSource, TailleBufSource);
  for i:=0 to TailleBufSource-1 do
    begin
      BufSource[i]:=#97;
      showmessage(BufSource[i]);
     end;
  Finalize(BufSource);
end;


Puis bonne année à tous
Commenter la réponse de Utilisateur anonyme
0
Merci
Salut Guillemouze : je suis d'accord avec toi sauf que SizeOf(BufSource[0]) renvoit içi 1 donc là on peut s'en passer et du reste en le faisant on optimise le code
Commenter la réponse de Utilisateur anonyme
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
4
0
Merci
@francky : tout a fait, ca ici on bosse avec des char. Par contre, si c'est un array de autre chose, il vaut mieux utiliser le SizeOf au cas ou la taille de ce type change. D'ailleurs, c'est peut etre dangereux car D2010 n'utilise-t'il pas des widechar et non pas des ansiChar pour les "char" ?
Commenter la réponse de Guillemouze
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Statut
Membre
Dernière intervention
2 octobre 2014
1
0
Merci
Merci les gas et bonne année !!
Commenter la réponse de jderf
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
8
0
Merci
Salut,

Francky -> En fait, écrire 1 au lieu de SizeOf(...) n'optimise que si le compilateur n'est pas très intelligent. Ce qui n'est pas le cas de Delphi 6.

Tout d'abord, SizeOf ne peut être évaluer qu'à la compilation. Donc il ne coutera jamais rien à l'exécution :
Length(BufSource) * SizeOf(BufSource[0])
->
Length(BufSource) * 1


Ensuite, il faut savoir que le compilateur cherche à faire le maximum de calculs à la compilation, toujours dans l'optique d'avoir les meilleurs performances possibles. Donc écrire 2 * 2 dans le source revient à écrire 4 dans le code qui sera exécuté. C'est d'ailleurs très pratique pour avoir un code à la fois lisible et performant genre ITEM_COUNT * ITEM_SIZE. Et multiplier par 1 revient à... Ne rien faire du tout ! Donc :

Length(BufSource) * 1
->
Length(BufSource)


Preuve :


Dans le premier cas, SizeOf renvoie 1, donc la valeur renvoyée par random est directement affichée. ShowMessage(IntToStr(a)); génère exactement le même code.
Dans le deuxième cas, SizeOf renvoie 3, donc la valeur renvoyée par random est multipliée par 3 (a + a * 2) avant d'être affiché. Détail amusant, la multiplication ne coûte pratiquement pas plus chère (Dépend de la qualité du processeur) car réalisée dans un lea (Technique classique d'optimisation réalisable sur les petits entiers).

Bref, parfois être verbeux ou compatible D 2010, ça ne coûte pas plus chère !
Commenter la réponse de cs_rt15
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
4
0
Merci
merci pour cette démonstration fort intéressante Bacterius
Commenter la réponse de Guillemouze
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
26 juillet 2018
11
0
Merci
TRES, TRES INTERESSANT !

Merci rt15
Commenter la réponse de Caribensila
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
4
0
Merci
au temps pour moi rt15, j'ai cru que c'etait bacterius
Merci à toi en tout cas
Commenter la réponse de Guillemouze