Tableau dynamique

Résolu
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 - 4 janv. 2010 à 12:38
Guillemouze Messages postés 991 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.

9 réponses

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
4 janv. 2010 à 14:02
FillChar( BufSource[0], Length(BufSource) * SizeOf(BufSource[0]), #0 )
3
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
4 janv. 2010 à 13:31
je précise plus "propre" que cela :

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

Merci
0
Utilisateur anonyme
4 janv. 2010 à 15:12
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
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
4 janv. 2010 à 16:24
@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" ?
0

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

Posez votre question
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
4 janv. 2010 à 17:12
Merci les gas et bonne année !!
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
4 janv. 2010 à 18:47
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 !
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
4 janv. 2010 à 22:57
merci pour cette démonstration fort intéressante Bacterius
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
5 janv. 2010 à 02:03
TRES, TRES INTERESSANT !

Merci rt15
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
5 janv. 2010 à 09:16
au temps pour moi rt15, j'ai cru que c'etait bacterius
Merci à toi en tout cas
0
Rejoignez-nous