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 :

Fichier - invalid null pointer


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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
    Par défaut Fichier - invalid null pointer
    Bonjour à tous !

    Je suis sur le développement d'un jeu. j'utilise une class "Carte" permettant le chargement d'un fichier contenant les données d'une carte. ce fichier est un fichier au format texte et il sont nom est contenu dans un "const char* fichier) déclaré dans la class.

    je fais donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	int largeurImage = 0;
    	int hauteurImage = 0;
    	char* fichierImage = NULL;
    	char delimiter;
     
    	std::ifstream donnees(this->fichier);
    donnees >> largeurImage >> delimiter >> hauteurImage >> delimiter >> fichierImage;
    pour lire le contenu du fichier. J'ai une erreur que je ne comprend pas au moment de lire les informations (invalid null pointer)

    Je comprend pas trop d'ou ça peut venir. j'ai bien vérifier le chemin du fichier, ça fonctionne et la première ligne du fichier est:
    ça devrais fonctionner... je comprend pas

  2. #2
    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
    Par défaut
    ça devrais fonctionner...
    Qu'est-ce qui te permet de prétendre une chose pareille ?

    Comment tu veux écrire les données de ton fichier en mémoire, puisque ton pointeur est nul ?

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Cela n'a aucune chance de fonctionner, vu que tu essaye de faire placer une valeur lue dans une pointeur initialisé à NULL...

    On le dit et on le répète, ces temps, si à longueur de journée:

    POUR LA GESTION DE CHAINE DE CARACTERES, IL FAUT UTILISER LA CLASSE STD::STRING QUI REND LES CHOSES BIEN PLUS FACILES QUE LES CHAINE DE CARACTERES "C STYLE"

    Est-ce écrit, cette fois-ci suffisemment grand pour que cela rentre enfin dans la tete de tous

    Si, vraiment, il faut que tu récupère une chaine C style, pour l'utilise comme nom de fichier pour ouvrir un flux, par exemple, tu dispose de la fonction membre c_str() qui fera cela tres bien...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par koala01

    POUR LA GESTION DE CHAINE DE CARACTERES, IL FAUT UTILISER LA CLASSE STD::STRING QUI REND LES CHOSES BIEN PLUS FACILES QUE LES CHAINE DE CARACTERES "C STYLE"

    Est-ce écrit, cette fois-ci suffisemment grand pour que cela rentre enfin dans la tete de tous
    Là je pense que c'est bon !

  5. #5
    Membre éclairé 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
    Par défaut
    oula oula !

    J'avais tendance à utliser du char* comme habitude (langage C). Je vais essayer d'utiliser les std::string mais c'est un peu embettant dans certains cas car l'api que j'utilise (SDL) est en C.

    De l'autre, je pensais que ça fonctionnerais car j'initialise à NULL mais ensuite je lis le fichier : je place dans le char* le contenu...

    si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char* toto = NULL;
    toto = "coucou";
    ça pose aucun problème...

    Enfin bon, je vais me mettre au string

    Encore merci

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    std::string peut te sortir un const char* quand tu veux avec sa fonction membre c_str(). Bosser avec des APIs C n'est pas une excuse pour ne pas les utiliser

    Ensuite quand tu fais toto = "coucou", c'est une erreur car "coucou" est une chaîne littérale certainement placée dans un espace en lecture seule. Il faudrait donc que toto soit un const char*.

    Ensuite concernant la lecture, l'opérateur >> ne vas pas allouer d'espace pour la chaîne qu'il va lire, il va supposer qu'il y a suffisamment de place au bout du pointeur. Comme tu ne connais pas la taille de la chaîne à lire... autant dire que std::string est inévitable.

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par poussinphp
    oula oula !

    J'avais tendance à utliser du char* comme habitude (langage C). Je vais essayer d'utiliser les std::string mais c'est un peu embettant dans certains cas car l'api que j'utilise (SDL) est en C.
    Ca, c'est typiquement un mauvais argument...

    Comme, malgré tout, tu peux toujours obtenir la chaine C style à ta bonne convenance, utilise la std::string tant que tu peux, et passe en C style seulement quand tu as réellement besoin du C style (SDL, nom de fichier à fournir pour ouvrir un flux...)

    La seule exception est, finalement, quand tu dois lire le contenu d'un fichier dans un buffer en vue de le traiter et que tu ne peux pas etre qu'il n'y aura pas un signe "eof" ou autre singificateur de fin (typiquement, les fichier images et son)...

    A ce moment là, le fichier sera bien souvent encodé en binaire, d'ailleurs, et ce qu'il te faudra faire, c'est de déclarer un pointeur de type char, de lui allouer la taille pour contenir la totalité du fichier, et de lire le fichier "d'une seule traite"...
    De l'autre, je pensais que ça fonctionnerais car j'initialise à NULL mais ensuite je lis le fichier : je place dans le char* le contenu...

    si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char* toto = NULL;
    toto = "coucou";
    ça pose aucun problème...
    ce que tu fais là, c'est:
    déclarer un pointeur et l'initialiser à NULL
    fournir à ce pointeur l'adresse à laquelle se trouve la chaine (définie dans la mémoire "read only") "coucou"...

    D'ailleurs, c'est bien simple, il te sera normalement impossible d'écrire un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char* toto = NULL;
    toto = "coucou";
    toto[2]='a';
    Si on initialise un pointeur à NULL, c'est simplement:
    • parce que NULL est la seule valeur connue et testable dans n'importe quelle application
    • parce que lors de la déclaration d'un pointeur, on ne peut jamais etre sur du contenu, du fait d'une utilisation antérieure de la mémoire


    Enfin bon, je vais me mettre au string

    Encore merci
    Ca, c'est une tres bonne initiative
    [EDIT]grillé
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Null Pointer Exception
    Par gloglo dans le forum Langage
    Réponses: 4
    Dernier message: 20/12/2006, 11h32
  2. [Struts] Null Pointer Exception
    Par n@n¤u dans le forum Struts 1
    Réponses: 1
    Dernier message: 01/08/2006, 13h10
  3. Null Pointer Exception
    Par snouppy dans le forum JBuilder
    Réponses: 3
    Dernier message: 13/06/2006, 21h53
  4. Null pointer assignement
    Par issou dans le forum C
    Réponses: 12
    Dernier message: 18/11/2005, 13h39
  5. [Language]Constructeur==> Null pointer?
    Par Chiwawa dans le forum Langage
    Réponses: 8
    Dernier message: 14/05/2005, 22h51

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