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 de compilation


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut Problème de compilation
    Bonjour
    j'écrit un programme qui lit un fichier qui a ce format

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    >nom1
    acgcctacgactacgcctacgactacgcctacgactacgcctacgactacgcctacgactacgcctacg
    actacgcctacgactacgcctacgactacgcctacgactacgcctacgactacgcctacgactacgcct
    acgactacgcctacgactacgcctacgactacgcctacgactacgcctacgactacgcctacgactacg
    cctacgactacgcctacgactacgcctacgact
    >nom2
    acgcctacgactacgcctacgactacgcctacgactacgcctacgactacgcctacgactacgcctacg
    actacgcctacgactacgcctacgactacgcctacgactacgcctacgactacgcctacgactacgcct
    acgactacgcctacgactacgcctacgactacgcctacgactacgcctacgactacgcctacgactac
    gcctacgactacgcctacgactacgcctacgactacgcctacgac
    mais j'ai des problèmes d'exécution là ou je n'attendais pas après débogage je me rend compte que l'erreur provient de fseek ?!
    ça compile mais ça n'exécute pas !

    Voici mon code

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    #include <stdio.h>
    #include <stdlib.h>
     
    struct FASTA {
    char * comment ;
    char * sequence ;
    };
     
    typedef struct FASTA  tfa ;
     
    char* readfasta(char* name){
     
    FILE *FIC;
    char *chaine,chaine2;
    tfa sequence;
    int i,j,k,indcom,indseq;
    int length,curpos;
    char **tab1;
    char **tab2;
     
     
    length=0;
    FIC=fopen(name,"w+");
     
    curpos=ftell(FIC); /* je positionne mon curseur */
    fseek(FIC,0,SEEK_END); /*je me place à la fin de mon fichier*/
    length=ftell(FIC);/*et hop la taille du fichier*/
    fseek(FIC,curpos,SEEK_SET);/*je me replace au début*/
     
    chaine=(char*)malloc(length*sizeof(char)); /*j'allou pas trop de mémoir puisqu'après je libère*/
    fread(chaine,length,1,FIC);
    fclose(FIC);
     
    sequence.comment=(char*)malloc(length*sizeof(char));/*allocation obligatoire non ? */
    sequence.sequence=(char*)malloc(length*sizeof(char));
     
    k=0;
     
     
    tab1=(char**)malloc(length*sizeof(char*));
    tab2=(char**)malloc(length*sizeof(char*));
     
     while(k<length){
     
     while(chaine[i]!='\n'){
    sequence.comment[i]=chaine[i];
    i++;
    }
     
    tab1[k]=sequence.comment;
     
     
    sequence.comment[i]='\0';
    i=i+1;
    j=0;
     
     while(i<length && chaine[i]!='>'){
       if (chaine[i]!='\n'){
    sequence.sequence[j]=chaine[i];
    j++;
       }
    i++;
     }
     
    tab2[k]=sequence.sequence;
    sequence.sequence[j]='\0';
     
    k++;
     
     }
    tab1[k]='\0';
    tab2[k]='\0';
     
     
     for (i=0;i<=k;i++){
     
    printf("%s \n",tab1[i]);
    printf("%s \n",tab2[i]);
     
     }
    /* READ, ALLOCATE AND PUT SEQUENCES IN CHAINE */
     
    printf("%d",length);
     
    }
     
    int main (int argc,char **argv){
     
    char* seq;
     
    seq = readfasta(argv[1]);
     
    return 0;
     
    }
    Qqu'un pourrait m'aider ?

    Merci

  2. #2
    Expert confirmé

    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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Déjà à la compilation:
    prob.c: In function 'readfasta':
    prob.c:17: warning: unused variable 'indseq'
    prob.c:17: warning: unused variable 'indcom'
    prob.c:15: warning: unused variable 'chaine2'
    prob.c:86: warning: control reaches end of non-void function

    Ensuite:
    Bien que pas une obligation, les variables devraient être en minuscule et les constantes en majuscule pour permettre au lecteur de les discerner facilement...

    Ensuite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FIC=fopen(name,"w+");
    Il faut toujours tester le retour de fopen pour voir si la fonction n'a pas rencontré une erreur... On peut aussi programmer plus sûr et tester avant toute chose que name!=NULL.

    EDITION: Erreur d'inattention sur le test... Réparer...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(FIC==NULL)
      {
        //Code pour gérer l'erreur
        printf("Problème avec l'ouverture du fichier %s\n",name);
         return NULL;
      }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    curpos=ftell(FIC); /* je positionne mon curseur */
    fseek(FIC,0,SEEK_END); /*je me place à la fin de mon fichier*/
    length=ftell(FIC);/*et hop la taille du fichier*/
    fseek(FIC,curpos,SEEK_SET);/*je me replace au début*/
    Est une façon compliquée de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fseek(FIC,0,SEEK_END); /*je me place à la fin de mon fichier*/
    length=ftell(FIC);/*et hop la taille du fichier*/
    fseek(FIC,0,SEEK_SET);/*je me replace au début*/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chaine=(char*)malloc(length*sizeof(char)); /*j'allou pas trop de mémoir puisqu'après je libère*/
    Toujours tester le retour de malloc et le transtypage n'est pas nécessaire. Le sizeof(char) n'est pas nécessaire non plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chaine = malloc(length);
    Ensuite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sequence.comment=(char*)malloc(length*sizeof(char));/*allocation obligatoire non ? */
    ...
     while(chaine[i]!='\n'){
    sequence.comment[i]=chaine[i];
    i++;
    }
    Vu que tu fais une copie, l'allocation est obligatoire. Par contre, ta boucle risque de faire un segmentation fault vu que tu te bases sur le fait qu'il y aura un '\n' à la fin de ta chaine. Il faudrait mieux ajouter un test sur la longueur du tableau pour être plus sûr.

    Autre remarque, la variable i n'est pas initialisé. Donc comportement indéterminé!

    Autre problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tab1[k]=sequence.comment;
    tab2[k]=sequence.sequence;
    Ne fait pas ce que tu crois, ceci copie les pointeurs. Si tu modifies la chaîne tab1[k] tu modifieras la chaîne sequence.comment et vice-versa... Il te faudrait strcpy.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tab1[k]='\0';
    tab2[k]='\0';
    N'a aucun sens puisque tab1 est un tableau de char* et '\0' est un caractère. Plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tab1[k]=NULL;
    tab2[k]=NULL;
    Mais fais attention à ta borne supérieur de ta boucle, pourquoi ne pas faire ceci:
    Et finalement, il te manque un return à la fin de ta fonction, elle devait retourner quoi?

    Jc

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par fearyourself
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    curpos=ftell(FIC); /* je positionne mon curseur */
    fseek(FIC,0,SEEK_END); /*je me place à la fin de mon fichier*/
    length=ftell(FIC);/*et hop la taille du fichier*/
    fseek(FIC,curpos,SEEK_SET);/*je me replace au début*/
    Est une façon compliquée de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fseek(FIC,0,SEEK_END); /*je me place à la fin de mon fichier*/
    length=ftell(FIC);/*et hop la taille du fichier*/
    fseek(FIC,0,SEEK_SET);/*je me replace au début*/
    Non.
    En fait, c'est le commentaire "je me replace au début" qui est erroné: Il faut dire à la place "Je me replace où j'étais avant".

    Et là, on voit la différence.
    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.

  4. #4
    Expert confirmé

    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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Non.
    En fait, c'est le commentaire "je me replace au début" qui est erroné: Il faut dire à la place "Je me replace où j'étais avant".
    Je ne suis pas d'accord, le ftell se fait tout de suite après l'ouverture du fichier avec l'option "w+" donc:

    w+ Open for reading and writing. The file is created if it does
    not exist, otherwise it is truncated. The stream is positioned
    at the beginning of the file.
    Ce qui veut dire que curpos devrait être égale à 0....

    Ou ai-je loupé quelque chose? Ca doit être la faim qui me fait perdre la tête, il est midi
    Jc

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ah oui, LÀ, c'était redondant.
    Mais quand on est encore débutant et que la tentation du copier-coller est grande, autant garder tout le bloc.
    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.

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    Merci les gars !
    j'ai pris en compte tous vos remarque voila mon code corrigé :
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    struct FASTA {
    char *comment ;
    char *sequence ;
    };
     
    typedef struct FASTA * tfa ;
     
    char readfasta(char* name){
     
    FILE *fic;
    char *chaine;
    tfa sequence;
    int length,i,j,k,debut;
     
    char **tab1;
    char **tab2;
     
    fic=fopen(name,"r");
    if(fic!=NULL) 
      {  
        printf("Problème avec l'ouverture du fichier %s\n",name); 
         return NULL; 
      } 
     
    fseek(fic,0,SEEK_END);
    length=ftell(fic);
    fseek(fic,0,SEEK_SET);
    fclose(fic);
     
    /* READ, ALLOCATE AND PUT SEQUENCES IN CHAINE */
     
    chaine=(char*)malloc(length);
    sequence->comment=(char*)malloc(length);
    sequence->sequence=(char*)malloc(length);
     
    k=0;
     
    tab1=(char**)malloc(length*sizeof(char*));
    tab2=(char**)malloc(length*sizeof(char*));
     
     while(k<length){
     
     while(chaine[i]!='\n'){
    sequence->comment[i]=chaine[i];
    i++;
    }
     
     tab1[k]=sequence->comment;
     
     
    sequence->comment[i]='\0';
    i=i+1;
    j=0;
     
     while(i<length && chaine[i]!='>'){
       if (chaine[i]!='\n'){
    sequence->sequence[j]=chaine[i];
    j++;
       }
    i++;
     }
     
     tab2[k]=sequence->sequence;
    sequence->sequence[j]='\0';
     
    k++;
     
     }
     
      for (i=0;i<k;i++){
     
     printf("%s \n",tab1[i]);
     printf("%s \n",tab2[i]);
     
      }
     
    printf("%d ",length);
    }
     
    int main (int argc,char **argv){
     
    char seq;
     
    seq = readfasta(argv[1]);
     
    return 0;
     
    }
    Mais g toujours des problèmes et quand je débogue g ça comme message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ouragan_bl2dist_cversion_> dbx bl2dist.o
    dbx version 5.1
    Type 'help' for help.
     
    main:   5  char *comment ;
    (dbx) run
    signal Segmentation fault at >*[fseek, 0x3ff800edb00]   ldq     a0, 40(a0)
    (dbx)
    c clair c au niveau de fseek, j'ai un doute quant à la lecture du fichier pourtant il existe bel et bien !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(fic!=NULL)
      { 
        printf("Problème avec l'ouverture du fichier %s\n",name);
         return NULL;
      }
    Ta fonction retourne si l'ouverture a marché, sinon elle donne dans le fseek avec son pointeur NULL...

    Conclusions:
    1. Ton test est foireux: il faut tester ==NULL
    2. Ton fichier n'existe pas OU n'est pas accessible (pas là où le programme croit qu'il est)

    PS: Ta fonction qui est supposée retourner un char retourne tantot NULL, tantot rien du tout. Active les warnings sur ton compilateur avant qu'Emmanuel ne te tombe dessus...
    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.

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    oui oui oui je vous ai envoyé une mauvaise version excusez moi j'ai en effet mis ==NULL mais rien, ça marche pas non plus je me suis assuré des permissions sur mon fichier et rien, ça marche pas !

  9. #9
    Expert confirmé

    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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Ton test est foireux: il faut tester ==NULL
    C'est de ma faute, dans ma correction, cette erreur s'est introduite... Désolé.

    Ensuite, dans ton code, tu as corrigé certaines erreurs mais d'autres persistent et encore pire tu en as ajouté.

    Avant de refermer ton fichier, il serait préférable de lire ce qu'il y a dedans, non? Comme ce que tu avais fait dans ta 1ere version.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    chaine=malloc(length);
    if(chaine==NULL)
      {
      printf("Erreur d'allocation de chaine\n");
      return NULL;
      }
    fread(chaine,length,1,fic);
    Ta variable sequence est aussi un pointeur, il faut donc l'allouer aussi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sequence = malloc(sizeof *sequence);
    if(sequence==NULL)
      {
      printf("Erreur d'allocation de sequence\n");
      free(chaine);
      return NULL;
      }
    Ta variable i n'était toujours pas initialisée...

    Ta boucle externe devrait plutôt être:

    mettre k est une erreur de logique

    Ta première boucle interne devrait plutôt être comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    j=0;
     while((i<length)&&(chaine[i])!='\n'){
       sequence->comment[j]=chaine[i];
       i++;j++;
     }
     
    tab1[k]=sequence->comment;
    sequence->comment[j]='\0';
    Et il manque un return à la fin de la fonction, qu'est-ce que tu veux retourner?

    Jc

  10. #10
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    au fait k c pour reprendre à chaque fois qu'on rencontre un signe > donc c pour ça que je l'ai mis en boucle externe ça sert à compter combien g de séquence indirectement
    ça n'a pas l'air de s'arranger g toujours des problèmes

  11. #11
    Expert confirmé

    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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    au fait k c pour reprendre à chaque fois qu'on rencontre un signe > donc c pour ça que je l'ai mis en boucle externe
    Mais tu ne sais pas à l'avance combien de > tu as avant de commencer ta boucle...

    length est le nombre de caractères dans le fichier..

    Jc

  12. #12
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    justement comme ça je suis sûr que j'ai balayé tout le fichier, chaque fois qu'il rencontre un > il revient et refait la meme chose, il lit ce qui'il ya devant >jlkjljljjlkjkljkl jusq'à \n il met ds sequence->comment puis il passe il lit le reste tant kil n'a pas trouvé > et il met ds sequence->sequence ce que je veux faire c deux tableau où je stocke les resultats à chaque boucle !
    J'espère que g t clair

  13. #13
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    g un problème d'ouverture de fichier ! c trés pas normal

Discussions similaires

  1. problème de compilation sous visual C++
    Par fabmili dans le forum MFC
    Réponses: 4
    Dernier message: 08/02/2004, 19h52
  2. problème de compil devc++ socket
    Par stefdem dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 11/12/2003, 11h33
  3. Réponses: 1
    Dernier message: 29/10/2003, 12h16
  4. Problème de compilation de la DLL du XMLRad
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 2
    Dernier message: 16/04/2003, 16h46
  5. Réponses: 1
    Dernier message: 27/05/2002, 01h44

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