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 de tableau de structure [Débutant(e)]


Sujet :

C

  1. #1
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut Probleme de tableau de structure
    salut,
    je souhaite faire un tableau de structure. Je crois que j'arrive à placer mes valeurs dans la structure, mais je n'arrive pas à les récupèrer. Quand j'exécute le programme, j'ai le message "bus error" qui je crois indique une fuite de mémoire.
    Je pense que le souci se situe au niveau de la boucle for.

    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
     
    #define TAXON_LENGTH 20
    #define	SCI_NAME_LENGTH 40
    typedef struct {
    	char		taxon;		// taxon name asked by the user 
    	char		sci_name[SCI_NAME_LENGTH];	// scientific name
    	int32_t		tax_id;					// tax id use ecoPCR prefilter
    	int32_t		tax_rank;					// taxonomic rank  
    } taxon_info;
     
    int main(int argc, char **argv) 
    {
    	int32_t     carg;
    	int32_t		i=0;
    	taxon_info	taxonlist[10];
     
    	while ((carg = getopt(argc, argv, "t:")) != -1) {
     
         switch (carg) {
            case 't':               	/* taxon list			    */
               taxonlist[i]->taxon = optarg;
               i++;
               break;
         }
     
    	}
     
    	for (i=0;i<5;i++){
    		printf("%s",taxonlist[i].taxon);	
    	}
    merci pour le coup de main D2

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ça compile, ça ?
    • taxon_info est un typedef de structure, pas de pointeur
    • taxonlist est un tableau de structure
    • taxonlist[i]->taxon est une tentative de l'utiliser comme tableau de pointeur...

    PS: Tu n'as aucune garantie que i va bien jusqu'à 5. Tu devrais mémoriser la valeur finale de i après la premère boucle et t'en servir comme limite pour ton for.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    Pour le i, je comprends ce que tu veux dire.

    Pour le reste , est ce que tu peux détailler un peu ce qui cloche ?
    voici où j'en suis :
    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
    #define TAXON_LENGTH 20
    #define	SCI_NAME_LENGTH 40
    struct taxon_info {
    	char		taxon;		// taxon name asked by the user 
    	char		sci_name[SCI_NAME_LENGTH];	// scientific name
    	int32_t		tax_id;					// tax id use ecoPCR prefilter
    	int32_t		tax_rank;					// taxonomic rank  
    };
     
    int main(int argc, char **argv) 
    {
    	int32_t     carg;
    	int32_t		i=0, k=0;
    	struct taxon_info	taxonlist[10];
     
    	while ((carg = getopt(argc, argv, "t:")) != -1) {
     
         switch (carg) {
            case 't':               	/* taxon list			    */
               taxonlist[i]->taxon = optarg;
               i++;
               break;
         }
     
    	}
     
     
    	for (k=0;k<i;k++){
    		printf("%s",taxonlist[k].taxon);	
    	}
     
    	return 0;
    }
    merci

  4. #4
    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
    taxonlist[i]->taxon = optarg;
    Ce que dit Médinoc est que taxonlist[ i ] est une structure et que pour accéder à un champ d'une structure on utilise l'opérateur . (point). L'opérateur -> permet d'accéder au champ d'une structure à partir de l'adresse de la structure.
    D'ailleurs, plus loin dans ton code on trouve l'expression correcte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s",taxonlist[k].taxon);
    Le compilateur devrait signaler cette erreur.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    ok, d'accord je comprends, je vais corriger ça merci beaucoup

    je reviens car je me demande si je dois initialiser mon tableau de structure avant de l'utiliser ?
    Je mets mon code (simplifié) ci-dessous. Je n'ai pas de message particulier à la compilation mais ça plante à l'exécution (Segmentation fault). Si je mets 0 à la place de j dans le do while, ça fonctionne.
    Dois-je faire une initialisation du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(taxon_info)*RESULT_LENGTH
    avec malloc ?
    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
    typedef struct  {
    	char		*sci_name;
    	int32_t		tax_id;
    	int32_t		tax_rank;
    } taxon_info ;
     
    #define PATTERN_NUMBER 	10
    #define PATTERN_LENGHT 	40
    #define	RESULT_LENGTH	100
     
    int main(int argc, char **argv) 
    {
    	int32_t     	carg;
    	int32_t			numpattern=0;
    	int32_t 		k,j=0;
    	char			*taxon;
    	char 			pattern[PATTERN_NUMBER][PATTERN_LENGHT];
    	taxon_info		taxonlist[RESULT_LENGTH];
    	ecotaxonomy_t 	*taxonomy;	
     
    	int				re_error;
    	int				re_match;
    	regex_t			re_preg;
     
    	while ((carg = getopt(argc, argv, "t:")) != -1) {
         switch (carg) {                        
            case 't':
               strncpy(pattern[numpattern],optarg,PATTERN_LENGHT);
               numpattern++;
               break;
         }
    	}
     
    	taxonomy = read_taxonomy(prefix);
     
    	do {
    		taxon = taxonomy->taxons->taxon[j].name;
    		taxonlist[j].sci_name = taxon;
    	   	taxonlist[j].tax_id = taxonomy->taxons->taxon[j].taxid;
    	   	taxonlist[j].tax_rank = taxonomy->taxons->taxon[j].rank;
    	   	j++;
     
    	} while(taxon != NULL);
     
    	return 0;
    }
    merci d'avance pour vos conseils

  6. #6
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    Je pense que le souci, c'est justement quand j dépasse 0, alors il y a un souci de mémoire. Peut être parce que mon tableau de structure n'a pas suffisamment d'espace mémoire?
    Quelqu'un peut-il me le confirmer?
    Si oui, quelles pistes pour y remédier?

Discussions similaires

  1. Réponses: 9
    Dernier message: 15/12/2009, 17h18
  2. Réponses: 3
    Dernier message: 06/01/2007, 14h11
  3. probleme de tableau dynamique
    Par El Krotal dans le forum C
    Réponses: 9
    Dernier message: 25/06/2004, 17h00
  4. [C#] Probleme de tableau
    Par djsbens dans le forum Windows Forms
    Réponses: 8
    Dernier message: 08/06/2004, 14h04
  5. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 13h19

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