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 :

Crash non identifié (SFML)


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 Crash non identifié (SFML)
    Bonjour!

    Mon programme se plante toujours en arrivant à une étape précise. Je pense qu'il y a une incompatibilité de type ou une bêtise dans ce genre, mais je n'ai aucune idée de comment résoudre ça. Le compilateur passe dessus comme si tout allait bien =)

    Le problème survient lorsque le programme lit ces deux lignes. Le programme crashe complètement et je suis obligé de le fermer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte1.setString(txt[0]);   texte2.setString(txt[16]); // J'utilise SFML pour ça
    Le tableau est initialisé de la manière suivante:
    Il est rempli en utilisant la fonction "Sauvegarde":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int calc3=0; // Préparation de l'index
    while (calc3 < 16)
    {   txt[calc3]=Sauvegarde(101+calc3, 0, ""); // Remplissage des cases 0 à 15
         calc3++;
    }
    while (calc3 < 32)
    {   txt[calc3]=Sauvegarde(101+calc3, 1, ""); // Remplissage des cases 16 à 31
        calc3++;
    }
    Voici le header de la fonction "Sauvegarde":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifndef SAUVEGARDE_H_INCLUDED
    #define SAUVEGARDE_H_INCLUDED
     
    #include <string.h>
     
    using namespace std;
     
    string Sauvegarde(int a, int b, string c);
     
    #endif // SAUVEGARDE_H_INCLUDED
    Et son implémentation:
    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
    #include <iostream>
    #include <fstream>
    #include <string.h>
     
    #include "Sauvegarde.h"
     
    using namespace std;
     
    string Sauvegarde(int a, int b, string c)
    {   // a est le numéro du fichier utilisé
        // b est la ligne de sauvegarde utilisée
        // c est le contenu à écrire ou à retourner
     
        // Déclaration des variables
        int x; // Compteur de lignes pour la lecture des fichiers
        x=0; // Initialisation
     
        const char* y; // Nom du fichier à lire ou à écrire
     
        switch(a)
        {   case 1:     y="Donnees/Fichier_1.txt";  break; // Fichier 1
            case 2:     y="Donnees/Fichier_2.txt";  break; // Fichier 2
            case 3:     y="Donnees/Fichier_3.txt";  break; // Fichier 3
            case 4:     y="Donnees/Fichier_4.txt";  break; // Fichier 4
     
            case 101:   y="Donnees/Jeu_1.txt";   break; // Pacman 1
            case 102:   y="Donnees/Jeu_2.txt";   break; // Pacman 2
            case 103:   y="Donnees/Jeu_3.txt";   break; // Pacman 3
            case 104:   y="Donnees/Jeu_4.txt";   break; // Pacman 4
            case 105:   y="Donnees/Jeu_5.txt";   break; // Pacman 5
            case 106:   y="Donnees/Jeu_6.txt";   break; // Pacman 6
            case 107:   y="Donnees/Jeu_7.txt";   break; // Pacman 7
            case 108:   y="Donnees/Jeu_8.txt";   break; // Pacman 8
            case 109:   y="Donnees/Jeu_9.txt";   break; // Pacman 9
            case 110:   y="Donnees/Jeu_10.txt";  break; // Pacman 10
            case 111:   y="Donnees/Jeu_11.txt";  break; // Pacman 11
            case 112:   y="Donnees/Jeu_12.txt";  break; // Pacman 12
            case 113:   y="Donnees/Jeu_13.txt";  break; // Pacman 13
            case 114:   y="Donnees/Jeu_14.txt";  break; // Pacman 14
            case 115:   y="Donnees/Jeu_15.txt";  break; // Pacman 15
            case 116:   y="Donnees/Jeu_16.txt";  break; // Pacman 16
        }
     
        if (c == "") // Lecture seule dans la mémoire
        {   ifstream fichier(y);  // Ouvrir le fichier en lecture
     
            while (x <= b)
            {   getline(fichier, c);
                x++;
            }
        }
     
        else // Ecriture dans la mémoire (pas encore terminé, mais on s'en fout puisque je ne l'utilise pas encore non plus =D)
        {   ofstream fichier(y);  // Ouvrir le fichier en écriture
        }
     
        return c;
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    j'ai du mal à croire une seule seconde qu'un setString de SFML entraîne un crash.
    Par contre l'utilisation de Sauvegarde avec a > 116 (ou entre 5 et 100) me parait des plus suspect
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre éprouvé
    Inscrit en
    Mai 2012
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 65
    Par défaut
    Dans sauvegarde tu n'initialises pas y, mais tu supposes à tord qu'il sera rempli lorsque tu liras ton fichier, or tu tu fais un ifstream dessus plus tard, c'est pas étonnant que ton programme plante.

    Sinon juste pour ta culture personnelle tu peux faire une seul boucle au lieu de 2, en faisant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int calc3=0; // Préparation de l'index
    while (calc3 < 32)
    {   txt[calc3]=Sauvegarde(101+calc3, !!(calc3&16), "");
         calc3++;
    }

  4. #4
    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
    Les remarques sont correctes, j'ajouterais:
    - fichier pas testé (il vaut mieux tester les stream pour vérifier que l'acquisition de ressource, en l'occurrence l'ouverture de fichier, soit bien réalisée).
    - Usage suspect d'un tableau de char (pourquoi ne pas utiliser une string ?).

    Citation Envoyé par Danny-k Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int calc3=0; // Préparation de l'index
    while (calc3 < 32)
    {   txt[calc3]=Sauvegarde(101+calc3, !!(calc3&16), "");
         calc3++;
    }
    La double négation, c'est quand même bien laid ! Quitte à faire dans la bricole, autant écrire quelque chose de simple comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int calc3=0; // Préparation de l'index
    while (calc3 < 32)
    {
      txt[calc3]=Sauvegarde(101+calc3, (16 <= calc3), "");
      ++calc3;  // Préférer la pré-incrémentation dans ce cas
    }

  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
    Ouais, je vais tester le fichier. Mais normalement, je ne voudrais pas laisser le test une fois le dépannage terminé.
    Mon idée, c'est que ça sert à rien de tester un fichier puisque, dans le cas où la lecture ne marcherait pas, le programme ne fonctionne de toute façon pas. Je pars du principe que c'est censé fonctionner, et sinon ce ne serait pas à-cause du code lui-même.
    Tu as un avis là-dessus?
    EDIT: j'ai testé, le fichier est ouvert correctement.

    Plus important que ça: Quoi? où ça un tableau de char? J'ai pas remarqué ça, mais je pensais justement que c'était peut-être un problème de types!

  6. #6
    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
    Pourquoi tester le fichier?
    Parce que quitte à ce que le programme ne fonctionne pas, autant qu'il le dise à l'ouverture du fichier.
    Ce n'est pas gentil/correct de le laisser tenter de fonctionner s'il y a moyen de savoir à l'avance que c'est voué à l'échec.

    Ce serait une perte de temps de l'utilisateur, qui préfèrera que le programme lui dise "configuration invalide" plutôt que de le voir crasher plus ou moins violemment.

    C'est ce genre de chose qui rend un programme robuste.
    La robustesse, ce n'est pas de toujours fonctionner, c'est de ne jamais planter.
    S'apercevoir des erreurs, en informer l'utilisateur, et s'arrêter proprement, au plus tôt.

  7. #7
    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
    Citation Envoyé par Bousk Voir le message
    Bonsoir,

    j'ai du mal à croire une seule seconde qu'un setString de SFML entraîne un crash.
    Par contre l'utilisation de Sauvegarde avec a > 116 (ou entre 5 et 100) me parait des plus suspect
    T'as raison, en fait je devais redescendre à a=101 à-partir de la 16ème case du tableau

    OK, Danny-K, mais c'est quoi ça exactement? =)

    Détails à-part, c'est vraiment sur la ligne setString() que ça s'arrête. Je ne comprends pas ce qui se passe.
    Même si je remplace ça pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte1.setString("123");   texte2.setString("ABC");
    ça ne marche pas

  8. #8
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Citation Envoyé par Armulis Voir le message

    Le problème survient lorsque le programme lit ces deux lignes. Le programme crashe complètement et je suis obligé de le fermer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte1.setString(txt[0]);   texte2.setString(txt[16]); // J'utilise SFML pour ça
    Le tableau est initialisé de la manière suivante:
    La fonction "setString" de la SFML attends un string en entrée : http://sfml-dev.org/documentation/2....sf_1_1Text.php


    // Cela n'a pas de sens : "blablabla" est un tableau de char, pas un string
    texte1.setString("blablabla");"

    // Cela a plus de sens, szBlaBla est un string
    string szBlaBla = "blablabla";
    texte1.setString(szBlaBla);"

    // La classe string a un constructeur pour cela, mea culpa.

    J'imagine que "setString" de la SFML est contenue dans une dll. Je verrais bien un problème Debug/Release. L'exécutable est compilé en mode Debug et la dll est en mode Release. Il faut que l'exécutable et la dll soient dans le même mode de compilation. Enfin c'est une piste à suivre.

    Sous Visual Studio, c'est fatal. Le type string compilé en Debug est incompatible avec le type string compilé en mode Release, et vice versa.

  9. #9
    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
    Merci moldavi, mais je ne savais pas que les .dll existaient en version debug et en version release.
    Mais je ne sais pas comment générer ces fichiers. On me les a donnés quand j'ai commencé d'apprendre à utiliser SFMl, et on m'a dit qu'après avoir compilé, ça créerait un dossier "bin" contenant un dossier "debug" ou "release", et que je devrait coller ces fichiers dedans.
    Tu peux m'aider à résoudre ça?

  10. #10
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Re.

    Ici pour Code::Blocks : http://sfml-dev.org/tutorials/1.6/start-cb-fr.php

    Pour Visual Studio ici : http://www.sfml-dev.org/tutorials/1.6/start-vc-fr.php

    Important : pour la configuration Debug, il est impératif de lier avec les versions de débogage des bibliothèques SFML, qui sont suffixées par "-d" (sfml-system-d.lib ou sfml-system-s-d.lib dans ce cas). En effet, mélanger configurations Debug et Release peut résulter en de multiples erreurs ou crashs.
    Ce message est aussi valable pour les dll.

    Tu peux récupérer les fichiers de la SFML ici : http://www.sfml-dev.org/download-fr.php

  11. #11
    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
    Alors...
    J'ai écrit quatre trucs à la main (-lsfml-graphics, -lsfml-window et -lsfml-system dans "Linker settings, et SFML_DYNAMIC dans "Compiler settings")
    J'ai aucune idée de si c'est censé marcher ou pas, mais mon programme bug toujours pareil =)

  12. #12
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Re.

    Je ne vois pas les -d pour Debug.

    Devant un tel problème, il faut simplfier les choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    void main(){
     
      sf::Text sfTest;
      string szTest = "test";
      sfTest.setString(szTest);
    }
    Ensuite, compiler en mode debug/Release, mettre les dll qui vont bien, dans les bons dossiers. Ensuite, attention, le fait de lancer le programme depuis l'éditeur peut nécessiter de mettre les dll dans le même dossier que la base du projet. Le mieux est de lancer l'exécutable depuis le répertoire Debug ou Release pour tester (click sur l'exe qui se trouve dans le répertoire debug ou Release).

Discussions similaires

  1. Réseau non identifié sous vista
    Par Benawa dans le forum Windows Vista
    Réponses: 3
    Dernier message: 28/11/2008, 11h56
  2. Réseau non identifié sous vista
    Par rimbaut dans le forum Windows Vista
    Réponses: 5
    Dernier message: 27/04/2007, 13h28
  3. problème de variable non identifié
    Par teen6517 dans le forum Langage
    Réponses: 1
    Dernier message: 08/03/2007, 19h35
  4. Bug d'affichage non identifié. . .
    Par TheReturnOfMuton dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 21/06/2006, 20h25
  5. probleme de non identifier (Run On Server) sur tomcat
    Par subzero82 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 12/05/2006, 19h08

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