Réinitialiser une variable [Résolu]

Messages postés
362
Date d'inscription
mardi 18 décembre 2001
Statut
Membre
Dernière intervention
24 août 2012
- - Dernière réponse : cs_Forman
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
- 3 août 2006 à 18:40
bonjour a tous

j'aimerai savoir comme remetre a 0 une variable comme

variable:array[1..1024] of byte;


merci d'avance
Afficher la suite 

7 réponses

Meilleure réponse
Messages postés
1649
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
8
3
Merci
essayes fillchar mais je ne suis pas sur qu'elle fonction pour tous les types de tableau:

procedure FillChar(var X; Count: Integer; Value: Byte);



@+

jlen

Dire « Merci » 3

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

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

Commenter la réponse de jlen100
Messages postés
1649
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
8
0
Merci
salut,

je pense que le plus simple est encore de faire une boucle for



for i:=1 to 1024 do variable[i]:=0;



@+

jlen
Commenter la réponse de jlen100
Messages postés
362
Date d'inscription
mardi 18 décembre 2001
Statut
Membre
Dernière intervention
24 août 2012
0
Merci
heuuu ya pas un moyen "plus propre" ?
Commenter la réponse de cs_kalif
Messages postés
199
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
10 octobre 2006
1
0
Merci
Si, elle fonctionne mais elle demande une sérieuse connaissance de la taille du tableau et de la taille du type de variables du tableau.
- Pour un tableau fixe, c'est facile, un simple SizeOf(MonTableau) et le tour est joué.
- Pour un tableau dynamique, là ca ne marche plus. SizeOf(MonTableau) renvoie la taille du pointeur du tableau, et donc FillChar Initialise le pointeur autrement dit : gare aux plantages dus à un mauvais pointeur. Pour remédier à ca, c'est assez simple : FillChar(MonTableau[0], Length(MonTableau)*SizeOf(TypeElementsTableau), 0{par exemple}): // dans le cas de kalif, TypeElementsTableau c'est Byte
Malheureusement cette méthode est à revoir pour le cas d'un Array of Array of puisque les éléments du 1er array pointent sur d'autres Array lol. Faut donc faire une boucle For z := Low(MonTableau) to High(MonTableau) do FillChar(MonTableau[z][0], Length(MonTableau[z])*SizeOf(TypeElementsTableau), 0); et ainsi de suite suivant les dimentions du tableau...

Pour ce qui est de la valeur d'initialisation, y'a un truc à savoir. Value est un byte. Si Value<>0 et que le type des éléments du tableau est un Integer (4 bytes à la suite) par exemple, va y avoir des surprises :
Si Value=2 (0b0010) par exemple, ca affectera à chaque élément la valeur $2222 (0d8738 ou 0b10001000100010) et non 2 comme voulu.

Tout problème a sa solution... Mais en général, c'est jamais la bonne...
Commenter la réponse de Emandhal
Messages postés
1649
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
8
0
Merci
Emandhal--> c'est pour cela qu'en premiere solution j'avais donné
une initailisation par boucle qui fonctionne quelque soit le cas (il
sufit d'imbriquer des boucles si besoin est)

Pour remplir un tableau de type byte avec des integer ou même tout
autre chose on peut utiliser des pointeurs et transtyper:

par exemple pour un integer on déclare une variable Valeu:r:
^integer et récupére l'adrresse du tableau qu'on veut remplir par
Valeur:=@tableau [xx]; ensuite on affecte la valeur Valeur^:=YY;
On fait l'opération inverse pour récupérer les valeurs.



@+

jlen
Commenter la réponse de jlen100
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
0
Merci
sur un tableau statique, y'a pas 36000 solutions :

type
TA1024Bytes = array [0.1024] of byte;

var
MonTableau : TA1024Bytes;

procedure EmptyTableau(var table : TA1024Bytes);
var x : integer;
begin
for x := low(table) to high(table) do table[x] := 0;
end;

solution qui ne sert pas a grand chose (a part remettre a 0 toutes les valeurs) car que les valeurs soit a 0 ou a un autre chiffre, sa taille en memoire serat toujours la meme (1025 octets).

autre solution, le tableau dynamique :

Type
TBytesArray = array of byte;

Var
MonTableau = TBytesArray;

// permet de definir la taille du tableau
procedure SetArraySize(var table : TBytesArray);
begin
SetLength(table,1024);
end;
{ utilisation :
SetArraySize(MonTableau);
}

// "detruit" le tableau
procedure FlashArray(var table : TBytesArray);
begin
SetLength(table,0);
end;
{ utilisation :

FlashArray(MonTableau);

}


// recupere une valeur du tableau
function GetByteFrom(var table : TBytesArray; const index : integer) : byte;
begin
if (index >= low(table)) and (index <= high(table)) then result := table[index];

end;
{ utilisation :

N := GetByteFrom(MonTableau,128);

}


// recupere plusieurs valeurs du tableau dans un autre tableau dynamique
procedure GetMultiBytesFrom(out aTo : TBytesArray; var aFrom : TBytesArray; const index : array of byte);
var x : integer;
begin
setlength(aTo,high(index));
for x := 0 to high(index) do begin

if (index[x] >= low(aFrom)) and (index[x] <= high(aFrom)) then
aTo[x] := aFrom[index[x]];

end;

{ utilisation :

GetMultiBytesFrom(TableauTemp,MonTableau,[1,10,50,254,18,16,32,514]);

}


// place une valeur dans le tableau
function SetByteTo(var table : TBytesArray; const index : integer; const value : byte = 0) : boolean;
begin
if (index >= low(table)) and ( index <= high(table)) then begin
table[index] := value;
result := true;
end else begin
result := false;
end;
end;
{ utilisation :

if not SetByteTo(MonTableau,954,25) then showmessage('Erreur dans les limites d''etendues');
ou :
SetByteTo(MonTableau,812,128);

}


voila...

<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
Commenter la réponse de f0xi
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
0
Merci
type
TByteArray=array[1..1024] of Byte;

const
VariableNull:TByteArray=(
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);

var
Variable:TByteArray;

procedure RemplirDeZeros;
begin
Variable:=VariableNull;
end;

Cette méthode est garantie la plus rapide! (et la plus simple, hormis la déclaration de la constante VariableNull qui est assez longue ;-) ). En effet, pour remplir Variable de zéros, il suffit d'écrire la ligne:

Variable:=VariableNull;

Delphi génère le code correspondant à cette affectation SANS UTILISER DE BOUCLES si mes souvenirs sont bons, c'est à dire que le code machine généré équivalent à cette instruction est à peu de choses près:

Variable[1]:=VariableNull[1];
Variable[2]:=VariableNull[2];
...
Variable[1024]:=VariableNull[1024];

(en fait, c'est plus compliqué car plutôt que de remplir Byte par Byte, le compilateur génère un code qui travaille sur 32 bits pour que ça aille encore plus vite)

La procédure FillChar est programmée avec une boucle, comme on peut le constater dans System.pas:

procedure _FillChar(var Dest; count: Integer; Value: Char);
{$IFDEF PUREPASCAL}
var
I: Integer;
P: PChar;
begin
P := PChar(@Dest);
for I := count-1 downto 0 do
P[I] := Value;
end;
{$ELSE}
asm
{ ->EAX Pointer to destination }
{ EDX count }
{ CL value }

PUSH EDI

MOV EDI,EAX { Point EDI to destination }

MOV CH,CL { Fill EAX with value repeated 4 times }
MOV EAX,ECX
SHL EAX,16
MOV AX,CX

MOV ECX,EDX
SAR ECX,2
JS @@exit

REP STOSD { Fill count DIV 4 dwords }

MOV ECX,EDX
AND ECX,3
REP STOSB { Fill count MOD 4 bytes }

@@exit:
POP EDI
end;
{$ENDIF}

La partie en assembleur travaille aussi sur 32 bits pour otpimiser le transfert.

De la même façon, il y a aussi l'API ZeroMemory mais il faut passer l'adresse de la variable:

ZeroMemory(@Variable,SizeOf(Variable));

Cette écriture a l'avantage de s'adapter si l'on décide de changer la taille du tableau dans sa déclaration a posteriori.
Commenter la réponse de cs_Forman