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 :

Aide pour corriger des erreurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut Aide pour corriger des erreurs
    Bonjour,

    à la compilation de ce programme, j'ai ces erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    couple.c: In function `Couple':
    couple.c:95: error: incompatible type for argument 1 of `strcpy'
    couple.c:105: error: incompatible type for argument 1 of `strcpy'
    couple.c:120: error: incompatible types in assignment
    couple.c:121: error: incompatible types in assignment
    couple.c: In function `main':
    couple.c:138: error: invalid operands to binary !=
    couple.c:138: error: invalid operands to binary !=
    couple.c:139: warning: format argument is not a pointer (arg 2)
    couple.c:139: warning: format argument is not a pointer (arg 3)
    Merci


    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
     
    #define F "voisin"
     
    //Fonction qui avant tant qu'elle ne lit pas '\n' ou EOF 
    void purge(FILE *fp)
    {
      int c;
      while ((c = fgetc(fp)) != '\n' && c != EOF)
        {
        }
    }
     
    //Fonction qui remplace '\n' par 0
    void clean (char *s, FILE *fp)
    {
      /* Cherche ... */
      char *p = strchr (s, '\n');
      if (p != NULL)
        {
          /* ... supprime */
          *p = 0;
        }
      else
        {
          purge (fp);
        }
    }
     
    typedef struct{
      unsigned char x[4];
    }t_ip;
     
    typedef struct {
      t_ip ip1;
      t_ip ip2;
    } t_couple;
     
     
     
     
    //Fonction qui rcupre les couples de valeur en lisant un fichier
    t_couple *Couple(FILE *fp)
    {
      int nb = 0                //nb element du tableau 
        ,size = 5;             //taille du tableau
      t_couple *tabCouple;     // tableau qui recupere les couples
      tabCouple = (t_couple*)malloc (size * sizeof(t_couple));
      if(tabCouple == NULL)
        {
          perror("erreur allocation\n");
          return NULL;
        }
     
      if (fp == NULL)
        {
          perror(F);
          return NULL;
        }
      char line[BUFSIZ];
     
      while(fgets(line, sizeof line, fp) != NULL)
        {
          clean(line, fp);  // on supprime '\n'
          char *p = strtok(line,",");      //p contient la 1ere IP
          if (p != NULL)
    	{
    	  char *p1 = strtok(NULL,"\0");  //p1 contient la 2e IP
     
    	  if(nb == size) //si tableau trop petit
    	    {
    	      size += 16;
     
    	      //on augmente le taille
    	      tabCouple = realloc(tabCouple, size * sizeof(t_couple));
    	      if (tabCouple == NULL)
    		{
    		  perror("erreur allocation\n");
    		  free(tabCouple); tabCouple = NULL;
    		  return tabCouple;
    		}
    	    }
    	  /*
    	  //on insere la 1ere valeur du couple
    	  tabCouple[nb].ip1 = malloc((strlen(p)+1) * sizeof(t_couple));
    	  if (tabCouple[nb].ip1 == NULL)
    	  {
    	      perror("erreur allocation\n");
    	      free(tabCouple); tabCouple = NULL;
    	      return tabCouple;
    	      }*/
    	  strcpy(tabCouple[nb].ip1,p);
    	  /*
    	  //on insere la 2d valeur du couple
    	  tabCouple[nb].ip2 = malloc((strlen(p1)+1) * sizeof(t_couple));
    	  if (tabCouple[nb].ip2 == NULL)
    	    {
    	      perror("erreur allocation\n");
    	      free(tabCouple); tabCouple = NULL;
    	      return tabCouple;
    	      }*/
    	  strcpy(tabCouple[nb].ip2,p1);
     
    	  nb++;// on incremente le compteur nb element reel
    	}
          else
    	{
    	  printf ("format error\n");
    	  break;
    	}
          // on ferme le fichier
          fclose (fp), fp = NULL;
        }
      assert (fp == NULL);
     
      //on met  NULL pour avoir un marqueur de fin de tableau
        tabCouple[nb].ip1 = NULL;
        tabCouple[nb].ip2 = NULL;
     
      return tabCouple;
    }
     
     
    int main(void)
    {
      int i;                             //Indice de boucle
      FILE * file = fopen("voisin","r");  //Fichier  lire
      t_couple *tabCouple = Couple(file);
      if(tabCouple == NULL)
        {
          perror("erreur\n");
          exit(1);
        }
      //Parcours du tableau de couple
      for(i=0; tabCouple[i].ip1!=NULL && tabCouple[i].ip2!=NULL; i++)
        printf("Couple : %s et %s\n", tabCouple[i].ip1, tabCouple[i].ip2);
     
      //fin du pgm
      return 0;
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    tabCouple[i].ip1.x

    PS: En langage C, NULL, c'est pour les pointeurs. ip1 est une structure, alors c'est quoi ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0; tabCouple[i].ip1!=NULL && tabCouple[i].ip2!=NULL; i++)
    ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    Citation Envoyé par Médinoc
    tabCouple[i].ip1.x

    PS: En langage C, NULL, c'est pour les pointeurs. ip1 est une structure, alors c'est quoi ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0; tabCouple[i].ip1!=NULL && tabCouple[i].ip2!=NULL; i++)
    ?
    J'ai mis ça pour avoir un marqueur de fin, ça doit donner ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    static t_couple tabCouple[]={
        {{127, 0, 0, 1}, {192, 168, 0, 2}},	
        {{127, 0, 0, 1}, {192, 168, 0, 4}},	
        {{192, 168, 0, 2}, {192, 168, 0, 3}},
        {{192, 168, 0, 2}, {192, 168, 0, 4}},
        {{192, 168, 0, 3}, {192, 168, 0, 4}},
        {{192, 168, 0, 4}, {192, 168, 0, 5}},	
        {{192, 168, 0, 5}, {192, 168, 0, 2}},		
        {{192, 168, 0, 6}, {192, 168, 0, 5}},		
        {{0, 0, 0, 0}, {0, 0, 0, 0}}
      };
    Les derniers couples doit être nul

  4. #4
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Citation Envoyé par Premium
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct{
      unsigned char x[4];
    }t_ip;
    Heu c'est quoi ce type ? unsigned char !!!

    une adresse IP c'est 16 charactères '123'+'.'+'456'+'.'+'789'+'.'+'000'+'\0' au max

    dans ton cas '1'+'2'+'3'+'\0'

  5. #5
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par gnto
    Heu c'est quoi ce type ? unsigned char !!!
    Tu plaisantes la?

    unsigned char, c'est pour dire que tu utilises un char non signé, sa valeur ira donc de 0 à 255.

    A l'inverse d'un char qui va de -127 à 127.

  6. #6
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Citation Envoyé par Skyrunner
    Tu plaisantes la?

    unsigned char, c'est pour dire que tu utilises un char non signé, sa valeur ira donc de 0 à 255.

    A l'inverse d'un char qui va de -127 à 127.
    Atta je te le dis textuellement un caractère non signé Y' a pas un truc qui te choque ?

  7. #7
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par gnto
    Atta je te le dis textuellement un caractère non signé Y' a pas un truc qui te choque ?
    Un char n'est qu'un octet, tu peux placer ce que bon te semble dedans (tant que tu ne debordes pas).

    Mais il est vrai que d'utiliser un int aurait ete plus pratique. Notamment pour afficher l'adresse ip.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    c'est nul, mais ce n'est pas NULL.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    heu d'accord j'aurais mis un entier limité a 8 bits

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    En clair, c'est une adresse IP codée en numérique (sur 4 octets quoi) dans ce cas, les strcpy() n'ont rien à faire ici!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    Citation Envoyé par Médinoc
    En clair, c'est une adresse IP codée en numérique (sur 4 octets quoi) dans ce cas, les strcpy() n'ont rien à faire ici!
    Comment on copie la valeur sans faire strcpy?

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    strcpy() ne copie pas des valeurs, strcpy() copie des chaînes.

    memcpy() peut être intéressant, par contre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    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 Skyrunner
    A l'inverse d'un char qui va de -127 à 127.
    Attention quand même, pour une question de portabilité, je préciserais "signed char".
    Et c'est -128 à 127.

  14. #14
    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
    Attention quand même, pour une question de portabilité, je préciserais "signed char".
    Et c'est -128 à 127.
    Ben non, justement. Ce qui est portable, c'est -127 à +127 (plage minimale garantie par le langage). Ton implémentation peut gérer une plage plus grande, mais ce n'est pas portable.

  15. #15
    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
    Ben non, justement. Ce qui est portable, c'est -127 à +127 (plage minimale garantie par le langage). Ton implémentation peut gérer une plage plus grande, mais ce n'est pas portable.
    Quand je parlais de portabilité, c’était pour répondre à Skyrunner concernant le type "char".
    Ce que je voulais dire c’était que le type "char", en fonction de l’implémentation, pouvait être signé ou non signé.
    En effet on peut facilement faire l’erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char var ;
     
    []
     
    if ( var == -1 )
    	printf ("Hello\n");
    else
    	printf ("Coucou\n");
    En fonction de l’implémentation on aura soit "Hello", soit "Coucou".
    Donc pour éviter ce genre de soucis et de problème de portabilité, il est préférable de déclarer var en tant que "signed char".
    Concernant les valeurs que pouvait prendre un "signed char", en effet, la norme impose une plage minimal qui est de –127 à +127. Mais dans la réalité, c’est tout autre. Un "signed char" va de –128 à +127 (même sur une plateforme 8 bits).
    Si tu me trouves un exemple qui le contredit, je suis preneur.

  16. #16
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par gnto
    une adresse IP c'est 16 charactères '123'+'.'+'456'+'.'+'789'+'.'+'000'+'\0' au max

    dans ton cas '1'+'2'+'3'+'\0'
    Tu as deja vu une adresse ip avec un numéro > 255?
    0.0.0.0
    255.255.255.255

    Donc l'adresse tiens bien dans un tableau de 4 octets non signés.

  17. #17
    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 Premium
    Bonjour,

    à la compilation de ce programme, j'ai ces erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    couple.c: In function `Couple':
    couple.c:95: error: incompatible type for argument 1 of `strcpy'
    couple.c:105: error: incompatible type for argument 1 of `strcpy'
    couple.c:120: error: incompatible types in assignment
    couple.c:121: error: incompatible types in assignment
    couple.c: In function `main':
    couple.c:138: error: invalid operands to binary !=
    couple.c:138: error: invalid operands to binary !=
    couple.c:139: warning: format argument is not a pointer (arg 2)
    couple.c:139: warning: format argument is not a pointer (arg 3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /* -ed-
             strcpy(tabCouple[nb].ip1, p);
     
    tabCouple[nb].ip1 n'est pas un tableau de char. Tu veux sans doute dire :
     
    */
             strcpy(tabCouple[nb].ip1.x, p);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /* -ed-
       tabCouple[nb].ip1 = NULL;
       tabCouple[nb].ip2 = NULL;
     
       La, par contre, pas de solution, meme avec tabCouple[nb].ip1.x.
       On ne peut pas modifier un tableau. Uniquement ses elements.
     
       Probleme de conception.
    */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /* -ed-
       for (i = 0; tabCouple[i].ip1 != NULL && tabCouple[i].ip2 != NULL; i++)
          printf("Couple : %s et %s\n", tabCouple[i].ip1, tabCouple[i].ip2);
     
       Meme erreur. Probleme de conception.
    */

Discussions similaires

  1. [Débutant] demande d'aide pour corriger 2 erreurs en vb.net
    Par coleoptere dans le forum VB.NET
    Réponses: 6
    Dernier message: 14/04/2013, 23h33
  2. Cherche aide pour corriger erreur au démarrage
    Par odb000856 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/09/2010, 14h38
  3. [CR8.5] Aide pour lier des etats
    Par Silvinho42 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 28/04/2005, 10h11

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