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 :

je pense à une erreur de pointeur mais pas sur


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Par défaut je pense à une erreur de pointeur mais pas sur
    salut,

    dans le programme joint, je n'ai aucune erreur de compil mais lorsque je le lance, l'affichage a une erreur à la fin de l'affichage de la première semaine.

    je vous explique rapidement le principe:

    deux structures "annee" et "semaine" dans lesquelles j'entre mes données;

    deux fonctions "inserer_semaine" et "inserer_action" gerant l'enregistrement des données dans les structures et utiliser dans la fonction "chargerfichier"
    qui charge les données du fichier (joint aussi), et les pointeurs

    trois fonctions pour l'affichage "afficher semaine", "afficher action" employé dans "afficher_agenda"

    et le main

    le format des données à charger est le suivant: dans un fichier texte trié chronologiquement, on a l'annee et le numero de la semaine sur 6 caractère
    200922 par exemple

    suivi sans espace du jour de la semaine 1 à 7

    suivi sans espace de l'heure 00 à 23

    suivi sans espace du libelle de l'action sur 10 caractère (toujours 10) TP DE ABC

    ==> 200922123TP DE ABC

    voila, si vous trouvez ou sont mes erreurs (mon erreur mais j'y crois pas trop, y'en a plus d'une ) , je serais super content

    merci d'avance

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Dans la fonction insertion_action, juste après l'allocation mémoire, tu avais oublié de mettre :
    ce qui avait donc pour conséquence, lors de l'affichage du résultat, le parcours de la liste chaînée même lorsque celle-ci était terminée, avec par conséquent un accès mémoire en zone interdite et donc un crash.

    Divers conseils :

    * Inutile de caster le retour de malloc.
    * Pour tester le retour de fopen, il est préférable d'utiliser !=NULL. (si je ne dis pas de c... il me semble que NULL peut avoir une valeur autre que 0 en fonction de certains OS, mais je laisse les experts confirmer ou infirmer).
    * Il faut libérer la mémoire allouée avant que le programme ne se termine, même si les OS actuels s'en chargent lors de la fermeture de l'exécutable. C'est plus propre.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Par défaut
    merci, il me semblait bien qu'il manquait quelque chose

    sinon tu entend quoi par caster le retour de malloc?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    sinon tu entend quoi par caster le retour de malloc?
    Comme la fonction malloc retourne un pointeur sur void, la conversion de type est implicite en C.
    Cela veut dire que tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type *pointeur=malloc(sizeof(type));
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type *pointeur=(type*)malloc(sizeof(type));

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Par défaut
    ok merci beaucoup

    j'ai avancé et j'ai un nouveau probleme

    j'ai crée quatre nouvelle fonction:

    ecrire agenda (elle marche et ecris dans un fichier texte l'agenda)
    rechercher_semaine (recherche l'adresse d'une semaine et retourne cette adresse)
    recherche action (pareil que pour semaine avec action)
    suppression action (supprime l'action)

    le probleme est que bien que j'ai une action à une date specifique et une heure specifique, il me marque action non trouvé.

    ci-joint le code et le fichier texte

    merci d'avance

    ps: je n'ai pas oublié de caster les malloc, je le ferais à la toute fin, en meme temps que le guide de style et les commentaires

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    La fonction rechercher_action n'est pas appelée correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        char numsemaine[7];
     
        /* numsemaine n'est jamais initialisé */
     
        recherche = rechercher_action(&tete, numsemaine, numjour, numheure, &trouve);
    Sinon, il y a quelques warning à la compilation, il ne faut pas les ignorer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /*génère des warnings */
    fscanf(fichier,"%6c%c%2c%10c\n", &(anneesemaine.anneesemaine), &(action.jour), &(action.heure), &(action.libelle));
    /* n'en génère plus */
    fscanf(fichier,"%6c%c%2c%10c\n", (anneesemaine.anneesemaine), &(action.jour), (action.heure), (action.libelle));

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Par défaut
    j'ai bien corrigé ce que tu m'as dit mais j'ai toujours un probleme au niveau de l'action que je n'arrive pas a trouver

    ci joint: le prog corrigé

  8. #8
    Invité(e)
    Invité(e)
    Par défaut
    Alors, il ne faut pas hésiter à instrumenter le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        puts("Entrez l'annee : ");
        scanf("%s",numannee);
        puts("Entrez la semaine : ");
        scanf("%s",numsemaine);
        puts("Entrez le jour de l'action recherche : ");
        scanf("%c%*c",&numjour);
        puts("Entrez l'heure de l'action recherche : ");
        scanf("%s",numheure);
     
        printf("année : %s, semaine : %s, jour : %c, heure : %s\n", numannee, numsemaine, numjour, numheure);
    donne :
    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
    Semaine [200921]
            Action: jour: 1 | heure: 10 | TP DE ABC
            Action: jour: 1 | heure: 11 | TP DE DEF
            Action: jour: 2 | heure: 10 | TP DE GHI
    Semaine [200922]
            Action: jour: 1 | heure: 10 | TP DE JKL
    Semaine [200923]
            Action: jour: 1 | heure: 10 | TP DE MNO
    Entrez le nom du fichier a sauvegarder :
    c
    Entrez l'annee :
    2009
    Entrez la semaine :
    200921
    Entrez le jour de l'action recherche :
    2
    Entrez l'heure de l'action recherche :
    10
    année : 2009, semaine : 200921, jour :
    , heure : 10
    On se rend compte que le saisie de la valeur de jour pose problème. Il suffit de vider le buffer stdin après chaque saisie pour que le suivante soit correcte.

    --> FAQ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        puts("Entrez l'annee : ");
        clean_stdin();
        scanf("%s",numannee);
        puts("Entrez la semaine : ");
        clean_stdin();
        scanf("%s",numsemaine);
        puts("Entrez le jour de l'action recherche : ");
        clean_stdin();
        scanf("%c%*c",&numjour);
        puts("Entrez l'heure de l'action recherche : ");
        clean_stdin();
        scanf("%s",numheure);
     
        printf("année : %s, semaine : %s, jour : %c, heure : %s\n", numannee, numsemaine, numjour, numheure);
    donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Entrez le nom du fichier a sauvegarder :
    c
    Entrez l'annee :
    2009
    Entrez la semaine :
    200921
    Entrez le jour de l'action recherche :
    2
    Entrez l'heure de l'action recherche :
    10
    année : 2009, semaine : 200921, jour : 2, heure : 10
    Action trouvee :
            Action: jour: 2 | heure: 10 | TP DE GHI


    Sinon, n'ignore pas les message de ton compilateur : un compilateur bien réglé doit dire qu'il y a un problème ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(stderr, "erreur", nomfichier);

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Par défaut
    salut, encore un question mais plus de problemme (j'aurais quand meme du ouvrir un growshop, au moins, les problemes sont naturelles)

    j'ai bien inclus la fonction clean_stdin, et reecris comme tu l'avais dit

    mais j'ai maintenant un probleme classique que je me rappelle plus comment le resoudre (cette phrase n'est pas en francais, c'est normal: c'est un echec! ==> cf: strategie de l'échec)

    lorsque je compile et que j'execute le programme, j'arrive jusqu'à entrer l'heure mais la, je dois l'entree deux fois si j'écris comme toi

    j'ai ecris comme ca à la place et ca marche, tu (vous) sais (savez) pourquoi?

    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
    puts("Entrez le nom du fichier a sauvegarder : ");
        scanf("%s",nomfichier);
        ecrire_agenda(nomfichier, tete);
     
        puts("Entrez l'annee : ");
        clean_stdin();
        scanf("%s",numannee);
     
        puts("Entrez la semaine : ");
        clean_stdin();
        scanf("%s",numsemaine);
     
        puts("Entrez le jour de l'action recherche : ");
        clean_stdin();
        scanf("%c%*c",&numjour);
     
        puts("Entrez l'heure de l'action recherche : ");
        scanf("%s",numheure);
     
        printf("année : %s, semaine : %s, jour : %c, heure : %s\n", numannee, numsemaine, numjour, numheure);

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Par défaut
    dsl je me suis mal expliqué

    mon code marche mais j'ai du enlever le clean_stdin() avant le scanf( num heure)

    voici le code avec les semaines bilateres en plus (et il mache enfin marche )

    je cherche juste à comprendre pourquoi?

  11. #11
    Membre confirmé

    Inscrit en
    Août 2008
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 177
    Par défaut
    et avec un gets à la place du scanf ?

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

Discussions similaires

  1. Problème de lenteur sur une proc avec EF mais pas sur la base
    Par Oberown dans le forum Entity Framework
    Réponses: 0
    Dernier message: 14/02/2013, 16h49
  2. Une erreur que j'arrive pas a comprendre
    Par olifile dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/05/2007, 13h41
  3. Réponses: 1
    Dernier message: 08/11/2006, 21h14
  4. Erreur avec IE mais pas avec Netscape
    Par Oluha dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/02/2005, 15h15
  5. Chaines et pointeurs mais pas "const"
    Par hpfx dans le forum C
    Réponses: 9
    Dernier message: 05/10/2003, 20h23

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