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 :

fopen dans les classes


Sujet :

C++

  1. #1
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut fopen dans les classes
    Bonjour à tous !

    Je suis sur un gros problème et je ne trouve pas la solution. j'ai cherché partout, rien.

    J'utilise une classe:


    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
     
    class carte
    {
          public:
                  carte();
                  ~carte();
                  void chargement(char* mapp, SDL_Surface *screen);
                  int **tableau_donnee_carte;
                  int **tableau_donnee_collision;
                  void afficher();
                  void bouge(int x, int y);
                  int collision(int x, int y, int bouge_x, int bouge_y);
          private:
                  int i;
                  int j;
                  int k;
                  int deplacement_x;
                  int deplacement_y;
                  FILE *fp;
                  int taille_carte_x;
                  int taille_carte_y;
                  string tileset;
                  string path;
                  SDL_Rect clip_map[480];
                  SDL_Surface *map;
                  SDL_Rect position;
                  SDL_Surface *screen;
                  void chargement_png();
    };
    Dans cette classe j'ai une fonction.

    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
     
    void carte::chargement(const char* map, SDL_Surface *screen)
    {
        this->screen = screen;
        fp = fopen(map,"r");
        fscanf(fp, "%d,%d,%s", &this->taille_carte_y, &this->taille_carte_x, this->tileset.c_str());
        tableau_donnee_carte = (int**)calloc(this->taille_carte_x, sizeof(unsigned int));
        tableau_donnee_collision = (int**)calloc(this->taille_carte_x, sizeof(unsigned int));
            for (i = 0; i < taille_carte_x; i++)
            {
                tableau_donnee_carte[i] = (int*)calloc(this->taille_carte_y, sizeof(unsigned int));
                tableau_donnee_collision[i] = (int*)calloc(this->taille_carte_y, sizeof(unsigned int));
                for (j = 0; j < taille_carte_y; j++)
                {
                     fscanf(fp, "%d|", &(tableau_donnee_carte[i][j]));
                     fscanf(fp, "%d,", &(tableau_donnee_collision[i][j]));    
                }       
            }
        fclose(fp);
        chargement_png();
    }
    J'apelle cette fonction via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    o_carte->chargement("carte.hkm", ecran);
    Après plusieurs tests. Il semble que ça plante sur la ligne
    J'ai essayé de mettre les paramètres de la fonction en const char*. j'ai essayé de passer en string etc... rien à faire. ça compile mais ça plante (je suis sur dev-c++). Par contre, si je declare un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* test = "carte.hkm"
    dans ma class et que je met test au lieu de map dans la ligne du fopen. Magie, ça marche.

    Malheureusement, le programme etant un moteur de jeu. je peut pas me permettre de faire comme ça.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Houlà, tu as quelques trucs bien horribles ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(fp, "%d,%d,%s", &this->taille_carte_y, &this->taille_carte_x, this->tileset.c_str());
    Très mauvais.
    Pour un Xscanf("%s"), il te faut utiliser un buffer de caractères : Pas moyen d'y mettre une string standard.
    Et aussi, précise la taille dans le format de scanf.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau_donnee_carte = (int**)calloc(this->taille_carte_x, sizeof(unsigned int));
    Ici, tu alloues un tableau de pointeurs en demandant la taille d'entiers. Sous Win64, ça planterait. Pourquoi n'utilises-tu pas l'opérateur new ?
    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
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    je vais travailler sur ça Merci pour le conseil

    Par contre j'ai toujours le problème du fopen.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Normal, tu ne vérifies pas la valeur de retour.

    Accessoirement, ce serait pas mal d'utiliser les fonctions standards C++ plutôt que les fonctions standards C.
    Boost ftw

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par poussinphp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        fp = fopen(map,"r");
        fscanf(fp, "%d,%d,%s", &this->taille_carte_y, &this->taille_carte_x, this->tileset.c_str())
    En utilisant les flux C++, ce genre de code se réécrirait (sans aucune validation de format, comme ta version) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ifstream is(map);
    char virgule;
    is >> taille_carte_y >> virgule >> taille_carte_x >> virgule >> tileset;
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Et le tileset.c_str() avec *scanf, c'est interdit.
    (Ça doit faire une segfault d'ailleurs)
    Boost ftw

Discussions similaires

  1. [Ordre Alphabétique]Objets dans les classes !
    Par kinji dans le forum Designer
    Réponses: 6
    Dernier message: 12/12/2007, 18h30
  2. Réponses: 9
    Dernier message: 20/08/2007, 20h39
  3. SDL dans les classes
    Par thekaz dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 13/10/2006, 21h04
  4. [C++] Pb avec les variable static dans les classe
    Par quantik-revolution dans le forum C++
    Réponses: 3
    Dernier message: 03/03/2006, 18h40
  5. [preferences] pouvoir débuguer dans les classes de JAVA
    Par Satch dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 25/01/2006, 13h23

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