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

  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 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
    Points : 4 625
    Points
    4 625
    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 ?
    Boost ftw

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 619
    Points : 30 642
    Points
    30 642
    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 chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    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 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
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 619
    Points : 30 642
    Points
    30 642
    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

  8. #8
    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
    J'ai un autre soucis maintenant

    j'ai modifié le code pour donner ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	int largeurImage = 0;
    	int hauteurImage = 0;
    	std::string fichierImage = "";
    	char delimiter;
     
    	std::ifstream donnees(this->fichier);
     
    	if(donnees)
    	{
    		donnees >> largeurImage >> delimiter >> hauteurImage >> delimiter >> fichierImage;
    Cette fois si, il me dit:
    "Erreur 1 error C2679: '>>' binaire : aucun opérateur trouvé qui accepte un opérande de partie droite de type 'std::string' (ou il n'existe pas de conversion acceptable)"

    On peut pas utiliser cette méthode pour lire un fichier?

  9. #9
    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
    J'ai trouvé la solution

    Il me fesais un multi thread debug et ça fonctionne pas mais là c'est bon.

    Encore merci

  10. #10
    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
    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...
    Tu m'expliques comment tu stockes un nombre indéterminé d'octets dans un pointeur codé sur 4 octets ?
    Boost ftw

+ 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