Pourquoi initialiser une variable locale? [Résolu]

khawarizm 121 Messages postés mercredi 22 novembre 2000Date d'inscription 4 août 2010 Dernière intervention - 1 déc. 2007 à 01:13 - Dernière réponse : Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention
- 3 déc. 2007 à 21:47
Hi ; j'ai une question
 SVP

.












En parcourant le forum et dans le topique sous-titré " calcul arithmétique"   
notre cantador adoré à fourni un code qui a été accepté.










Le code

 










procedure
TForm1.Button1Click(Sender: TObject);

var

  str: string;

  i, total: integer;

begin

  Total := 0;

  str := '95HELLO';

  for i := 1 to Length(str) do

    total := total + Byte(Str[i]);

  ShowMessage(IntToStr(total mod 256));

end;


:
 











Dans ce  code
fourni par cantador
la variable locale totale est initialisée à
zéro (et moi qui pensai
qu'une variable integer sous Delphi est initialisée à zéro au moment de sa
déclaration ) alors j'ai tester le code en enlevant
l'initialisation et à ma surprise le résultat à changer !!! ce qui veut dire
que l'initialisation là n'était pas fortuite ; j'ai bien lu et relu le
code cherchant à comprendre le pourquoi du comment mais je n’ai rien  piger ce qui ma amener à chercher sur les
sites  qui parlent de Delphi mais mes
recherches ont été infructueuses  et j'ai
le sentiment que je « zappe »  quelque chose d'important mais
quoi au juste <!--[if gte vml 1]><v:shapetype id ="_x0000_t75" coordsize="21600,21600"
o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"
stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:11.25pt;
height:11.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\wahid\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"
o:href="http://www.delphifr.com/imgs2/smile_question.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte vml 1]><v:shape id="_x0000_i1026"
type="#_x0000_t75" alt="" style='width:11.25pt;height:11.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\wahid\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"
o:href="http://www.delphifr.com/imgs2/smile_question.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte vml 1]><v:shape id="_x0000_i1027"
type="#_x0000_t75" alt="" style='width:11.25pt;height:11.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\wahid\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"
o:href="http://www.delphifr.com/imgs2/smile_question.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->  MERCI à vous .
Afficher la suite 

9 réponses

Répondre au sujet
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 1 déc. 2007 à 02:37
+3
Utile
Salut Khawa,

1) Une variable est un identificateur qui représente le contenu d'une adresse mémoire. Si elle n'est pas initialisée, elle peut représenter tout et n'importe quoi, que contient cette adresse mémoire. Et c'est souvent n'importe quoi, d'ailleurs. La déclaration de variable réserve une adresse mémoire, et l'initialisation la remplit.

2) Tu sais aussi qu'en Delphi, il y a :
- les variables globales
- les variables locales




Si tu n'initialises pas explicitement une variable globale, le compilateur l'initialisera à 0 ou à nil, comme tu disais.
Mais l


es variables locales, par contre, ne peuvent pas être initialisées dans leur déclaration et contiennent donc des données aléatoires tant qu'elles ne sont pas initialisées.

Tu peux aussi initialiser une variable globale comme ça :
var  X : Integer = 100;
Par contre, il n'est pas possible de faire ça avec une variable locale. C'est pour cette raison que notre 'Cantadoré' a agi ainsi :)))

@+
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Caribensila
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 1 déc. 2007 à 11:34
+3
Utile
Salut !

En fait, si le compilateur Delphi n'initialise pas les variables locales, c'est sûrement pour une raison de performances.
Et puis, dans une procédure, tu peux initialiser trois lignes plus loin, ce qui n'est pas gênant, contrairement à une variable globale qui demanderait une clause d'initialization pour pouvoir être... initialisée justement.

Sinon, y'a quand même l'exception qui confirme la règle: les chaînes longues (string) qui sont initialisées à '' (chaîne vide). Ceci grâce au compteur de référence (un truc complètement transparent pour nous mais qui fait des prouesses de malade - comme par exemple libérer la mémoire des chaînes ^^).
Je crois aussi que c'est le cas pour les tableaux dynamiques, mais là, je ne m'avance pas trop...
Reste à savoir si c'est le cas pour toutes les versions de Delphi.

Et non, tu n'as pas toute ton initiation à refaire ! Juste quelques trous à combler. Mais c'est normal, et d'ailleurs ce forum est là pour ça ! Bientôt, c'est toi qui mettra les autres sur la voie !

Sur ce,
Bonne prog' !
Flo

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de florenth
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 1 déc. 2007 à 11:52
+3
Utile
Salut,

rassure toi ... personne ne peut prétendre tout connaitre.

Mais si tu avais activé les conseils et les avertissements du compilateur
il t'en aurait informé avec un message :
Voici un exemple de function qui déclenche conseils et avertissements:

Function test : Boolean;
Var A, B, C : Integer;
Begin
  A := 0;

  A := B * C;
  Result := A <> B
End ;
<center>Highlighted with Pas2HTML

http://www.delphifr.com/
</center>[Pascal Conseil] UMain.pas(37): H2077 La valeur affectée à 'A' n'est jamais utilisée
[Pascal Avertissement] UMain.pas(38): W1036 La variable 'B' n'est peut-être pas initialisée
[Pascal Avertissement] UMain.pas(38): W1036 La variable 'C' n'est peut-être pas initialisée

On peut donc dire que toutes les initialisations ne sont pas nécessaire. Ici La variable A n'a pas besoin d'être initialisée  puisqu'elle  reçoit une valeur à la ligne suivante

Pour ne plus avoir de message du compilateur il faudrait faire
par exemple :

Function test : Boolean;
Var A, B, C : Integer;
Begin
  B : = 10;

   C := 5;
  A := B * C;
  Result := A
<> B
End ;
<center>Highlighted with Pas2HTML </center>

 
@+
Cirec

<hr siz ="" />
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Cirec
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 1 déc. 2007 à 14:50
+3
Utile
comme le dit cirec, si tu utilise une variable sans l'avoir initialisé, tu aura un avertissement. et il est TRES IMPORTANT que quand tu compiles ton projet, tu ai 0 conseil et 0 avertissements (ils sont pas la pour rien), sauf bien sur a des etapes intermediaires de developpement.
Attention tout de meme, le compilateur delphi n'est pas magique, il te trouvera un avertissement pour le code suivant

procedure AProcedure;
var
    x, y: integer
begin
  if monBooleen then
  begin
    x := 3;
  end;

  y := 5;

  if monBooleen then
  begin
    y := x + 3; // ici avertissement (x non initialisé), il ne detecte pas que x es forcement initialisé si monBooleen est true.
  end;
end;
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Guillemouze
khawarizm 121 Messages postés mercredi 22 novembre 2000Date d'inscription 4 août 2010 Dernière intervention - 1 déc. 2007 à 03:32
0
Utile
Salut cari ; et bien mon ami j’étai toujours induit en
erreur et je pensai que c’était valable pour les deux genres de variables (c'est-à-dire
que le compilateur Delphi s’encharge de l’initialisation dans les deux cas ) et
il à fallu ce code pour me rendre compte de mon  erreur et qu’au moment où je commençai  à croire que je suis enfin prêt à passer à un
autre niveau je me rend compte que je devrai recommencer toute mon initiation  de Delphi et revoir les bases


Merci mon ami .et à d’ici quelques mois.
Commenter la réponse de khawarizm
khawarizm 121 Messages postés mercredi 22 novembre 2000Date d'inscription 4 août 2010 Dernière intervention - 1 déc. 2007 à 13:07
0
Utile
Bonjour tout le monde ;

justement le faite que j’ai toujours affecter quelque chose à mes variables j’ai jamais fait attention ; quoi que parfois j’ai eu des problèmes de calcules mais j’ai jamais fait le lien , tellement la chose était évidente pour moi , à force de vouloir évoluer vite voilà que je laisse des plumes . En tous cas j’ai appris ma leçon et j’espère que tout les débutants comme moi tirent une conclusion de ça . Merci infiniment  les gars, heureusement que vous ete  là , vous^ete  une vrais chance pour nous .
Commenter la réponse de khawarizm
khawarizm 121 Messages postés mercredi 22 novembre 2000Date d'inscription 4 août 2010 Dernière intervention - 2 déc. 2007 à 11:53
0
Utile
Bonjour ; Merci Guillemouze , tu à parfaitement raison j’avais la facheuse habitude de  négliger, a tort bien sur ,  les messages et les commentaires générés par le compilateur du moment que ça compile et que sa marche mais plus maintenant , je suis entrain de chercher sur l’aide de Delphi et un peu partout les messages d’erreur générés par Delphi et leurs significations et je découvre que c’est une autre  source d’apprentissage pour bien programmer en Delphi . Merci et bonne journée à tous .
Commenter la réponse de khawarizm
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 3 déc. 2007 à 09:19
0
Utile
@Guillemouze:

en passant:
si monboolean est global et que tu as un autre thread, la valeur peut changer entre le debut et la fin de ta méthode. (le compilo a raison, ou disons qu'il est prudent. Note que l'exemple serrait correct si monbolean est un parametre de ta procedure.)

bon code,

Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Commenter la réponse de cs_Loda
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 3 déc. 2007 à 21:47
0
Utile
@loda:
ouais, en fait, j'etais parti sur un simple bout de code que j'ai finalement encadré par une procedure, et j'ai oublie de mettre monBooleen en var ;)
Commenter la réponse de Guillemouze

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.