IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Variable qui s'initialise à 0 toute seule


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 26
    Points
    26
    Par défaut Variable qui s'initialise à 0 toute seule
    Salut Salut!
    Voilà, je dev un petit programme pour m'amuser.
    J'utilise c++ builder, et voici le code:

    .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    int ArgentJ1=2000, ArgentJ2=2000, VieJ1=20, VieJ2=20;
    bool PouvoirNuc; //Variable Pouvoir Nucléaire
     
    //Dimensions
    Form1->Height=276;
    Form1->Width=705;
    Form1->Top=260;
    Form1->Left=315;
     
    Image4->Visible=false;  //Je cache l'icone nucléaire de J1 en début de partie
    Image5->Visible=false;  //Je cache l'icone nucléaire de J2 en début de partie
     
    Timer1->Enabled=true; //J'allume l'objet Timer
    Timer1->Interval=400; //J'initialise le temps de répétition à 0.4 seconde
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    //Toutes les fonctions se trouvant ici seront répétées en fonction de l'interval du Timer1
     
    Label1->Caption=AnsiString(ArgentJ1)+" $";  //Affichage de l'argent du joueur 1
    Label2->Caption=AnsiString(ArgentJ2)+" $";  //Affichage de l'argent du joueur 2
     
    ArgentJ1=ArgentJ1+1;    //J'incrémente l'argent de J1 de 1$
    ArgentJ2=ArgentJ2+1;    //J'incrémente l'argent de J2 de 1$
     
            if(ArgentJ1<=10000)        //Si J1 à assez d'argent, j'active son pouvoir Nuc
            {
            Image4->Visible=true;   //L'image de l'icone nucléaire devient visible
            }
            else
            {
            Image4->Visible=false;
            }
     
            if(ArgentJ2<=10000)        //Si J2 à assez d'argent, j'active son pouvoir Nuc
            {
            Image5->Visible=true;   //L'image de l'icone nucléaire devient visible
            }
            else
            {
            Image5->Visible=false;
            }
    }
    //---------------------------------------------------------------------------
    .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    //---------------------------------------------------------------------------
     
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <jpeg.hpp>
    #include <Graphics.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// IDE-managed Components
            TImage *Image1;
            TImage *Image2;
            TImage *Image3;
            TTimer *Timer1;
            TLabel *Label1;
            TLabel *Label2;
            TLabel *Label3;
            TLabel *Label4;
            TImage *Image4;
            TImage *Image5;
            void __fastcall FormCreate(TObject *Sender);
            void __fastcall Timer1Timer(TObject *Sender);
    private:	// User declarations
    public:		// User declarations
            int ArgentJ1;
            int ArgentJ2;
            int VieJ1;
            int VieJ2;
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif

    J'utilise le Timer pour répéter l'action qui consiste à gagner 1$ toutes les 0.4 seconde.
    Le problème c'est que j'initialise la valeur de l'argent à 2000$, mais lorsque j’exécute le programme elle reste 0.4 seconde sur 2000$,
    s'initialise à 0 puis ensuite ca repart (0$,1$,2$...)

    Moi, j'aimerai que ça parte directement de 2000$... Comment faire SVP Merci d'avance aux courageux !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    C'est normal ... sauf que ton compilateur devrait te dire que tu caches des attributs de classe.

    Dans ta méthode FormCreate tu crées 4 entiers (+ PouvoirNuc) avec le même nom que tes attributs.
    Mais tes attributs de classe ne sont pas changés (donc ils valent 0 grâce au constructeur).

    De toute manière je pense fortement que les attributs de ta classe doivent être initialisés dans le constructeur et non pas dans cette méthode.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    Salut

    Deplaces :
    int ArgentJ1=2000, ArgentJ2=2000, VieJ1=20, VieJ2=20;
    en dessous de :
    TForm1 *Form1;

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Non ! Pas la peine de s'encombrer avec des variables globales alors qu'on a des attributs.
    Comme l'a très bien fait remarquer foetus, tu crées de nouvelles variables locales au lieu d'utiliser les attributs existants.

    Dans TForm1::FormCreate remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ArgentJ1=2000, ArgentJ2=2000, VieJ1=20, VieJ2=20;
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ArgentJ1 = 2000;
    ArgentJ2 = 2000;
    VieJ1 = 20;
    VieJ2 = 20;
    (voir plutôt dans la liste d'initialisation du constructeur).

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par foetus Voir le message
    C'est normal ... sauf que ton compilateur devrait te dire que tu caches des attributs de classe.

    Dans ta méthode FormCreate tu crées 4 entiers (+ PouvoirNuc) avec le même nom que tes attributs.
    Mais tes attributs de classe ne sont pas changés.

    De toute manière je pense fortement que les attributs de ta classe doivent être initialisés dans le constructeur et non pas dans cette méthode.
    Salut

    Tu emplois beaucoup de mots que je connais, mais je t'avoues avoir du mal avec tout ce vocabulaire..
    D’après ce que je comprends, c'est dans le .h que ca cafouille ?
    Il faudrait donc que j'initialise mes variables dans TForm1 ?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par cedni Voir le message
    Salut

    Deplaces :
    int ArgentJ1=2000, ArgentJ2=2000, VieJ1=20, VieJ2=20;
    en dessous de :
    TForm1 *Form1;
    Salut, j'avais déja essayé, mais ca ne marche pas..



    Citation Envoyé par Winjerome Voir le message
    Bonsoir,

    Non ! Pas la peine de s'encombrer avec des variables globales alors qu'on a des attributs.
    Comme l'a très bien fait remarquer foetus, tu crées de nouvelles variables locales au lieu d'utiliser les attributs existants.

    Dans TForm1::FormCreate remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ArgentJ1=2000, ArgentJ2=2000, VieJ1=20, VieJ2=20;
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ArgentJ1 = 2000;
    ArgentJ2 = 2000;
    VieJ1 = 20;
    VieJ2 = 20;
    (voir plutôt dans la liste d'initialisation du constructeur).
    Génial! Ca marche !!
    Mais.. Pourquoi?? Elles sont de quel type mes variables alors maintenant ?? Merci de m’éclairer..

  7. #7
    Invité
    Invité(e)
    Par défaut
    Elles sont du type que tu as déclaré dans l'en-tête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class TForm1 : public TForm
    {
    public:		// User declarations
            int ArgentJ1;
            int ArgentJ2;
            int VieJ1;
            int VieJ2;
    };
    Avec ta ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ArgentJ1=2000, ArgentJ2=2000, VieJ1=20, VieJ2=20;
    tu créais et initialisais de nouvelles variables du même nom qui n'avaient rien à voir, variables qui étaient détruites à la fin de la méthode.
    Par la suite, dans Timer1Timer(), tu utilisais les variables membres qui elles n'avaient pas été initialisées.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par algerino77 Voir le message
    Mais.. Pourquoi?? Elles sont de quel type mes variables alors maintenant ?? Merci de m’éclairer..
    Regardes la déclaration TForm1::FormCreate: cela veut dire que tu implémentes la méthode FormCreate de la classe TForm1.

    Et comme c'est une méthode tu peux utiliser tous les attributs (public ou private) que tu as défini dans ton fichier header .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ....
     
    private:	// User declarations
    public:		// User declarations
            int ArgentJ1;
            int ArgentJ2;
            int VieJ1;
            int VieJ2;
    ....
    };

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 26
    Points
    26
    Par défaut
    C'est parfait! Merci beaucoup à tous Vraiment !

  10. #10
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    C++ permet également d'initialiser les variables dans le constructeur de ta classe
    ton code sera alors le suivant et plus besoin d'utiliser la procédure FormCreate qui est très peu utilisée en C++ Builder

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner),   // liste d'initialisation
              ArgentJ1(2000),
              ArgentJ2(2000),
              VieJ1(20),
              VieJ2(20)
    {
       Height=276;
       Width=705;
      Top=260;
       Left=315;
     
    Image4->Visible=false;  //Je cache l'icone nucléaire de J1 en début de partie
    Image5->Visible=false;  //Je cache l'icone nucléaire de J2 en début de partie
     
    Timer1->Enabled=true; //J'allume l'objet Timer
    Timer1->Interval=400; //J'initialise le temps de répétition à 0.4 seconde
    }
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Variable qui se remet à 0 TOUTE SEULE
    Par wilfryjules dans le forum C++
    Réponses: 17
    Dernier message: 12/02/2014, 00h34
  2. Variable qui change de valeur "toute seule"
    Par GDMINFO dans le forum C++
    Réponses: 9
    Dernier message: 14/10/2010, 18h12
  3. Variable qui change de valeur toute seul :(
    Par lcfseth dans le forum C
    Réponses: 12
    Dernier message: 22/12/2007, 12h25
  4. Un programme qui se met à jour tout seul
    Par ElbaC dans le forum C++
    Réponses: 6
    Dernier message: 09/06/2006, 11h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo