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++ Discussion :

Fonctionnement incorrect de mon programme


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Etudiant en génie mécanique
    Inscrit en
    Mars 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : Mars 2011
    Messages : 146
    Par défaut Fonctionnement incorrect de mon programme
    Bonjour!

    J'ai écrit un programme qui tourne en boucle en utilisant la structure suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while (z != 100)
    {   // Emplacement 1
        switch (z)
        {    case 0:
                 // Emplacement 2
             break;
        }
    }
    Dans cet extrait, j'ai relevé deux emplacements. Au premier, j'instancie une classe, et au deuxième j'utilise cette instance de ma classe.

    Le problème, c'est que je programme ne fonctionne pas correctement.

    Dans la version précédente, l'instanciation de ma classe se trouvait en-dehors de la boucle "while", et ça marchait. Avez-vous une analyse plus précise pour moi, s'il-vous-plaît?

    Merci d'avance!

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Salut

    C'est normal, si tu instancies ta classe en créant un objet (comment l'instancies-tu ? sur la pile je pense ?) dans Emplacement 1, cet instance sera détruite à la fin de l'itération du while, puis recréée au début de la suivante. Si tu n'as besoin de ton objet que pour ce while et qu'il doit rester le même pour toutes les itérations, tu peux utiliser un simple scope de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Rien ici, ce n'est pas une boucle, c'est un simple scope
    {
      ClasseA objeta;
      while (z != 100){   
        ClasseB objetb; // Emplacement 1
        switch (z)
        {    case 0:
                 // Emplacement 2
             break;
        }
      } // objetb est détruit ici à chaque itération
    } // objeta est détruit ici

  3. #3
    Membre très actif
    Homme Profil pro
    Etudiant en génie mécanique
    Inscrit en
    Mars 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : Mars 2011
    Messages : 146
    Par défaut
    Oui, je comprends... mais je ne peux pas instancier mes classes en-dehors de la boucle "while", parce que ça ferait une liste de plusieurs milliers en fin de compte.
    Qu'est-ce que je peux faire?

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    que signifie "pas correctement"?

    montre nous ce que tu as fait concretement, et quel est le symptome de camarchepashitude?

  5. #5
    Membre très actif
    Homme Profil pro
    Etudiant en génie mécanique
    Inscrit en
    Mars 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : Mars 2011
    Messages : 146
    Par défaut
    Le compilateur passe dessus sans râler, ce qui signifie que le code est au-moins cohérent.
    En gros, il y a un "RenderWindow" (SFML) qui est déclaré dans le programme principal, puis passé par adresse dans la classe que je dois instancier. Une des fonctions-membres réalise l'affichage en utilisant la méthode "draw" de "RenderWindow".
    Le problème, c'est qu'à l'exécution, j'ai seulement un écran noir.

    Mais la classe est faite correctement, puisqu'elle fonctionnait avant. Le dernier changement en date, c'est une restructuration du programme principal, et depuis je suis obligé de déclarer ma "RenderWindow" en-dehors de la classe. Du coup, ça n'affiche plus rien.

  6. #6
    Membre très actif
    Homme Profil pro
    Etudiant en génie mécanique
    Inscrit en
    Mars 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : Mars 2011
    Messages : 146
    Par défaut
    J'ai de nouvelles informations!

    Ce code-ci fonctionne parfaitement:
    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
    #include <SFML/Graphics.hpp>
    #include <iostream>
    #include <windows.h>
    #include <string.h>
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctime>
     
    #include "MenuPrincipal.h"
    #include "Texte1.h"
     
    using namespace std;
    using namespace sf;
     
    void MenuPrincipal()
    {   int width(GetSystemMetrics(SM_CXSCREEN)); // Récupérer résolution horizontale de l'écran
        int height(GetSystemMetrics(SM_CYSCREEN)); // Récupérer résolution verticale de l'écran
     
        int z(0);
     
        Font fonte; // Fonte pour le texte des menus
        fonte.loadFromFile("Fontes/SuperMario256.ttf"); // Chargement d'un fichier font
     
        Color couleur; // Couleur pour le texte des menus
        couleur.r=255; couleur.g=100; couleur.b=0; couleur.a=255; // Création d'une couleur (rouge-orangé opaque)
     
        // Déclarer la fenêtre
        RenderWindow window;
     
        // Afficher la fenêtre
        window.create(VideoMode(width, height), "Fenetre", Style::Fullscreen);
     
        window.clear(); // Effacer l'écran
     
        Texte1 A(width, height, fonte, couleur, window); // Constructeur
     
        A.Set("Bonjour Monsieur"); // Constructeur
     
        A.Anim(); // Animer Texte1
     
        window.display(); // Afficher l'écran
     
        Sleep(5000); // Ca c'est juste pour qu'on ait le temps de voir quelque chose =D
    }
    Et celui-ci ne fonctionne pas (écran noir):
    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
    #include <SFML/Graphics.hpp>
    #include <iostream>
    #include <windows.h>
    #include <string.h>
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctime>
     
    #include "MenuPrincipal.h"
    #include "Texte1.h"
     
    using namespace std;
    using namespace sf;
     
    void MenuPrincipal()
    {   int width(GetSystemMetrics(SM_CXSCREEN)); // Récupérer résolution horizontale de l'écran
        int height(GetSystemMetrics(SM_CYSCREEN)); // Récupérer résolution verticale de l'écran
     
        int z(0), y(0);
     
        Font fonte; // Fonte pour le texte des menus
        fonte.loadFromFile("Fontes/SuperMario256.ttf"); // Chargement d'un fichier font
     
        Color couleur; // Couleur pour le texte des menus
        couleur.r=255; couleur.g=100; couleur.b=0; couleur.a=255; // Création d'une couleur (rouge-orangé opaque)
     
        // Déclarer la fenêtre
        RenderWindow window;
     
        // Afficher la fenêtre
        window.create(VideoMode(width, height), "Fenetre", Style::Fullscreen);
     
        while (z < 1000)
        {   window.clear(); // Effacer l'écran
     
            switch (z)
            {   case 0:
                    Texte1 A(width, height, fonte, couleur, window); // Constructeur
     
                    switch (y)
                    {   case 0:
                            A.Set("Bonjour Monsieur"); // Constructeur
                            y=1;
                        break;
                        case 1:
                            A.Anim(); // Animer Texte1
                        break;
                    }
                break;
            }
     
            window.display(); // Afficher l'écran
        }
    }
    Une idée?

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

Discussions similaires

  1. [patterns] conseil sur le fonctionnement de mon programme
    Par lichman dans le forum Design Patterns
    Réponses: 4
    Dernier message: 13/09/2007, 09h32
  2. Mon programme ne fonctionne plus après mise à jour de linux
    Par dybmans dans le forum GTK+ avec C & C++
    Réponses: 22
    Dernier message: 06/05/2007, 18h08
  3. Réponses: 18
    Dernier message: 19/04/2007, 17h42
  4. Mon programme ne fonctionne pas
    Par phil23 dans le forum C
    Réponses: 4
    Dernier message: 22/03/2007, 16h31
  5. Réponses: 2
    Dernier message: 30/10/2005, 14h38

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