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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    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
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    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 confirmé
    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
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    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;
    }

+ 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