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 :

gestionnaire de signets


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Points : 43
    Points
    43
    Par défaut gestionnaire de signets
    Bonsoir,
    je doit créer un gestionnaire de signets (URL,description et nombre d'étoile)
    Le compilateur me sort une erreur de segmentation, je cherche mais ne trouve pas (le soucis vient d'affiche et erase).
    la fonction affiche marche dans la création d'un signet mais pas dans le programme principal, je ne comprend pas du tout pourquoi ! ( je passe bien l'adresse de s donc s est modifié)

    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
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    typedef struct _signet{
      char *url;
      char *info;
      int star;
    }signet;
     
    void init(signet *s){
      s->url=NULL;
      s->info=NULL;
      s->star=0;
    }
    void saisie(char *url,char *info,int *star){
      printf("saisir une adresse, la description et le nombre d'étoile:");
      scanf("%s %s %d",url,info,star);
    }
    void affiche(signet s){
      printf("%s\n",s.url);
      printf("%s\n",s.info);
      printf("%d\n",s.star);
    }
    void ajoute_signet(signet *s,char *url,char *info,int star){
      s=malloc(sizeof(signet));
      s->url=malloc(sizeof(char *)*strlen(url));;
      s->url=url;
      s->info=malloc(sizeof(char *)*strlen(info));
      s->info=info;
      s->star=star;
      /*affiche(*s) marche très bien ici*/
    }
     
    void erase(signet *s){
      free(s->url);
      free(s->info);
      free(s);
    }
     
    void modifie_signet(signet *s){
      char url[50];
      char info[50];
      int star;
      saisie(url,info,&star);
      s->url=realloc(s->url,sizeof(char *)*strlen(url));
      s->url=url;
      s->info=realloc(s->info,sizeof(char *)*strlen(info));
      s->info=info;
      s->star=star;
    }
    int main(void){
      signet s;
      init(&s);
      char url[50];
      char info[50];
      int star;
      saisie(url,info,&star);
      ajoute_signet(&s,url,info,star);
      affiche(s);/*affiche n'inporte quoi*/
      modifie_signet(&s);  
      affiche(s);
      erase(&s);/*erreur invalide pointer*/
      return 0;
    }
    Meric d'avance pour votre aide.

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

    Deux choses :
    • La fonction ajoute_signet commence par créer un signet... mais le garde pour elle : la mémoire allouée dans cette fonction n'est plus libérable.
    • Les copies de chaines de caractère ne se font pas avec = mais avec strcpy, strcat, strdup...

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Je rajouterais:
    -> l'échec du réalloc n'est pas géré
    -> Pourquoi dans ajoute_signet faire un malloc sur le paramètre signer alors que l'adresse passée en paramètre est celle d'une variable sur la pile?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Points : 43
    Points
    43
    Par défaut
    ok merci, j'ai comprit l'erreur, j'ai modifié mon programme afin d'entrer plusieurs signets:
    quand je compile il me sort:

    signet.c: In function ‘cree_signet’:
    signet.c:46: attention : return from incompatible pointer type
    signet.c: In function ‘ajoute_signet’:
    signet.c:51: erreur: invalid use of undefined type ‘struct signet’
    signet.c:51: erreur: déréférencement d'un pointeur de type incomplet

    Pourquoi mon return s ne renvoie pas ma création de signet?

    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
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<ctype.h>
     
    typedef struct _signet{
      char *url;
      char *info;
      int star;
    }signet;
     
    typedef struct _lessignets{
      struct signet *tab;
      int taille;
     
    }signets;
     
    void init2(signets *s){
      s->tab=NULL;
      s->taille=0;
    }
    void init(signet *s){
      s->url=NULL;
      s->info=NULL;
      s->star=0;
    }
    void saisie(char *url,char *info,int *star){
      printf("saisir une adresse, la description et le nombre d'étoile:");
      scanf("%s %s %d",url,info,star);
     
     
    signet* cree_signet(char *url,char *info,int *star){
      signet s;
      init(&s);
      s=malloc(sizeof(signet));
      saisie(url,info,star);
      s.url=(char *)malloc(sizeof(char *)*strlen(url));;
      strcpy(s.url,url);
      s.info=(char *)malloc(sizeof(char *)*strlen(info));
      strcpy(s.info,info);
      s.star=*star;
      return s;
    }
     
    void ajoute_signet(signets *s2,char *url,char *info,int *star){
      s2->tab=realloc(s2->tab,sizeof(signet)*s2->taille+1);
      s2->tab[s2->taille]=cree_signet(url,info,star);
      s2->taille++;
    }

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void saisie(char *url,char *info,int *star){
      printf("saisir une adresse, la description et le nombre d'étoile:");
      scanf("%s %s %d",url,info,star);
    }
    signet* cree_signet(char *url,char *info,int *star){
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    signet* cree_signet(char *url,char *info,int *star){
    ...
    //  s.url=(char *)malloc(sizeof(char *)*strlen(url));; 
    // sizeof(char), pas sizeof(char*)
    // strlen(url)+1  pour le zéro terminal 
      s.url=malloc(strlen(url)+1); 
    ...
    //  s.info=(char *)malloc(sizeof(char *)*strlen(info));
    // idem

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Points : 43
    Points
    43
    Par défaut
    Je cherche mais pas moyen de trouver mon erreur : Help
    signet.c: In function ‘ajoute_signet’:
    signet.c:52: erreur: invalid use of undefined type ‘struct signet’
    signet.c:52: erreur: déréférencement d'un pointeur de type incomplet
    tab est un pointeur sur un struct signet donc logiquement je peut le faire pointer sur un struct signet qui est créer_signet !!

    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
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<ctype.h>
     
    typedef struct _signet{
      char *url;
      char *info;
      int star;
    }signet;
     
    typedef struct _lessignets{
      struct signet *tab;
      int taille;
     
    }signets;
     
    void init2(signets *s){
      s->tab=NULL;
      s->taille=0;
    }
    void init(signet *s){
      s->url=NULL;
      s->info=NULL;
      s->star=0;
    }
    void saisie(char *url,char *info,int *star){
      printf("saisir une adresse, la description et le nombre d'étoile:");
      scanf("%s %s %d",url,info,star);
    }
    void affiche(signet *s){
      printf("%s\n",s->url);
      printf("%s\n",s->info);
      printf("%d\n",s->star);
    }
     
    signet cree_signet(char *url,char *info,int *star){
      signet s;
      init(&s);
      saisie(url,info,star);
      s.url=(char *)malloc(sizeof(char)*strlen(url)+1);
      strcpy(s.url,url);
      s.info=(char *)malloc(sizeof(char)*strlen(info)+1);
      strcpy(s.info,info);
      s.star=*star;
      return s;
    }
     
     
    void ajoute_signet(signets *s2,char *url,char *info,int *star){
      s2->tab=realloc(s2->tab,sizeof(signet)*s2->taille+1);
      s2->tab[s2->taille]=cree_signet(url,info,star); /*ERREUR ICI*/
      s2->taille++;
    }
     
     
    int main(void){
      signet s;
      signets s2;
      init2(&s2);
      char url[50];
      char info[50];
      int star;
      ajoute_signet(&s2,url,info,&star);
      return 0;
    }

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    signet.c:52: erreur: invalid use of undefined type ‘struct signet’
    Ce qui est défini c'est :
    1- struct _signet
    et
    2- signet
    mais pas struct signet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct _lessignets{
      signet *tab;
      int taille; 
    }signets;

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Points : 43
    Points
    43
    Par défaut
    ha ..... je cherchai pas l'erreur au bon endroit, sa marche merci !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Points : 43
    Points
    43
    Par défaut
    j'ai un problème dans une de mes fonctions:
    voici ce que donne le compilateur:
    signet.c:74: attention : comparaison entre élément signé et élément non signé
    signet.c:74: attention : comparaison entre élément signé et élément non signé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while((test==1) && (cpt<strlen(m2.info)) && (cpt<strlen(m1.info))){
    le problème ce situe ici, j'ai fait des test avec un printf sur les strlen et y'a bien un entier
    donc je compare bien des entiers ! (je supose que le strlen est un long int ou truc du genre mais alors pourquoi )

    voici la fonction:
    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
     
    void trie_signet(signets *s2){
      int i,j,test,cpt;
      signet m1,m2,save;
      if(s2->taille<2)
        return;
      for(i=0;i<s2->taille-1;i++){
        m1=s2->tab[i];
        for(j=i+1;j<s2->taille;j++){
          m2=s2->tab[j];
          if(m2.star<m1.star){
    	save=s2->tab[i];
    	s2->tab[i]=s2->tab[j];
    	s2->tab[j]=save;
          }
          else{
    	if(m2.star==m1.star){
    	  test=1;
    	  cpt=0;
    	  while((test==1) && (cpt<strlen(m2.info)) && (cpt<strlen(m1.info))){
    	    if(m2.info[cpt]<m1.info[cpt]){
    	      save=s2->tab[i];
    	      s2->tab[i]=s2->tab[j];
    	      s2->tab[j]=save;
    	      test=0;
    	    }
    	    else{
    	      if(m2.info[cpt]>m2.info[cpt])
    		test=0;
    	    }
    	  }
     
    	}
          }
        }
      }
    }
    le programme entier si sa peut servir:
    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
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<ctype.h>
     
    typedef struct _signet{
      char *url;
      char *info;
      int star;
    }signet;
     
    typedef struct _lessignets{
      signet *tab;
      int taille;
     
    }signets;
     
    void init2(signets *s){
      s->tab=NULL;
      s->taille=0;
    }
    void init(signet *s){
      s->url=NULL;
      s->info=NULL;
      s->star=0;
    }
    void saisie(char *url,char *info,int *star){
      printf("saisir une adresse, la description et le nombre d'étoile:");
      scanf("%s %s %d",url,info,star);
    }
    void affiche(signet s){
      printf("Site:%s\n",s.url);
      printf("Description du site:%s\n",s.info);
      printf("nombre d'étoile:%d\n",s.star);
    }
     
     signet cree_signet(char *url,char *info,int *star){
      signet s;
      init(&s);
      saisie(url,info,star);
      s.url=(char *)malloc(sizeof(char)*strlen(url)+1);
      strcpy(s.url,url);
      s.info=(char *)malloc(sizeof(char)*strlen(info)+1);
      strcpy(s.info,info);
      s.star=*star;
      return s;
    }
     
     
    void ajoute_signet(signets *s2,char *url,char *info,int *star){
      s2->tab=realloc(s2->tab,sizeof(signet)*s2->taille+1);
      s2->tab[s2->taille]=cree_signet(url,info,star);
      s2->taille++;
    }
     
    void trie_signet(signets *s2){
      int i,j,test,cpt;
      signet m1,m2,save;
      if(s2->taille<2)
        return;
      for(i=0;i<s2->taille-1;i++){
        m1=s2->tab[i];
        for(j=i+1;j<s2->taille;j++){
          m2=s2->tab[j];
          if(m2.star<m1.star){
    	save=s2->tab[i];
    	s2->tab[i]=s2->tab[j];
    	s2->tab[j]=save;
          }
          else{
    	if(m2.star==m1.star){
    	  test=1;
    	  cpt=0;
    	  while((test==1) && (cpt<strlen(m2.info)) && (cpt<strlen(m1.info))){
    	    if(m2.info[cpt]<m1.info[cpt]){
    	      save=s2->tab[i];
    	      s2->tab[i]=s2->tab[j];
    	      s2->tab[j]=save;
    	      test=0;
    	    }
    	    else{
    	      if(m2.info[cpt]>m2.info[cpt])
    		test=0;
    	    }
    	  }
     
    	}
          }
        }
      }
    }
     
     
     
     
     
    void affiche_all(signets s){
      int i;
      for(i=0;i<s.taille;i++){
        affiche(s.tab[i]);
        printf("\n");
      }
    }
     
     
    int main(void){
      signet s;
      signets s2;
      init2(&s2);
      char url[50];
      char info[50];
      int star;
      ajoute_signet(&s2,url,info,&star);
      ajoute_signet(&s2,url,info,&star);
      affiche_all(s2);
      printf("Gestionnaire de signets triés:\n");
      printf("\n");
      trie_signet(&s2);
      affiche_all(s2);
      return 0;
    }
    merci d'avance pour votre aide.

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

    strlen renvoie un type size_t qui est un entier non signé.

    cpt est de type int, donc signé.

    pour faire disparaitre le warning, il suffirait de déclarer cpt comme size_t. Attention dans ce cas que la conception du programme le permette.

    Au passage, je n'ai pas l'impression que cpt change beaucoup dans le programme.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Points : 43
    Points
    43
    Par défaut
    Merci pour l'aide j'ai corrigé avec un (int) strlen et l'oublie sur le cpt++

    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
    void trie_signet(signets *s2){
      int i,j,test,cpt;
      signet m1,m2,save;
      if(s2->taille<2)
        return;
      for(i=0;i<s2->taille-1;i++){
        m1=s2->tab[i];
        for(j=i+1;j<s2->taille;j++){
          m2=s2->tab[j];
          if(m2.star<m1.star){
    	save=s2->tab[i];
    	s2->tab[i]=s2->tab[j];
    	s2->tab[j]=save;
          }
          else{
    	if(m2.star==m1.star){
    	  test=1;
    	  cpt=0;
    	  while((test==1) && (cpt<(int)strlen(m2.info)) && (cpt<(int)strlen(m1.info))){
    	    if(m2.info[cpt]<m1.info[cpt]){
    	      save=s2->tab[i];
    	      s2->tab[i]=s2->tab[j];
    	      s2->tab[j]=save;
    	      test=0;
    	    }
    	    else{
    	      if(m2.info[cpt]>m2.info[cpt])
    		test=0;
    	    }
                cpt++;
    	  }
     
    	}
          }
        }
      }
    }

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

Discussions similaires

  1. Ouvrir le gestionnaire d'impression
    Par MagicManu dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 25/10/2004, 13h38
  2. Perte de gestionnaire d'événements dans une fenêtre
    Par Benjamin GAGNEUX dans le forum Composants VCL
    Réponses: 15
    Dernier message: 23/08/2004, 20h14
  3. gestionnaire des taches XP
    Par tibyann dans le forum DirectX
    Réponses: 1
    Dernier message: 08/07/2004, 11h31
  4. gestionnaire de memoire
    Par elone dans le forum C
    Réponses: 2
    Dernier message: 23/01/2003, 00h31
  5. [VB6] Gestionnaire des tache de windows 2000 avec VB6
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 12/11/2002, 08h21

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