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 :

problème de pointeur


Sujet :

C

  1. #21
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par BnY
    oki c super ca marche
    c'est deja ca, cool

    Petite modif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void afficher_fichier(FILE *flot)
    {
     char *chaine=NULL;
     
     while(fgets(chaine,sizeof(chaine),flot)!=NULL)
     {
      printf("\n%s",chaine);
     }
    }
    espace en plus dans ...ier(FILE ...
    et paranthese, tu test, j'attends...
    développeur en folie cherche à ... développer encore plus

  2. #22
    BnY
    BnY est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Points : 34
    Points
    34
    Par défaut
    toujours ce bon vieux D.A.Failed...

  3. #23
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par BnY
    toujours ce bon vieux D.A.Failed...
    essaye d'allouer ta variable chaine avant le while dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *chaine =  (char *)malloc(taille*sizeof(char)+1);
    avec taille valant un entier...

    sinon, a quel endroit de ta fonction il plante exactement???, sur quelle ligne???
    développeur en folie cherche à ... développer encore plus

  4. #24
    BnY
    BnY est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Points : 34
    Points
    34
    Par défaut
    il plantait juste a ce moment la ( un pti printf mindiquai que le flot etait non NULL et des lappel de la fonction afficher AF... )mais la niquel plus de DAF lool ^^ bon a part un pti problm d'affichage vu qu'il saute des lignes tout seul au lieu d'afficher correctement les lignes du fichier...lool

    je vais regarder ca de plus pres pour savoir pourquoi il fait ca a moins que tu ais une idée tout de suite lol mais bon en tout cas niquel merci encore beaucoup

  5. #25
    BnY
    BnY est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Points : 34
    Points
    34
    Par défaut
    lol c bon resolu c moi ki mettait un \n de trop par reflexe dan mon printf

    bon ben voila c super tu viens de me sauver la vie :p lool


  6. #26
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par BnY
    il plantait juste a ce moment la ( un pti printf mindiquai que le flot etait non NULL et des lappel de la fonction afficher AF... )mais la niquel plus de DAF lool ^^ bon a part un pti problm d'affichage vu qu'il saute des lignes tout seul au lieu d'afficher correctement les lignes du fichier...lool

    je vais regarder ca de plus pres pour savoir pourquoi il fait ca a moins que tu ais une idée tout de suite lol mais bon en tout cas niquel merci encore beaucoup
    mais de rien, je viens juste de passer une nuit blanche de plus... t'inquiete pas va...

    pour les saut de lignes, cela vient de la lecture du fichier proprement dis. fgets parfois lit et parfois ne lit pas le caractere '\n' (=retour a la ligne). donc, je pense que ca vient de cela mais la, je ne peux plus rien pour toi. au mieu, il faut que tu regarde si ta chaine contient le caractere ou pas et le supprimer dans le cas possitif... (tu as cela ici, dans la C)...

    j'y vais mais tiens moi au courant, je revois ca dans la journee...
    développeur en folie cherche à ... développer encore plus

  7. #27
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par BnY
    lol c bon resolu c moi ki mettait un \n de trop par reflexe dan mon printf

    bon ben voila c super tu viens de me sauver la vie :p lool

    ok, tres bien, mais regarde quand meme le message que je viens de poster juste avant, je pense que tu devrais l'inclure (le traitement du caractere '\n')...

    content d'avoir pu t'aider...

    pense a mettre le tag , c'est dans Outils de la discussion, en haut de la page, juste au dessus du premier message...
    développeur en folie cherche à ... développer encore plus

  8. #28
    BnY
    BnY est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Points : 34
    Points
    34
    Par défaut
    en fait pour le \n j'ai une tite fonction qui est forte utile dans le cas ou j'utilise fgets sur stdin pour le \n saisie lorsqu'on tape "entrée"... mais la dans ce cas precis cette fonction ne m'interesse pas puisque je veux afficher le fichier donc autant garder ce \n a chaque fin de ligne pour que l'affichage des lignes se fasse automatiquement non ??

    ca fait plaisir maintenant des que je vois du DAF hop une ptite allocation de memoire sur ma chaine et c fini lool ...
    ce qui pour moi etait un fleau toute la nuit est une tite routine maintenant loool

    merci encore et bonne journée ( enfin bonne soirée si tu lis ce message en rentrant lool )

  9. #29
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    C'était juste en passant, tu peux aussi écrire ton malloc de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * chaine = malloc (taille + 1);
    Le type char vallant 1 octets de toutes façons, inutile de la préciser ici, d'ailleur les cast en C ne sont pas obligatoire et pas forcement necessaire dans ce cas de figure !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par BnY
    par contre maintenant j'ai un message d'erreur :
    debug assertion failed
    file fgets.c
    line 59
    string!=NULL
    C'est la bibliothèque du C qui se protège contre les fausses manips de l'utilisateur... C'est un peu brutal comme réaction, mais pourquoi pas. Tu as passé une adresse valant NULL à la fonction fgets() quelque part dans ton code. C'est évidemment une erreur à corriger.
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par crocodilex
    C'est parceque tu fais appel à la fonction assert() dans le fichier fgets.c
    A l'évidence fgets() appartient à la bibliothèque, pas à l'application... Il n'est pas responsable de la présence du assert(). Par contre son erreur est d'avoir appelé un fgets() avec NULL...
    Pour supprimer ce message il faut définir la constante symbolique NDEBUG, soit avec un #define ou bien avec l'option de compilation -D (si j'ai bonne mémoire)
    Ben oui. Quand la fièvre est trop élevée, on casse le thermomètre et le patient va tout de suite mieux, c'est bien connu.

    Quand un voyant d'alarme s'allume sur le poste de contrôle de la centrale de Chernobyl, on débranche le voyant... Problème réglé.

    C'est vraiment une drôle de façon de raisonner...
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par BnY
    oki mais supprimer ce message évite-il aussi l'erreur ??
    Evidemment non. Il y a un bug dons ton code. C'est tout. A toi de le corriger.
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par BnY
    par exemple la quand je fais le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     FILE *fpaero;
     
     fpaero=fopen("FicCaracteristiquesAeroport.txt","r");
     
     if(fpaero==NULL)
     {
      printf("nn");
     }
    STOP! En cas d'erreur, il ne faut pas continuer, sinon, tu passes un NULL à fgets(), ce qui explique l'arrêt du programme par le assert() de fgets.c.

    Le principe est le suivant (pseudo-code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FILE *fp = fopen(...)
    if (fp != NULL)
    {
       /* OK, on continue */
     
       fclose (fp)
    }
    else
    {
       /* Probleme avec le fichier (inconnu, inaccessible...) */
    }
    #define NDEBUG
    il ne se passe rien de plus.. tu pourrais m'éclaircir stp

    merci
    Normal. Il faudrait recompiler la bibliothèque. Mais je ne te le conseille pas.

    Le bug qui te concerne, c'est que fopen() retourne NULL. Il faut en trouver la cause :
    • le fichier n'est pas dans le répertoire d'exécution
    • le fichier est dans le répertoire d'exécution, mais sous un faux nom (un nom plus court genre "AirportData.txt" est plus facile à manipuler...)
    • le fichier est dans le répertoire d'exécution, mais il est déjà ouvert par une autre application
    • etc.
    Quand à 'eclaircir', je pense que tu voulais dire 'éclairer'...
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par BnY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if((flot=fopen("C:\Program Files\Microsoft Visual Studio\MyProjects\testlogincorrigé\tlogcorr\FicCaracteristiquesAvion.txt","r+"))==NULL)
    Le caractère \ se code \\ en C. Sinon, Windows accepte aussi le séparateur /
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par doudouallemand
    rajoute apres ton "r+" un b ou un t en fonction de si ton fichier est binaire "r+b" ou ASCII (=texte) "r+t"
    Ce "t" n'existe pas. C'est "r+".
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par BnY
    bon par contre je crois ke le debug assertion failed m'en veu puisqu'il reapparait juste apres au moment de la fonction afficher_fichier() que voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     char *chaine=NULL;
     
     while(fgets(chaine,sizeof chaine,flot)!=NULL)
    Ben c'est sur que si tu passes un NULL à fgets(), tu vas retomber sur le problème... Tu fais un peu n'importe quoi, non ? Tu t'imagines quoi en passant NULL ?

    C'est pas très dur de lire la doc :

    http://dpobel.free.fr/man/html/affic...969/man/fgets/

    Il faut fournir l'adresse d'un tableau de char. Quand au sizeof, il n'a de sens que sur un tableau (pas sur un pointeur).
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par BnY
    ca fait plaisir maintenant des que je vois du DAF hop une ptite allocation de memoire sur ma chaine et c fini lool ...
    ce qui pour moi etait un fleau toute la nuit est une tite routine maintenant loool
    Et n'oublie pas de libérer ce qui a été alloué. Mais as-tu vraient besoin d'un tableau dynamique ? Un simple tableau de taille fixe ne suffit pas ?
    Pas de Wi-Fi à la maison : CPL

  18. #38
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    A l'évidence fgets() appartient à la bibliothèque, pas à l'application... Il n'est pas responsable de la présence du assert(). Par contre son erreur est d'avi=oir appelé un fgets() avec NULL...

    Ben oui. Quand la fièvre est trop élevée, on casse le thermomètre et le patient va tout de suite mieux, c'est bien connu.

    Quand un voyant d'alarme s'allume sur le poste de contrôle de la centrale de Chernobyl, on débranche le voyant... Problème réglé.

    C'est vraiment une drôle de façon de raisonner...
    Désolé, mais je n'avais ma boule de crystal pour savoir que le fichier fgets.c n'appartenait pas à notre ami BnY. Tu vas me dire que j'aurais pu le deviner. J'y avais pensé. Mais rien ne l'interdit de crée un fichier qui porte le même nom qu'une fonction de la lib C.
    D'autre part, la macro assert() est très utile en phase de debug. Ca serait dommage de ne pas l'utiliser. Lorsqu'on estime que le logiciel est suffisement fiable, à ce moment là on peut se permettre de neutraliser cette macro.
    Donc ce que je trouve bizarre c'est de laisser des infos de debug dans un produit censé debuggé et livré. Ca ne fait pas très pro.
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  19. #39
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par CSoldier
    Le type char vallant 1 octets de toutes façons, inutile de la préciser ici, d'ailleur les cast en C ne sont pas obligatoire et pas forcement necessaire dans ce cas de figure !
    oui, mais le fait de le preciser ne rent-il pas le code plus portable au travers des differentes versions de windows notamment (avec l'arrive de windows vista et ces changements de taille de variable)???

    sinon, merci pour l'info de fin BnY.

    sinon, pour info Emmanuel Delahaye, c'est le probleme qu'on a regle durant la nuit et qui est explique plus haut dans les posts
    développeur en folie cherche à ... développer encore plus

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par doudouallemand
    oui, mais le fait de le preciser ne rent-il pas le code plus portable au travers des differentes versions de windows notamment (avec l'arrive de windows vista et ces changements de taille de variable)???
    Non. La taille d'un char est 1 par définition.

    C'est l'unité de compte. Une unité vaut 1. Point. C'est la définition.
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43
  2. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  3. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 11h49
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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