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 :

probleme en structure


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut probleme en structure
    slt tt le monde
    je veux faire un tableau de tructure qui contient par exemple 5 case,dans ces structures ya 3 champ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct date 
    {
    int jour;
    char *moi;   ---->pour stocker la chaine de caractere(decembre par exemple
    int annee;
    }
    je veux que la date sra par exemple: 12 avril 2008
    je sais pas cest ou lerreur si vous pouvez maider svp
    __________________________________________________________________________
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    struct date {
    	int jour;
    	char *mois ;
    	int anne;
    };typedef struct date tdate;
    main()
    {
    	tdate *toto;
    	int i;
    	toto=malloc(5*sizeof(tdate));
    	toto->mois=malloc(sizeof(char));
    	for(i=0;i<5;i++)
    	{
    		printf("le jour:\t");
    		scanf("%d",&(toto+i)->jour);
    		printf("le mois:\t");
    		gets((toto+i)->mois);
    		printf("l'annee:\t");
    		scanf("%d",&(toto+i)->anne);
    	}
    	for(i=0;i<5;i++)
    	printf("%d %s %d\n",(toto+i)->jour,(toto+i)->mois,(toto+i)->anne);
    }
    ___________________________________________________________________________
    avec ce code ca marche mais le mois est traité comme un int pas comme chaine

    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    struct date {
    	int jour;
    	int moi;
    	int anne;
    };typedef struct date tdate;
    main()
    {
    	tdate *toto;
    	int i;
    	toto=malloc(5*sizeof(tdate));
    	for(i=0;i<5;i++)
    	{
    		printf("le jour:\t");
    		scanf("%d",&(toto+i)->jour);
    		printf("le mois:\t");
    		scanf("%d",&(toto+i)->moi);
    		printf("l'annee:\t");
    		scanf("%d",&(toto+i)->anne);
    	}
    	for(i=0;i<5;i++)
    	printf("%d / %d / %d\n",(toto+i)->jour,(toto+i)->moi,(toto+i)->anne);
    }
    ________________________________________________________________________________
    merci d'avance

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par eae-incl Voir le message
    slt tt le monde
    je veux faire un tableau de tructure qui contient par exemple 5 case,dans ces structures ya 3 champ
    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 date 
    {
    int jour;
    char *moi;   ---->pour stocker la chaine de caractere(decembre par exemple
    int annee;
    }
    je veux que la date sra par exemple:    12  avril   2008
    je sais pas cest ou lerreur si vous pouvez maider svp
    __________________________________________________________________________
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    struct date {
    	int jour;
    	char *mois ;
    	int anne;
    };typedef struct date tdate;
    main()
    {
    	tdate *toto;
    	int i;
    	toto=malloc(5*sizeof(tdate));
    	toto->mois=malloc(sizeof(char));
    	for(i=0;i<5;i++)
    	{
    		printf("le jour:\t");
    		scanf("%d",&(toto+i)->jour);
    		printf("le mois:\t");
    		gets((toto+i)->mois);
    		printf("l'annee:\t");
    		scanf("%d",&(toto+i)->anne);
    	}
    	for(i=0;i<5;i++)
    	printf("%d %s %d\n",(toto+i)->jour,(toto+i)->mois,(toto+i)->anne);
    }
    Le problème du mois, c'est que tu ne lui alloues de la place que pour stocker un caractère. Pour bien faire, il faudrait
    - faire saisir le mois dans une variable locale
    - allouer la variable "(toto + i)->mois" du nombre de caractères suffisants
    - recopier le mois saisi dans cette variable "(toto + i)->mois"
    Et surtout ne pas te tromper. Ce n'est pas "toto->mois" qu'il faut allouer (je me demande même comment le compilo peut accepter ça) mais chaque élément "(toto+i)->mois" (puisque chaque mois saisi ira dans un "toto + i" différent).

    Cependant cette méthode est "lourde" par rapport au résultat. Alors il vaut mieux essayer de faire un compromis entre "rapidité" et "espace perdu" et définir, dans ta structure tdate, un tableau mois et non un simple pointeur, ce tableau étant taillé pour stocker le plus long nom des mois possibles. Certes il y aura parfois (voire souvent) quelques caractères inutilisés mais c'est négligeable et ç'a t'évite la contrainte du malloc() et du free()

    Accessoirement, il ne faut pas utiliser gets() car tu ne peux pas empêcher l'utilisateur de rentrer une zone plus longue que ce que la variable peut recevoir. Vaut-mieux lui péférer fgets().

    Et pour finir, t'es autorisé à remplacer "(toto + i)->" par "toto[i]."
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut
    wawww merci bcp bcp
    jai vraiment oublier que avce linstruction toto->moi=malloc(sizeof(char));
    je reserve seulment la memoire pour le premier case alors que losque le i va a la 2eme case du tableau le compilateut marq des beug merci bcp
    jai fais un pti teste
    __________________________
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    struct date{
    	char *moi;
    };typedef struct date tdate;
    main()
    {
    	int i;
    	tdate *toto;
    	toto=malloc(3*sizeof(tdate));
    	for(i=0;i<3;i++)
    	{
    	(toto+i)->moi=malloc(sizeof(char));
    	printf("saisi\t");
    	gets((toto+i)->moi);
    	}
    	for(i=0;i<3;i++)
    		printf("%s\n",(toto+i)->moi);
    }
    ____________________
    voila a chque fois je dois resrve la memoire pour le pointeur qui se trouve dans la case ou je suis
    ___________________________________________________
    ui je suis daccord avec toi je dois consideré aussi la rapidité ainssi la memoire
    mais svp si je declare un tableau dans la structure(avec une taille 9 le plus long mois cest septembre)
    alors pour remplire ce tableau je dois utiliser un boucle et que lutilisateur dois saisi le moi caractere par caractere pour pouvoir les stocker dans le tableau en plus de ca je dois savoir le nombre des caractere du moi qui veux saisi
    parce que moi je connai une seule facon de remplir un tableau
    par exemple
    char tab[4] (mars)
    for(i=0;i<4;i++)
    scanf("%c",tab[i]);
    si vous pouvez me dire si ya une facon plus rapide pour remplir un tableau,
    par exemple lutilisateur saisi le mot mars apres il klik sur entrer et le mot se stoch directement sans faire une boucle
    merci merci bcp d'avoir maider

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut
    voila cest regler comme vous mavez dis jai utiliser un tableau
    ___________________________________
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    struct date {
    	int jour;
    	char tab[50];
    	int anne;
    };typedef struct date tdate;
    int test()
    {
    	int v;
    	char c;
    	c=getchar();
    	printf("voulez vous continuez?(o/n)\t");
    	scanf("%c",&c);
    	if(c=='o' || c=='O')
    		v=1;
    	else
    		v=0;
    	return v;
    }
    main()
    {
     
    	tdate *toto;
    	int i,j;
    	i=0;
    	toto=malloc(sizeof(tdate));
    	do
    	{
    		printf("la date %d:\t",i+1);
    		scanf("%d %s %d",&(toto+i)->jour,&(toto+i)->tab,&(toto+i)->anne);
    		i++;
    	}while(test());
    	for(j=0;j<i;j++)
    	printf("%d %s %d\n",(toto+j)->jour,(toto+j)->tab,(toto+j)->anne);
    }
    ______________
    merci

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par eae-incl Voir le message
    jai fais un pti teste
    __________________________
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    struct date{
    	char *moi;
    };typedef struct date tdate;
    main()
    {
    	int i;
    	tdate *toto;
    	toto=malloc(3*sizeof(tdate));
    	for(i=0;i<3;i++)
    	{
    	(toto+i)->moi=malloc(sizeof(char));
    	printf("saisi\t");
    	gets((toto+i)->moi);
    	}
    	for(i=0;i<3;i++)
    		printf("%s\n",(toto+i)->moi);
    }
    ____________________
    voila a chque fois je dois resrve la memoire pour le pointeur qui se trouve dans la case ou je suis
    Oui... mais faut réserver de l'espace pour stocker au-moins 9 caractères (plus un pour le '\0') et ton malloc ne réserve de l'espace que pour un seul caractère !!!

    Citation Envoyé par eae-incl Voir le message
    ___________________________________________________
    alors pour remplire ce tableau je dois utiliser un boucle et que lutilisateur dois saisi le moi caractere par caractere pour pouvoir les stocker dans le tableau en plus de ca je dois savoir le nombre des caractere du moi qui veux saisi
    parce que moi je connai une seule facon de remplir un tableau
    par exemple
    char tab[4] (mars)
    for(i=0;i<4;i++)
    scanf("%c",tab[i]);
    si vous pouvez me dire si ya une facon plus rapide pour remplir un tableau,
    par exemple lutilisateur saisi le mot mars apres il klik sur entrer et le mot se stoch directement sans faire une boucle
    merci merci bcp d'avoir maider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char tab[10];     // max 9 + 1
    fgets(tab, 10, stdin);
    Citation Envoyé par eae-incl Voir le message
    voila cest regler comme vous mavez dis jai utiliser un tableau
    ___________________________________
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    struct date {
    	int jour;
    	char tab[50];
    	int anne;
    };typedef struct date tdate;
    int test()
    {
    	int v;
    	char c;
    	c=getchar();
    	printf("voulez vous continuez?(o/n)\t");
    	scanf("%c",&c);
    	if(c=='o' || c=='O')
    		v=1;
    	else
    		v=0;
    	return v;
    }
    int main()
    {
    	
    	tdate *toto;
    	int i,j;
    	i=0;
    	toto=malloc(sizeof(tdate));
    	do
    	{
    		printf("la date %d:\t",i+1);
    		scanf("%d %s %d",&(toto+i)->jour,&(toto+i)->tab,&(toto+i)->anne);
    		i++;
    	}while(test());
    	for(j=0;j<i;j++)
    	printf("%d %s %d\n",(toto+j)->jour,(toto+j)->tab,(toto+j)->anne);
    }
    ______________
    merci
    1) main est de type int
    2) T'as le droit de nommer ton tableau "mois" même si c'est un tableau
    3) 50 caractères pour stocker un nom de mois qui en fera au maximum 9 ???
    4) (toto + i)->tab est déjà un pointeur => pas de "&"
    5) dommage que tu fasses "toto + j" 3 fois d'affilée (3 additions identiques)
    6) tu alloues l'espace pour une date mais tu en fais saisir plusieurs. A ton avis à quel endroit de la mémoire iront les autres ???

    Voici comment tu aurais pu l'écrire pour être plus correct
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    typedef struct {
    	unsigned short jour;
    	char mois[9 + 1];
    	unsigned short anne;
    } t_date;
    int test()
    {
    	int v;
    	char c;
    	c=getchar();
    	printf("voulez vous continuez?(o/n)\t");
    	scanf("%c",&c);
    	if(c=='o' || c=='O')
    		v=1;
    	else
    		v=0;
    	return v;
    }
    int main()
    {
     
    	t_date *toto;                          // Voilà un nom très significatif !!!
    	t_date *pt;
    	size_t nb_date;                     // Nb de date entrées
    	size_t max_date;                   // Max dates possibles en mémoire
    	int i;
     
    	nb_date=0;
    	max_date=0;
    	toto=NULL;                 // Impératif => permet au realloc de faire un choix entre allocation et réallocation
     
    	// Boucle de saisie
    	do
    	{
    		// Vérification si besoin allocation supplémentaire
    		if (nb_date == max_date)
    		{
    			// Agrandissement du nb max de dates possibles
    			max_date+=10;
     
    			// Réallocation
    			toto=realloc(toto, max_date * sizeof(t_date));
    		}
     
    		// Saisie
    		printf("la date %d:\t", nb_date + 1);
    		pt=toto + nb;
    		scanf("%hu %s %hu", &pt->jour, pt->mois, &pt->anne);
    		nb_date++;
    	}while(test());
     
    	for(i=0, pt=toto; i < nb_date; i++, pt++)
    		printf("%hu %s %hu\n", pt->jour, pt->mois, pt->anne);
     
    	free(toto);
    }
    Et encore, ce code n'est pas parfait. Normallement il faut tester que le malloc/realloc réussi et programmer un traitement s'il échoue (généralement llibérer la mémoire et quitter). Comme tu vois, faut penser à tout en C !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Probleme de structure d'un graphe
    Par Aurelienjjj dans le forum C
    Réponses: 11
    Dernier message: 20/11/2006, 16h41
  2. [XSLT] Probleme de structure de fichier xsl
    Par ben23 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/07/2006, 10h46
  3. C++ - Probleme avec structure et template
    Par vdumont dans le forum Langage
    Réponses: 3
    Dernier message: 21/03/2006, 15h32
  4. Probleme taille structure / parsing tag mp3
    Par lucas_sophia dans le forum C
    Réponses: 6
    Dernier message: 19/03/2006, 16h56
  5. Réponses: 3
    Dernier message: 28/09/2003, 17h08

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