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 :

Bug : des caractères bizarres à l'affichage


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 110
    Points
    110
    Par défaut Bug : des caractères bizarres à l'affichage
    Bonjour tout le monde.

    J'ai un bug dans mon projet que je n'arrive pas à corriger : en gros j'ai deux fonctions. La première crée un fichier et y enregistre des données, la seconde ouvre le fichier, lit ses données et les affiche à l'écran. Mon problème, c'est quand j'appelle les deux fonctions en même temps. Je m'explique :

    Je mets la fonction de lecture en commentaire, donc j'enregistre seulement dans le fichier (après exécution du programme), puis mets la fonction qui enregistre en commentaire, donc je lis les données et je les affiche. Là, tout se passe bien. Mais si je ne mets aucune fonction en commentaire, donc enregistre puis lecture et affichage, c'est là le problème car il m'affiche des caractères bizarres. Je ne connais pas la cause. Si quelqu'un peut m'aider à comprendre la cause du problème… :-(

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Est-ce que par hasard tu omettrais de fermer le fichier dans lequel tu as écris avant de le lire?

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 110
    Points
    110
    Par défaut
    nan,j'ai fermé les fichiers

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Si tu as des « caractères bizarres », c'est parce tu affiches des codes qui ne correspondent à rien. Les causes les plus fréquentes sont :

    • Dépassement de buffer : tu lis la mémoire tampon que tu viens de remplir mais tu oublies de t'arrêter et la routine d'affichage écrit tout ce qui se trouve ensuite en mémoire. Cela arrive en général quand on oublie d'ajouter le « '\0' » à la fin d'une chaîne, chose qui elle-même se produit soit quand on lit des données trop longues pour le buffer, soit lorsque qu'on utilise des appels comme read() (faits pour le binaire) et qu'on essaie d'afficher directement le contenu avec printf() ;
    • Buffer non clôturé : dans le même esprit qu'au point précédent, il est possible que ton programme soit naturellement bugué dès le départ, mais que tu ne t'en aperçoives jamais parce que ton buffer contenait quand même des zéros. Dès lors, il suffit de le remplir une fois pour que le bug se produisent ensuite à tous les coups, complètement indépendamment des fonctions que tu appelles ;
    • Écrasement de pile ou de tableau : tu as une boucle qui écrit un peu trop loin en remplissant un buffer ou un tableau et qui va écraser les variables locales à côté. Du coup, la suite de ton programme a l'air propre au point de vue algorithmique mais se comporte n'importe comment parce que les valeurs initiales de tes variables sont devenues complètement farfelues dans l'intervalle à cause de cela ;
    • Invalidité des données enregistrées : si tu commences par écrire et que tu lis ensuite, normalement il ne devrait pas y avoir de problème, mais si tu lis d'abord et que tu écris ensuite, alors tu pourrais avoir des surprises dès la seconde lecture car les données que tu aurais enregistrées ne l'auraient pas été correctement.


    Bref, ça peut être dû à tout et n'importe quoi, mais le plus vraisemblablement à cause d'erreurs de débutants. Et on ne peut pas savoir laquelle a priori sans lire le programme source.

    Montre-nous ton programme ici dans son intégralité et encadré par les balises [CODE] et [/CODE], et nous tâcherons de t'aider.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 110
    Points
    110
    Par défaut
    Apparament c'est lié a un probléme de Buffer . Car il m'affiche donneés qui ce touve dans un fichier que j'ai fermé il y a long temps .Pour code il est trop long

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Tu as probablement utilisé read() pour lire tes données et printf() pour les afficher à l'écran. read() lit un flux de données mais ne travaille pas au niveau de la chaîne de caractère. Comprendre par là : il ne va pas aller ajouter le '\0' final en fin de chaîne nécessaire pour que printf() puisse s'arrêter. Soit tu l'y ajoutes toi-même, soit tu vides ton buffer avant usage avec memset(), soit tu utilises tu indiques la longueur de tes données à la fonction d'affichage que tu utilises.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 110
    Points
    110
    Par défaut
    En faite j'ai essayer de vider avec fflish(stdin) . mais ça marche pas

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Citation Envoyé par G'Optimus Voir le message
    En faite j'ai essayer de vider avec fflish(stdin) . mais ça marche pas


    Efface ton buffer avec memset(buffer,0,sizeof buffer); en remplaçant « buffer » par le nom de ton tableau, et ce avant chaque appel à read.

Discussions similaires

  1. Je récupère des caractères bizarres
    Par owenho dans le forum Langage
    Réponses: 5
    Dernier message: 03/06/2012, 11h36
  2. [Oracle10] DROP TABLE avec des caractères bizarres
    Par molgow dans le forum Oracle
    Réponses: 1
    Dernier message: 04/10/2006, 09h49
  3. problème avec l'affichage des caractères spéciaux
    Par michelkey dans le forum Général Python
    Réponses: 4
    Dernier message: 19/08/2005, 09h09
  4. Problème d'affichage des caractères accentués
    Par ostaquet dans le forum JBuilder
    Réponses: 1
    Dernier message: 10/03/2005, 07h58
  5. Réponses: 6
    Dernier message: 19/10/2004, 14h46

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