Pourquoi initialiser une variable locale? [Résolu]

Messages postés
121
Date d'inscription
mercredi 22 novembre 2000
Dernière intervention
4 août 2010
- 1 déc. 2007 à 01:13 - Dernière réponse :
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
- 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 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
1 déc. 2007 à 02:37
3
Merci
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 :)))

@+

Merci Caribensila 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de Caribensila
Meilleure réponse
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
1 déc. 2007 à 11:34
3
Merci
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

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de florenth
Meilleure réponse
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
1 déc. 2007 à 11:52
3
Merci
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 ="" />

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de Cirec
Meilleure réponse
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
1 déc. 2007 à 14:50
3
Merci
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;

Merci Guillemouze 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de Guillemouze
Messages postés
121
Date d'inscription
mercredi 22 novembre 2000
Dernière intervention
4 août 2010
1 déc. 2007 à 03:32
0
Merci
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
Messages postés
121
Date d'inscription
mercredi 22 novembre 2000
Dernière intervention
4 août 2010
1 déc. 2007 à 13:07
0
Merci
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
Messages postés
121
Date d'inscription
mercredi 22 novembre 2000
Dernière intervention
4 août 2010
2 déc. 2007 à 11:53
0
Merci
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
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
30 juillet 2009
3 déc. 2007 à 09:19
0
Merci
@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
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
3 déc. 2007 à 21:47
0
Merci
@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.