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

Visual C++ Discussion :

Déclaration et initialisation d'une variable


Sujet :

Visual C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Déclaration et initialisation d'une variable
    Je fabrique un petit programme avec Visual Studio 2010. Ce programme comporte 3 fenêtres, form1, forrm2 ... Chaque fenêtre possède divers contrôles et fonctions qui doivent avoir accès à une variable tableau de 10 entiers ( int var[10] ).
    Où, dans mon programme, et de quelle façon dois je déclarer et initialiser cette variable pour en avoir accès depuis mes 3 fenêtre ?
    Merci de votre réponse .

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tes fenêtres sont-elles égales, ou y en a-t-il une "maître"?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Réponse à Médinoc
    Citation Envoyé par Médinoc Voir le message
    Tes fenêtres sont-elles égales, ou y en a-t-il une "maître"?
    Voici ma fonction main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(array<System::String ^> ^args)
    {
    	// Activation des effets visuels de Windows*XP avant la création de tout contrôle
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
    	// Créer la fenêtre principale et l'exécuter
    	Application::Run(gcnew Form1());
    	Application::Run(gcnew Form2());
            Application::Run(gcnew Form3());
    	return 0;
    }
    La form1 est une fenêtre de présentation. Elle se ferme au bout de 3s à laide d'un timer et methose Close.
    La form2 est en fait ma fenêtre principale. Elle comporte une barre de menu, un pictureBox et plusieurs boutons.
    Voici par exemple le code d'un menu :
    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
    private: System::Void distributionAléatoitreToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) 
    {
        int donne[10],i;
        for (i = 0; i < 52; i++)
        donne[i]= i+1;
         Melangetableau(donne,10);
          this->pictureBox1->Refresh();
         //Affiche la carte "Dos".
          Image^ Image = Image::FromFile("./Cartes/Dos.jpg" );
          Graphics^ g = this->pictureBox1->CreateGraphics();
           g->DrawImage(Image,457,20,100,150);
           g->DrawImage(Image,457,597,100,150);			
            Image->RotateFlip( RotateFlipType::Rotate90FlipNone );
           g->DrawImage(Image,20,333,150,100);
           g->DrawImage(Image,847,333,150,100);
           delete g;
    }
    A partir des boutons, je voudrais avoir accès au tableau " int donne[10]" et inscrire par exemple le code dans la partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
    La fenêtre form3 est pour le moment une fenêtre "fille" de form2. ( mais envisager aussi le cas où form3 serait indépendante de form2 )
    A partir de form3, je voudrais aussi avoir accès au tableau "int donne[10].
    Merci de votre réponse. ( je ne suis pas expert en C++ et truc.net, mais j'ai pratiqué le fortran et le C il y a quelques années )

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le plus simple: Tu le crées dans le main() et tu le passes dans les constructeurs de tes classes de forms.
    Et de préférence, utilise un tableau .Net:
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main(array<System::String ^> ^args)
    {
    	// Activation des effets visuels de Windows*XP avant la création de tout contrôle
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
     
    	// Créer la fenêtre principale et l'exécuter
    	array<int>^ tableau = gcnew array<int>(10);
    	Application::Run(gcnew Form1(tableau));
    	Application::Run(gcnew Form2(tableau));
            Application::Run(gcnew Form3(tableau));
    	return 0;
    }

    PS: Si Form3 est censée être une fenêtre "fille" de Form2, alors la ligne Application::Run(gcnew Form3(tableau)); n'a rien à faire ici.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    OK, merci pour cette réponse Medinoc.
    Je vais essayer et te tiendrai au courant.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    [QUOTE=Médinoc;7786081]Le plus simple: Tu le crées dans le main() et tu le passes dans les constructeurs de tes classes de forms.
    Et de préférence, utilise un tableau .Net:
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main(array<System::String ^> ^args)
    {
    	// Activation des effets visuels de Windows*XP avant la création de tout contrôle
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
     
    	// Créer la fenêtre principale et l'exécuter
    	array<int>^ tableau = gcnew array<int>(10);
    	Application::Run(gcnew Form1(tableau));
    	Application::Run(gcnew Form2(tableau));
            Application::Run(gcnew Form3(tableau));
    	return 0;
    }

    Bonjour,Medinoc
    J' essayé ce que tu m'as proposé. ( mon tableau s'appelle "donne")
    Dans ma fonction main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main(array<System::String ^> ^args)
    {	
    	// Activation des effets visuels de Windows XP avant la création de tout contrôle
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
     
    	array<int>^ donne = gcnew array<int>(10);
    	// Créer la fenêtre principale et l'exécuter
    	Application::Run(gcnew Form1());
    	Application::Run(gcnew Form2(donne));
    	return 0;
    }
    Dans le fichier form2.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private: System::Void distributionAléatoitreToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) 
    {
    int i;
    	array<System::Int32 ^> ^donne;
    	for (i = 0; i < 10; i++)
                      donne[i]= i+1;
                      Melangetableau(donne,10);
    }
    Hélas, deux messages d'erreurs lors de la génération de la solution.

    1>------ Début de la régénération globale*: Projet*: Jeu, Configuration*: Debug Win32 ------
    1> stdafx.cpp
    1> AssemblyInfo.cpp
    1> Jeu.cpp
    1>d:\projets\projects\jeu\jeu\Form2.h(285): error C2664: 'Melangetableau'*: impossible de convertir le paramètre 1 de 'cli::array<Type> ^' en 'int []'
    1> with
    1> [
    1> Type=System::Int32 ^
    1> ]
    1>Jeu.cpp(23): error C3673: 'Jeu::Form2'*: la classe n'a pas de constructeur de copie
    La ligne 23 du fichier Jeu.cpp est : Application::Run(gcnew Form2(donne));

    Je comprends la première erreur. J' ai effectivement plusieurs fonctions écrites en C et situées dans un autre fichier.( Melangetableau est l'une d'entre elles )
    La deuxième erreur est plus obscur pour moi !

    Par contre j' ai essayé autre chose :
    Déclaration globale et initialisation de "donne" avant la fonction main dans la fichier Jeu.cpp ( le fichier de la fonction main)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int donne[10]={1,2,3,4,5,6,7,8,9,10}
    Dans le fichier form2.h, déclaration dans le code de mes boutons de "donne" en utilisant la classe extern.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private: System::Void distributionAléatoitreToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) 
    {
          int i;
          extern int donne[10];
          for (i = 0; i < 10; i++)
               donne[i]= i+1;
          Melangetableau(donne,10);
    }
    Cela fonctionne, ce qui me convient. ( j' ai accès à mon tableau et pas d'erreur avec la fonction Melangetableau )
    Merci de ton aide.
    ( éventuellement un petit mot pour m'éclairer sur la deuxième erreur )

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Une variable globale, en 2014

    Ton problème, c'est que tu n'utilises pas un tableau .Net sur toute la ligne. Fais-le.
    Et quand tu ne peux pas modifier le code pour une fonction, passe-lui un pin_ptr<int> vers le début du tableau à la place:
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
    	pin_ptr<int> pinDonne(&donne[0]);
    	Melangetableau(pinDonne,10);
    }
    Et si tu ne peux VRAIMENT pas utiliser un tableau .Net, alors utilise un tableau normal, que tu passes également par pointeur. Tout, sauf une variable globale.

    Au pire, à l'extrême pire, si tu n'as pas d'autre solution, même une variable statique dans une classe est moins horrible que ça.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [VB.Net]Déclaration et initialisation d'une variable
    Par DonF dans le forum Windows Forms
    Réponses: 6
    Dernier message: 14/11/2006, 20h05
  2. Initialisation d'une variable Object
    Par bobic dans le forum Langage
    Réponses: 2
    Dernier message: 08/09/2006, 17h21
  3. Vérifier l'initialisation d'une variable
    Par homeostasie dans le forum C
    Réponses: 11
    Dernier message: 04/08/2006, 18h05
  4. initialisation d'une variable DATE
    Par olivll dans le forum Access
    Réponses: 4
    Dernier message: 25/07/2006, 11h57
  5. déclaration et initialisation d'une matrice
    Par Gébix dans le forum C++
    Réponses: 5
    Dernier message: 16/02/2006, 01h22

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