Tableau dynamique [Résolu]

Signaler
Messages postés
189
Date d'inscription
mercredi 29 décembre 2004
Statut
Membre
Dernière intervention
2 octobre 2014
-
Guillemouze
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
-
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

Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
FillChar( BufSource[0], Length(BufSource) * SizeOf(BufSource[0]), #0 )
Messages postés
189
Date d'inscription
mercredi 29 décembre 2004
Statut
Membre
Dernière intervention
2 octobre 2014
1
je précise plus "propre" que cela :

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

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
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
@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" ?
Messages postés
189
Date d'inscription
mercredi 29 décembre 2004
Statut
Membre
Dernière intervention
2 octobre 2014
1
Merci les gas et bonne année !!
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
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 !
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
merci pour cette démonstration fort intéressante Bacterius
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
TRES, TRES INTERESSANT !

Merci rt15
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
au temps pour moi rt15, j'ai cru que c'etait bacterius
Merci à toi en tout cas