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 :

Etrange problème avec un fprintf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 199
    Par défaut Etrange problème avec un fprintf
    Bonsoir à tous,

    J'ai developpé un petit programme de traitement d'image ppm/pgm sous linux. Ca fonctionne sans problème sous linux mais lorsque je passe sous windows je rencontre des erreurs etranges. J'ai tenté d'isoler le problème et il semble que le bug vienne d'un simple fprintf. Pour être plus précis voici le morceau de code, très simple je vous l'accorde, incriminé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FILE *fichier = NULL;
    fichier = fopen( nomFichier , "wb" );
    fprintf(fichier,"P5\n256 256\n255\n");
    fclose(fichier);
    Je code sous code::blocks avec le toolkit mingw et lorsque je place mon curseur juste avant le fprintf, que j'execute en mode debug, puis j'execute la suite du programme (tjs en mode debug) ça marche.

    Autre observation : J'avais des accents et des espaces dans le chemin du dossier contenant le programme et bien que je ne les utilisais pas directement dans le programme (je n'utilise que des chemins relatif qui ne sortent pas du dossier), le fait de les enlever a fait marcher le fprintf. J'ai donc ajouté le fwrite initialement présent à la suite du fprintf et là rebug.

    J'avoue que là, je suis un peu dépassé

    ps:le fichier est bien créé.

    edit : ajout du flux dans le fprintf (erreur de frappe)

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    Par défaut
    Bien le bonsoir,

    sortant tout droit du man,
    int fprintf (FILE *stream, const char *format, ...);
    le premier argument est un FILE* et pas directement le contenu à y mettre

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 199
    Par défaut
    A oups je m'excuse pour la faute de frappe.

    Mais hélas pour moi j'ai bien respecté la synthaxe du fprintf et le problème semble plus sournois. Par ailleur je rappelle que le code compile et que le programme fonctionne sous linux

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par f56bre
    je rencontre des erreurs etranges. J'ai tenté d'isoler le
    Ce code est incomplet. On ne sait pas ce que tu as oublié. <stdio.h>est obligatoire ici.
    Il faut tester l'ouverture avant d'appeler les autres fonction f*().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       if (fichier != NULL)
       {
          ...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 199
    Par défaut
    Je sais que je propose ici un code quelque peu simplifié. Cependant j'ai bien inclut le stdio.h et je teste bien l'ouverture du fichier avec une sortie de la fonction en cas d'erreur. Voici le code complet de la fonction. Comme vous pouvez le voir je n'utilise pas le paramètre, je créé un nom de fichier dans la fonction, et comme vous pouvez le voir cette fonction semble sortie tout droit d'un exemple de cours de C.

    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
    char * RempliFichierBinaire( const ContenuFichier * contenuFichier )
    {
    	const char * nomFichier = "fichierbinaire.ppm";
    	FILE * fichier = NULL;
     
    	fichier = fopen( nomFichier , "wb" );
    	if( fichier == NULL )
    		return NULL;
     
     
    	fprintf( fichier , "P5\n256 256\n255\n" );
     
    	//fwrite( contenuFichier->image->t , sizeof(unsigned char) , contenuFichier->image->hauteur*contenuFichier->image->largeur , fichier );
     
        fclose(fichier);
     
    	return nomFichier;
    }

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par f56bre
    Je sais que je propose ici un code quelque peu simplifié. Cependant j'ai bien inclut le stdio.h et je teste bien l'ouverture du fichier avec une sortie de la fonction en cas d'erreur. Voici le code complet de la fonction. Comme vous pouvez le voir je n'utilise pas le paramètre, je créé un nom de fichier dans la fonction, et comme vous pouvez le voir cette fonction semble sortie tout droit d'un exemple de cours de C.
    Ceci fonctionne (je ne sais pas pourquoi il est si difficile d'obtenir du code compilable et testable... personne ne sait donc ce qu'est un test unitaire ?):
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct
    {
       int dummy;
    }
    ContenuFichier;
     
    int RempliFichierBinaire (const ContenuFichier * contenuFichier)
    {
       const char *nomFichier = "fichierbinaire.ppm";
       FILE *fichier = NULL;
       fichier = fopen (nomFichier, "wb");
       if (fichier == NULL)
          return 1;
       fprintf (fichier, "P5\n256 256\n255\n");
       fclose (fichier);
       return 0;
    }
     
    int main (void)
    {
       const contenuFichier = 
       {
          0
       };
       int err = RempliFichierBinaire (contenuFichier);
     
       if (err)
       {
          puts ("erreur");
       }
       return 0;
    }
    et j'obtiens un fichier contenant ceci :
    soit en hexa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    00000000h: 50 35 0A 32 35 36 20 32 35 36 0A 32 35 35 0A    ; P5.256 256.255.
    Ce qui me parait tout à fait conforme aux attentes.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 199
    Par défaut
    Est il possible qu'à la suite d'une allocation dynamique on rencontre ce genre de problèmes. En effet j'ai chargé une image à partir d'un fichier ppm texte dans une structure par allocation dynamique, juste avant de lancer cette fonction. Ce qui est byzarre c'est que si j'enlève l'appel à la fonction ci-dessus et ajoute un affichage du contenu de la structure ce que j'obtient est nickel.

    De plus, encore une fois, tout fonctionne nickel sous linux.

    Et enfin en enlevant la fonction de chargement d'image et en ne lançant que la fonction ci-dessus elle marche nickel (le résultat est conforme aux attentes comme dirait Mr Delahaye )

    Je vais voir du côté de l'allocation mais cela ressemble t'il à quelque chose que vous avez déjà rencontré?

    Une dernière question. Lorsque l'on alloue dynamiquement de la memoire pour une structure les membres de celle-ci sont ils initialisés à 0 (ou NULL pour les pointeurs). Il semble que ce soit le cas sous linux mais de toute façon je le fait par sécurité.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par f56bre
    Est il possible qu'à la suite d'une allocation dynamique on rencontre ce genre de problèmes.
    Si un comportement indéterminé s'est produit, tout peut arriver. Les deux problèmes principaux sont :
    • utilisation d'un pointeur non initialisé
    • débordement de tableau.

    De plus, encore une fois, tout fonctionne nickel sous linux.
    Ce qui ne prouve rien.
    Une dernière question. Lorsque l'on alloue dynamiquement de la memoire pour une structure les membres de celle-ci sont ils initialisés à 0 (ou NULL pour les pointeurs). Il semble que ce soit le cas sous linux mais de toute façon je le fait par sécurité.
    Non, pas du tout. Et all-bits-to-0 n'est pas forcément ce qu'il faut pour obtenir des pointeurs NULL. Il faut soit initialiser 'à la main', soit utiliser des init statiques et faire une copie...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       T *p = malloc (sizeof *T);
       if (p != NULL)
       {
          static const T z = {0};
          *p = z;
          /* ... */

Discussions similaires

  1. Problème avec fprintf
    Par farid0031 dans le forum MATLAB
    Réponses: 2
    Dernier message: 06/04/2012, 18h00
  2. problème avec la fonction fprintf
    Par Flaherty Mc Coillean dans le forum MATLAB
    Réponses: 2
    Dernier message: 01/05/2008, 16h13
  3. Débutant - Problème avec fprintf()
    Par Ryuzaki dans le forum Windows
    Réponses: 3
    Dernier message: 22/03/2008, 15h56
  4. Débutant - Problème avec fprintf et backspace
    Par Ryuzaki dans le forum Windows
    Réponses: 0
    Dernier message: 22/03/2008, 14h01
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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