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 :

[iniatialisation d'un pointeur de chaine dans une structure]


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 49
    Points : 44
    Points
    44
    Par défaut [iniatialisation d'un pointeur de chaine dans une structure]
    Bonjour, Voci mon problème:

    je vous expose mon problème avec ce bout de code. je veux initialiser l'element nom de la struct compte.

    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
    typedef struct
    {
       char *nom ;
       int somme;		
    }compte;		
    typedef struct
    {      
       compte  listcompte[10];
       int nbCompte;
    }tab;
     
    main()
    {
       int i=0;
       char ch[20]="bonjour";
       tab ensemble;
     
       strcpy(ensemble.listcompte[i].nom, ch);
       // Impossible de faire cette instruction de copie. Je veux 
       //initialiser l'element nom de compte! Je n'arrive pas
     
       return 0;
    }
    Merci Pour l'Aide

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    D'une part :


    D'autre part, ta chaine de destination n'a pas été allouée, nom est seulement un pointeur, il n'y a pas d'espace de stockage associé à ce pointeur.

    Enfin, pourquoi définir une taille pour ta chaine bonjour ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char ch[] = "bonjour";

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: [iniatialisation d'un pointeur de chaine dans une struct
    Citation Envoyé par yamnetouaga
    je vous expose mon problème avec ce bout de code.
    D'abord, ensuite,
    Compiling: main.c
    main.c:13: warning: return type defaults to `int'
    main.c: In function `main_':
    main.c:18: error: implicit declaration of function `strcpy'
    main.c:18: warning: nested extern declaration of `strcpy'
    <internal>:0: warning: redundant redeclaration of 'strcpy'
    Process terminated with status 1 (0 minutes, 0 seconds)
    1 errors, 2 warnings
    Ce serait bien de poster du code compilable...
    je veux initialiser l'element nom de la struct compte.
    Initialiser ? C'est à dire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct
    {
    	char *nom ;
    Ici, on a un pointeur non initialisé... danger...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	int somme;		
    }compte;		
    typedef struct
    {      
            compte  listcompte[10];
            int nbCompte;
    }tab;
     
    main()
    {
    int i=0;
    char ch[20]="bonjour";
    tab ensemble;
    et là, la structure et par conséquent ses membres, ne sont pas initialisés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        strcpy(ensemble.listcompte[i].nom, ch);
    // Impossible de faire cette instruction de copie. Je veux 
    //initialiser l'element nom de compte! Je n'arrive pas
     
    return 0;
    }
    Merci Pour l'Aide
    "Je n'arrive pas", c'est pas très scientifique...

    En fait tu cherches à copier dans une zone non définie. Avant d'utiliser un pointeur (donc la zone pointée par celui-ci), celui-ci doit contenir une adresse valide. Ici, ce n'est pas le cas. Il faut donc commencer par allouer la taille nécessaire (malloc(), par exemple). Attention, une chaine se termine par un 0...

    http://emmanuel-delahaye.developpez.....htm#pointeurs
    http://emmanuel-delahaye.developpez....tes.htm#malloc
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 49
    Points : 44
    Points
    44
    Par défaut iniatialisation d'un pointeur de chaine dans une structure
    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
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct
    {
       char *nom;
       int solde;
    }compte;
     
    typedef struct
    {
       compte  listClients[10];
    }tabClients;
     
    //fonction pour introduire les donnees
    tabClients introClient(int nbClients)
    {
       tabClients b;
       int i, j;
       char ch[21];
     
       for(i=0 ; i<nbClients ; i++)
       {      
          printf("donner le nom\n");
          scanf("%s", ch);
          strcpy(b.listClients[i].nom, ch);   // le problème est ici, je 
                                              //mettre le nom saisie dans la variable
          printf("donner son numero \n");
          scanf("%s", b.listClients[i].solde);
          /*         //j'ai meme essayer ça  j'avais pas pense a malloc 
          for(j=0; ch[j]!='\0'; j++)
          {              
             *(b.listc[i].nom + j) =ch[j];
          }               
          */
       }
       return b;
    }
     
    int main() 
    {
       tabClients ct;
       char str[10];
       int i=3;
     
       ct = introClient(i);
       for(i=0 ; i<5 ; i++)
       {
          printf("%d ",ct.listClients[i].solde);
          printf("%s\t",ct.listClients[i].nom);            
       }
       system("PAUSE");
       return 0;
    }
    Voici tout le code compilable,
    J'avais pas pensé à malloc, mais ne pourrais-je pas l'éviter par d'autres astuces! Encore merci pour l'aide.

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    typedef struct
    {
    char *nom ;
    int solde;
    }compte; 
     
    ...
     
    strcpy(b.listClients[i].nom, ch); // le problème est ici, je
    Ne peut pas marcher puisque tu n'as pas alloué au préalable la place pour ton champs nom...

    Deux solutions:

    - Changer ta structure compte vers: char nom[MAX]

    - Faire un malloc avant ton strcpy...

    Ensuite, bien que ta fonction fera ce que tu veux avec ton retour(enfin en regardant en diagonale) comme cela, pense à passer un pointeur à la place, cela fera moins de copie au moment de la fin de la fonction...

    Jc

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 49
    Points : 44
    Points
    44
    Par défaut
    J'ai oublié de te dire que ça marche avec malloc! grand merci, ça m'a redonné du courage pour la suite!

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    C'est bien,

    Tu peux prendre l'habitude de cliquer sur maintenant!

    Jc

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 49
    Points : 44
    Points
    44
    Par défaut
    Bonjour, Je voudrais bien cocher le bouton resolu mais je ne le vois pas!

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 14/04/2014, 00h02
  2. pointeur sur tableau dans une structure
    Par rollbich dans le forum Débuter
    Réponses: 3
    Dernier message: 02/06/2013, 22h23
  3. Réponses: 7
    Dernier message: 04/12/2012, 19h02
  4. Entrer une chaine dans une structure
    Par Minia dans le forum Débuter
    Réponses: 3
    Dernier message: 12/05/2009, 13h33
  5. pointeur de fonction dans une structure
    Par Flow_75 dans le forum C++
    Réponses: 1
    Dernier message: 27/12/2008, 11h55

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