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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut problème de pointeur
    re bonjour a tous !!

    bon tjs et encore des soucis...

    cette fois il s'agit d'un code servant a faire un menu pour l'utilisateur.

    dans les switchs les ..... sont la pr eviter les repetitions de case...

    voila le code:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    #define  FicCaracteristiquesAvion avion
     
    void afficher_fichier(FILE*);
    void consult_fichier();
    int main (void)
    {
     char demande;
     int i=0,profile;   
     printf("profile:");
     
     scanf("%d",&profile);  
     switch (profile)
      {
       case 1: while((demande!='r')&&(demande!='c')&&(demande!='m'))
         {
     
          printf("recherche tapez 'r'\nconsultation fic: tapez 'c'\nmodification fic: tapez 'm'\n");
          fflush(stdin);
          scanf("%c",&demande);
          i++;
          if(i==3)
          {
           printf("tro dessais");
           break;
          }
         }
         break;
       ......
      }
     switch (demande)
     {
     
     case 'c': printf("consultation fichier");
      consult_fichier();
      break;
     .....
     }
     return 0;
    }
     
     
     
    void consult_fichier(void)
    {
     
     FILE* flot;
     int rep=0;
     
     printf("\nchoisir fich");
     
     scanf("%d",rep);
     switch(rep)
     {
      case 1: flot=fopen("avion.txt","r+");
       if (flot==NULL) 
       {
        printf("\nerreur ouverture");  /* à retirer */
        perror("avion.txt");
       } 
       if (ferror(flot))
       {
        perror("avion.txt");
       }
       afficher_fichier(flot);
       break;
      .....
     }
    }
     
    //  +fonction afficher_fichier()
    je recois le message d'erreur avant le switch final sur (rep): "machin.exe a rencontré un problème et doit fermer"...

    a priori il s'agirait de pointeurs mais bon presque pas presents... donc je pense aux problemes de flots et de fichiers mais je vois pas ou ca coince vu que les tests perror() etc ne fonctionnent pas ( le prog sarrete avant...)

    merci de votre aide !!

  2. #2
    Membre émérite
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Par défaut
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define FicCaracteristiquesAvion avion
     
    void afficher_fichier(FILE*);
    void consult_fichier();
     
    int main(void)
    {
        char demande;
        int i=0, profile=0;
     
        printf("profile :");
     
        scanf("%d", &profile);  
     
        switch (profile)
        {
            case 1:
                while((demande!='r')&&(demande!='c')&&(demande!='m'))
                {
                    printf("recherche tapez 'r'\nconsultation fic: tapez 'c'\nmodification fic: tapez 'm'\n");
                    fflush(stdin);
                    scanf("%c", demande);
                    i++;
                    if(i==3)
                    {
                        printf("trop d'essais");
                        break;
                    }
                 }
                 break;
                 ......
        }
     
        switch (demande)
        {
            case 'c':
                printf("consultation fichier");
                consult_fichier();
                break;
                .....
        }
     
        return 0;
    }
     
     
     
    void consult_fichier(void)
    {
        FILE *flot;
        int rep=0;
     
        printf("\nchoisir fich");
     
        scanf("%d", &rep);
     
        switch(rep)
        {
            case 1:
                flot = fopen("avion.txt", "r+");
                if(flot==NULL)
                {
                    printf("\nerreur ouverture");  /* à retirer */
                    perror("avion.txt");
                } 
     
                if (ferror(flot))
                {
                    perror("avion.txt");
                }
     
                afficher_fichier(flot);
                break;
                .....
         }
    }
     
    //  +fonction afficher_fichier()
    Voici dejà un code bien mieux aéré et plus compréhensible (pour moi en tout cas ).

    J'ai pas encore vraiment chercher des erreurs mais j'ai cependant remarqué des erreurs avec scanf : des fois tu oublies le & et des fois tu le mets quand il ne le faut pas... De toute manière je te conseillerais plutot fgets à scanf

  3. #3
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut
    oki merci ca marche deja mieux avec le &rep ^^ lool

    par contre maintenant j'ai un message d'erreur :

    debug assertion failed
    file fgets.c
    line 59
    string!=NULL

    j'en avais deja rencontré un auparavant avec str!=NULL et je sais plus comment il avait ete reglé...

    m'enfin si ca se trouve ca differe le string!= du str!= ... enfin je pense ^^

    vous auriez pas une ptite idée ??

  4. #4
    Membre émérite 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
    Par défaut
    Citation Envoyé par BnY
    oki merci ca marche deja mieux avec le &rep ^^ lool

    par contre maintenant j'ai un message d'erreur :

    debug assertion failed
    file fgets.c
    line 59
    string!=NULL

    j'en avais deja rencontré un auparavant avec str!=NULL et je sais plus comment il avait ete reglé...

    m'enfin si ca se trouve ca differe le string!= du str!= ... enfin je pense ^^

    vous auriez pas une ptite idée ??
    C'est parceque tu fais appel à la fonction assert() dans le fichier fgets.c
    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)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut
    oki mais supprimer ce message évite-il aussi l'erreur ?? lol

    et il n'y pas moyen d'éviter ce NDEBUG, par exemple quand tu dis que je fais appel a assert(), je sais pas avec quelle fonction j'y fais appel (sans le vouloir)...

    et voila que maintenant j'ai ecrit un autre code qui n'a rien a voir en rouvrant visualCpp et il me met exactement le meme message alors qu'avant il me le mettait pas... :s

    ce serait pas du au compilateur ??

  6. #6
    BnY
    BnY est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 160
    Par défaut
    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
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    int main (void)
    {
     
     FILE *fpaero;
     
     int i=0,j=0,k=0,ID;
     
     char *chaine=NULL;
     
     int tab[40][40];
     
     fpaero=fopen("FicCaracteristiquesAeroport.txt","r");
     
     if(fpaero==NULL)
     {
      printf("nn");
     }
     
     while(fgets(chaine,sizeof chaine,fpaero)!=NULL)
     {
     
    while(chaine[k]!='\t')
      {
       ID=chaine[k];
     
       k++;
     
       printf("%d",ID);
     
       tab[i][0]=ID;
     
       tab[0][j]=ID;
     
       i++;
     
       j++;
      }
     }
    }
    il m'imprime "nn" donc le flot est NULL et il me met le meme message d'erreur... deja je vois qu'est ce qui peut faire que le flot reste NULL alors que j'ai fait fopen comme il faut ...

    sinon pour NDEBUG j'ai pas bien compris comment m'en servir...

    en faisant juste

    il ne se passe rien de plus.. tu pourrais m'éclaircir stp

    merci

  7. #7
    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 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.

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

  9. #9
    Membre émérite 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
    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.

  10. #10
    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 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.

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

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