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 :

problème tableau de structure


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut problème tableau de structure
    Bonjour,

    j'aimerai faire un tableau de struct, mais j'ai du mal.

    voici ma struct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct _R_{
    	char * ID;
    	char * seq;
    	char * qualite;
    }Read;
    j'aimerai faire une fonction qui me rempli le tableau de struct et donc la struct en même temps. Une fois le tableau rempli, elle me renvoie le tableau de struct. Voici ma fonction :

    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
    Read * lireFastq(char * file, int taille){
    	char phrase[36]; 
    	char * read;
    	Read * tabRead = (Read*)malloc(1000*sizeof(Read));
    	FILE *f = fopen(file, "r");
    	int i=0;
    	int retour;
    	int bonId;
    	int bonQualite;
    	regex_t preg;
    	if(f!=NULL){
    		while (fgets(phrase, 36, f) != NULL){ 
    			regcomp(&preg, "^@", REG_EXTENDED | REG_NOSUB);
    			bonId=regexec(&preg, phrase, 0, 0, 0);
    			if(!bonId){
    				read=substring(phrase, 0, strlen(phrase)-1);
    				tabRead[i].ID=read+1;
    				printf("id : %s\n", read+1);
    			}
    			regcomp(&preg, "^[A-Z]{35}", REG_EXTENDED | REG_NOSUB);
    			retour=regexec(&preg, phrase, 0, 0, 0);
    			if(!retour){
    				read=substring(phrase, 0, taille);
    				tabRead[i].seq=read;
    				printf("seq : %s\n", read);
    			}
    			regcomp(&preg, "^[A-Z]{10}@@@", REG_EXTENDED | REG_NOSUB);
    			bonQualite=regexec(&preg, phrase, 0, 0, 0);
    			if(!bonQualite){
    				printf("qualite : %s\n", phrase);
    				tabRead[i].qualite=phrase;
    			}
    			i++;
    			tabRead[i]=r;
    		}
    		fclose(f);
    	}
    	else{
    		printf("Impossible d'ouvrir le fichier %s.\n", file);
    	}
    	return tabRead;
    }
    Ceci me renvoie une erreur de segmentation.

    merci.

    Alaninho

  2. #2
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par alaninho Voir le message
    Bonjour,

    j'aimerai faire un tableau de struct, mais j'ai du mal.

    voici ma struct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct _R_{
    	char * ID;
    	char * seq;
    	char * qualite;
    }Read;
    j'aimerai faire une fonction qui me rempli le tableau de struct et donc la struct en même temps. Une fois le tableau rempli, elle me renvoie le tableau de struct. Voici ma fonction :

    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
    Read * lireFastq(char * file, int taille){
    	char phrase[36]; 
    	char * read;
    	Read * tabRead = (Read*)malloc(1000*sizeof(Read));
    	FILE *f = fopen(file, "r");
    	int i=0;
    	int retour;
    	int bonId;
    	int bonQualite;
    	regex_t preg;
    	if(f!=NULL){
    		while (fgets(phrase, 36, f) != NULL){ 
    			regcomp(&preg, "^@", REG_EXTENDED | REG_NOSUB);
    			bonId=regexec(&preg, phrase, 0, 0, 0);
    			if(!bonId){
    				read=substring(phrase, 0, strlen(phrase)-1);
    				tabRead[i].ID=read+1;
    				printf("id : %s\n", read+1);
    			}
    			regcomp(&preg, "^[A-Z]{35}", REG_EXTENDED | REG_NOSUB);
    			retour=regexec(&preg, phrase, 0, 0, 0);
    			if(!retour){
    				read=substring(phrase, 0, taille);
    				tabRead[i].seq=read;
    				printf("seq : %s\n", read);
    			}
    			regcomp(&preg, "^[A-Z]{10}@@@", REG_EXTENDED | REG_NOSUB);
    			bonQualite=regexec(&preg, phrase, 0, 0, 0);
    			if(!bonQualite){
    				printf("qualite : %s\n", phrase);
    				tabRead[i].qualite=phrase;
    			}
    			i++;
    			tabRead[i]=r;
    		}
    		fclose(f);
    	}
    	else{
    		printf("Impossible d'ouvrir le fichier %s.\n", file);
    	}
    	return tabRead;
    }
    Ceci me renvoie une erreur de segmentation.

    merci.

    Alaninho

    Ici, tu fais une allocation sur le tas, ce qui n'est pas forcément performant, surtout que là tu peux l'éviter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Read * tabRead = (Read*)malloc(1000*sizeof(Read));//inutile, tu connais la taille de ton tableau
     
    Read tabRead[1000];
    ensuite , ce que tu as oublié c'est d'allouer un espace mémoire pour tes membres de Read.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (i=0; i<1000; i++)
    {
      tabRead[i].ID = (char*)malloc(...);
      tabRead[i].seq = ...;
      tabRead[i]/qualite = ...;
    }
    Nullius in verba

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    en faite la taille, ici, c'est un essai car sinon la taille ne sera pas connu.

    Et je dois donc ensuite allouer la mémoire pour chaque membre des la structure Read?

  4. #4
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Salut,

    C'est tout à fait normal que tu obtiennes un segmentation fault.
    Tu alloues ta structure OK.
    Qu'en est t'il des champs qu'il la compose ?

    Forcement, quand tu fais une opération sur l'un des champs de ta structure, comme rien est alloué, tu récupères un segmentation fault.

    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
    typedef struct _R_{
    	char * ID;
    	char * seq;
    	char * qualite;
    }Read;
     
    Read *allocateReadStuct( size_t structLength, size_t IDLenght, size_t seqLength, size_t qualiteLength )
    {
    Read *ptrStruct = (Read *)malloc( structLenghtsizeof(read) );
     
    size_t i;
    for( i=0 ; i<structLenght ; i++ )
    {
    ptrStruct.ID[i]       = (char *)malloc(         IDlength*sizeof(char) );
    ptrStruct.seq[i]     = (char *)malloc(      seqLength*sizeof(char) );
    ptrStruct.qualite[i] = (char *)malloc(  qualiteLength*sizeof(char) );
    }
     
    return ptrStruct;
    }
    Je ne suis pas certain de l'exactitude de la syntaxe ( ca fait longtemps que j'ai pas codé ). Cela dit dans le principe, voilà ce que tu dois faire si tu veux que le compilateur arrête de t'insulter.

    Pense au debugger, c'est quand même bien pratique pour voir d'où vient l'erreur.

    Cdt.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    Merci Beaucoup, ta réponse, ça fonctionne à présent.

    je vais pouvoir continuer mon projet.

    Tu me proposerai quoi comme debuggueur?

    Bonne fin de journée

    Alan

  6. #6
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    J'utilisais code blocks comment environnement et son débugger n'est pas dégueulasse.

    Si tu ne l'utilises pas je te le conseille.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    En faite c'est pas résolu.lol.

    Quand je rempli le tableau de struct mon programme se bloque à un certain moment. Soit j'ai une erreur de mémoire ou j'en ai pas. Alors que quand je remplis pas le tableau, je peux tous afficher.

    Je remet mon code au cas ou.

    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
    Read * lireFastq(char * file, int taille){
    	char phrase[36]; 
    	char * read;
    	Read * tabRead = allocateReadStuct(1000, 20, taille, taille);
    	//Read * tabRead = (Read*)malloc(1000*sizeof(Read));
    	FILE *f = fopen(file, "r");
    	int i=0;
    	int retour;
    	int bonId;
    	int bonQualite;
    	regex_t preg;
    	if(f!=NULL){
    		while (fgets(phrase, 36, f) != NULL){ 
    			//tabRead[i]=malloc(sizeof(Read));
    			regcomp(&preg, "^@", REG_EXTENDED | REG_NOSUB);
    			bonId=regexec(&preg, phrase, 0, 0, 0);
    			if(!bonId){
    				read=substring(phrase, 0, strlen(phrase)-1);
    				//tabRead[i].ID=(char*)malloc((strlen(phrase)-1)*sizeof(char));
    				tabRead[i].ID=read+1;
    				printf("id : %s\n", read+1);
    			}
    			regcomp(&preg, "^[A-Z]{35}", REG_EXTENDED | REG_NOSUB);
    			retour=regexec(&preg, phrase, 0, 0, 0);
    			if(!retour){
    				read=substring(phrase, 0, taille);
    				//tabRead[i].seq=(char*)malloc(taille*sizeof(char));
    				tabRead[i].seq=read;
    				printf("seq : %s\n", read);
    			}
    			regcomp(&preg, "^[A-Z]{10}@@@", REG_EXTENDED | REG_NOSUB);
    			bonQualite=regexec(&preg, phrase, 0, 0, 0);
    			if(!bonQualite){
    				//tabRead[i].qualite=(char*)malloc(strlen(phrase)*sizeof(char));				
    				tabRead[i].qualite=phrase;
    				printf("qualite : %s\n", phrase);
    			}
    			i++;
    			//printf("%s\n", tabRead[i].ID);
    			//printf("%s\n", tabRead[i].seq);
    			//printf("%s\n", tabRead[i].qualite);
    			//tabRead[i]=r;
    		}
    		fclose(f);
    	}
    	else{
    		printf("Impossible d'ouvrir le fichier %s.\n", file);
    	}
    	return tabRead;
    }

  8. #8
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Je pense que c'est parce que tu n'alloues pas au bon moment.

    Tu ne peux pas allouer les champs comme cela au fur et à mesure dans ta fonction à moins d'utiliser realloc et non malloc.

    Il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Allocation de te structure
            Allocation de tes champs
     
    Utilisation de ta structure et de ces champs pour opérations.
     
    Et non
     
    Allocation de la struture
    Opérations sur la structure
    Allocation des champs
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    En faite, c'est mon i++ qui est mal placé. Il augmentait à chaque ligne de mon fichier alors qu'il faut qu'il augmente à chaque fois que ma structure est pleine.

    Merci de votre aide quand même.

    Alaninho

  10. #10
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Ah, je n'avais pas fait attention que c'était en commentaire les malloc dans le while. En effet, tu alloues bien avant d'entrer dans le while. Autant pour moi.

    Okay, good si ça marche =)
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

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

Discussions similaires

  1. Problème de tableau de structures, étrange
    Par Kalyptus dans le forum Débuter
    Réponses: 15
    Dernier message: 08/06/2008, 01h05
  2. Problème avec un tableau de structure
    Par pek.plus.ultra59 dans le forum C
    Réponses: 47
    Dernier message: 01/04/2008, 16h17
  3. problème tableau de structure
    Par scary dans le forum Débuter
    Réponses: 8
    Dernier message: 30/03/2008, 19h38
  4. Problème avec un tableau de structure
    Par Sofute dans le forum C
    Réponses: 10
    Dernier message: 16/10/2007, 15h29
  5. Problème free() : Tableau de structures
    Par bit_o dans le forum C
    Réponses: 11
    Dernier message: 28/04/2007, 15h53

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