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 :

Allocation dynamique d'une structure


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 21
    Points : 12
    Points
    12
    Par défaut Allocation dynamique d'une structure
    Bonjour j'ai un probleme pour récuperer les champs de saisie d'une application :

    la fonction me renvoie un char*
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SaisieLitContenu(numchp);
    J'ai crée une structure de type tableau de caractere

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct 
    {
    	char nom[20];
    	char prenom[20];
    	char tel[14];
    	char mail[30];
    }Contact;
    et je veux recuperer le contenue du champs de saisie pour l'inserer dans ma structure

    Ici je fait appelle A ma structure pour recuperer le contenue du champ de saisie grace à la fonction SaisieLitContenu et la sa ne fonctionne pas car SaisieLitContenu me renvoie un char*
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    			Contact nouveau;
    			nouveau.nom = SaisieLitContenu(250);
    			nouveau.prenom = SaisieLitContenu(251);
    			nouveau.tel = SaisieLitContenu(252);
    			nouveau.mail = SaisieLitContenu(253);
    			ajoutContact(nouveau);
    Je ne sais comment faire pour arriver à stocker le contenue de mon tableau de char dans ma structure sans modifier la structure

    Merci pour votre aide

  2. #2
    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
    Si SaisieLitContenu() renvoie une chaine de caractère, il faut la copier dans le tableau de destination par exemple avec strcpy() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(nouveau.nom , SaisieLitContenu(250));
    Mais probablement, c'est la fonction SaisieLitContenu() qui est mal conçue : elle devrait écrire directement dans le tableau voulu qui lui serait passé en argument (avec la taille maximale de ce tableau):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SaisieLitContenu(nouveau.nom,20);

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Merci diogen sa marche beaucoup mieux

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    J'ai une question dans le même rapport.
    Est ce que je ne ferait pas mieux de crée une structure dynamique ?
    Faut-il faire de l'allocation dynamique ou une liste chaine ?
    Car en fait je stock des informations dont je ne connais pas la taille dans un fichier.
    Je suis un peu perdu dans la manière de pensé pour crée cette structure ...

    [edit]
    Contenu de mon fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Nom:!!!!!!!!!!!!!!!!:Prenom:!!!!!!!!:
    Maintenant j'aimerais qu'il n'y ai plus de caractere bizzar derriere ...
    je fait une allocation dynamique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //Structure Fiche Contacte
    typedef struct 
    {
    	char nom[20];
    	char prenom[20];
    	char tel[14];
    	char mail[30];
    	int *Pointeur;
     
    }Contact;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    			Contact* nouveau = (Contact*)malloc(3*sizeof(Contact));
    			strcat(SaisieLitContenu(250),":"); //Separateur de champ
    			strcpy(nouveau->nom, SaisieLitContenu(250));
    			strcat(SaisieLitContenu(251),":");
    			strcpy(nouveau->prenom, SaisieLitContenu(251));
    			strcat(SaisieLitContenu(252),":");
    			strcpy(nouveau->mail, SaisieLitContenu(252));
    			strcat(SaisieLitContenu(253),":");
    			strcpy(nouveau->tel, SaisieLitContenu(253));
    			ajoutContact(*nouveau);
    Remplissage de mon fichier
    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
     
    void ajoutContact(Contact nouveau)
    {
     
    	FILE* pfic = NULL;
    	pfic=fopen("contact.xls","r+b");
    	fseek(pfic,0,2);
    	if (pfic != NULL)
    	{
    		fwrite(&nouveau, sizeof(nouveau),1,pfic);
    		fputc('\n',pfic);
    		fclose(pfic);
     
    	}
    }
    Et il me remplie toujours mon fichier avec des caractere bizzard

  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
    Est ce que je ne ferait pas mieux de crée une structure dynamique ?
    Faut-il faire de l'allocation dynamique ou une liste chaine ?
    Les deux choses sont indépendantes et ne résolvent pas le même problème.

    - Si la taille d'un champ de la structure n'est pas connue à priori (ou est variable) et n'est connue qu'à l'exécution, on peut utiliser l'allocation dynamique pour ce champ ce qui permet d'utiliser uniquement la mémoire nécessaire.
    On a alors la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct 
    {
    	char * nom;
    	char * prenom;
    	char * tel;
    	char * mail;
    	int *Pointeur;
     
    }Contact;
    Alors, la fonction SaisieLitContenu() doit faire l'allocation pour le champ : elle regarde la longueur de la chaine à copier (strlen()) , alloue la mémoire et fait la copie. On a alors par exemple
    nouveau.nom = SaisieLitContenu();

    - Si le nombre de contacts n'est connu qu'à l'exécution, alors on peut (aussi) faire une liste chainée de contacts. Choisir si la liste doit être simplement ou doublement chainée dépend des manipulations que l'on peut prévoir d'implémenter pour manipuler la liste.

    Pour la question des caractères bizarres, il faut peut être regarder le code de SaisieLitContenu() (je ne le connais pas et suis assez pensif sur l'utilisation du paramètre numérique).

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    J'ai repris la structure en char*
    et j'ai implementer la structure de cette facon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    			Contact nouveau;
    			strcat(SaisieLitContenu(250),":"); //Separateur de champ
    			nouveau.nom = SaisieLitContenu(250);
    			nouveau.prenom = SaisieLitContenu(251);
    			nouveau.mail = SaisieLitContenu(252);
    			nouveau.tel = SaisieLitContenu(253);
    			ajoutContact(nouveau);
    Mais il me remplie mon fichier avec des caractere bizzard uniquement maintenant ...
    Il doit surement me copier l'adresse des champs ...
    Et encore merci diogen de tes precieuses réponses. je vais essayer de faire de la liste chainé on verra si sa marche mieux

  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
    Montre le code de la fonction SaisieLitContenu()

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Points : 10
    Points
    10
    Par défaut exemple que j'ai implanté dans un programme
    voila:
    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
    struct information
    	{
    	char *nom;
    	char *prenom;
    	int age;
    	int teleph;
    	} ;
     
    void ajout(struct information inf[],int n)
    {
         int i;     
    	 for(i=1;i<=n;i++)
    	 {
    	    printf("\tpersonne %d:\n",i);
    		printf("Nom:");
    		scanf("%s",&inf[i].nom);
    		printf("Prenom:");
    		scanf("%s",&inf[i].prenom);
    		printf("Age:");
    		scanf("%d",&inf[i].age);
    		printf("Telephone:");
    		scanf("%d",&inf[i].teleph);
    	 }
    }
    void affichage(struct information inf[],int nn){
    int i;
     	 for(i=1;i<=nn;i++)
    	 {  printf("\tpersonne %d:\n",i);
    		printf("########################\n");
    	    printf("\tNom:%s\n",inf[i].nom);
    		printf("\tPrenom:%s\n",inf[i].prenom);
    		printf("\tAge:%d\n",inf[i].age);
    		printf("\tTelephone:%d\n",inf[i].teleph);
    	 }
    }

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Voici la fonction SaisieLitContenu()
    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
     
    char* SaisieLitContenu(int _num)
    {
    	struct TListeWidget *pSaisie = NULL;
    	char* sText;
     
    	// je cherche si le bouton existe
    	pSaisie = ListePointeursCherche(_num, 'S');
     
    	if(pSaisie == NULL) return NULL;
     
    	// le champ de saisie existe, je lit son contenu
    	sText = (char*)gtk_entry_get_text(GTK_ENTRY(pSaisie->ptr));
     
    	return sText;
    }
    Sinon j'ai essayer en passant par la fonction sprintf mais sa n'a rien donnée non plus ...

  10. #10
    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
    strcat(SaisieLitContenu(250),":");
    SaisieLitContenu() retourne la chaine renvoyée par gtk_entry_get_text(). Or cette chaine ne doit pas être modifiée ce que fait le strcat()

    De plus, cette chaine devrait être copiée. Il ne faut pas simplement copier le pointeur comme ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouveau.nom = SaisieLitContenu(250);

  11. #11
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    Si tu veux simplifier le debug de ton code, n'hesite pas a tester les retours de toutes tes fonctions et a utiliser des methodes d'input propres (je pense aux scanf, prefere lui fgets).

    Quant a ton probleme, je pense qu'utiliser une liste chainee avec des strdup() (et des free()) sera utile.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Je pense que tu devrais lire ou relire des tutoriels sur la gestion des chaînes de caractère en C, ca t'aidera à résoudre tes problèmes

Discussions similaires

  1. Allocation dynamiques dans une structure
    Par markhor456 dans le forum Débuter
    Réponses: 4
    Dernier message: 20/04/2013, 19h09
  2. Allocation dynamique d'une structure
    Par silma dans le forum Débuter
    Réponses: 6
    Dernier message: 05/03/2012, 12h32
  3. allocation dynamique dans une structure !
    Par grodashe dans le forum C
    Réponses: 2
    Dernier message: 31/12/2009, 11h17
  4. allocation dynamique d'une structure static
    Par Asmod_D dans le forum C++
    Réponses: 4
    Dernier message: 01/04/2009, 11h22
  5. Réponses: 3
    Dernier message: 02/01/2008, 14h02

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