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 :

mon programme(compilateur lexical) ne marche plus


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    etudiante
    Inscrit en
    Mars 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : etudiante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 51
    Par défaut mon programme(compilateur lexical) ne marche plus
    Salut,voici mon programme compilateur lexicale en C mon prbleme c'est que à chaque foix j'entre le chemin du fichier à compiler le programme cese de fonctionner ili se bloque j'aimerai de m'aider à me débrouiller de ce truc là :
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
     
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<ctype.h>
     
     
      struct registre
           {
           char *unite ;
           char *attribut;
           };
    char  mc[][20]= {"program","debut","fin","si","alors","tantque","faire","var","tableau","entier","et","non","ou","pour","de","réel"};
       FILE *f;    
    char *chemin=NULL;
     
     
         struct registre regis_mc,regis_id,regis_op,regis_nb,regis_nbr;
     
         char *symbole=NULL;
     
         FILE *f;
    char elem;int res;
     
    int is_sep(char x) //verifie si c'est un separateur;
    {
     int r=0;
     
       if ( (x==' ')||(x=='\n') ) 
           r=1 ;        
     
     return(r);
    };
     char *anal_lex(char elem,int *res, struct registre *regis_mc,struct registre *regis_op,struct registre *regis_id,struct registre *regis_nb,struct registre *regis_nbr,FILE *f)
     {
          int i,j,nb;
          float nbr;char *s=NULL;
                       if(is_sep(elem)==0)
                       { 
                            switch (elem) {
                                       case ';' :strcpy(regis_op->unite,"pv");
                                                strcpy(regis_op->attribut,"0");
                                                return("pv");
                                        break;
     
                                         case '=' : strcpy(regis_op->unite,"oprel");
                                                strcpy(regis_op->attribut,"EGA");
     
                                                    return("oprel");
     
                                         break;
                                         case ':': elem=fgetc(f);
                                                  if(elem=='='){
                                                                strcpy(regis_op->unite,"opaff");
                                                strcpy(regis_op->attribut,"0");
                                                }
                                                else
                                                                                  break;
     
     
                                        case '<' : strcpy(regis_op->unite,"oprel");
     
                                                   elem=fgetc(f);
                                                   if (elem=='='){
     
                                                strcpy(regis_op->attribut,"PPE");
                                                   }
                                                   else if(elem=='>')
     
                                                strcpy(regis_op->attribut,"DIF");
     
                                                           else 
     
                                                strcpy(regis_op->attribut,"PPQ");
     
     
                                         break;
     
                                        case '>' : strcpy(regis_op->unite,"oprel");
     
                                               elem=fgetc(f);
                                               if (elem=='='){
     
                                                strcpy(regis_op->attribut,"PGE");
                                                  }
                                               else
     
                                                strcpy(regis_op->attribut,"PGQ");
     
                                        break; 
     
                                       case '('  :strcpy(regis_op->unite,"oprel");
     
     
                                       break;
     
                                   case ')' :strcpy(regis_op->unite,"oprel");
     
     
                                   break;
     
                                    case '+' :strcpy(regis_op->unite,"oprel");
     
     
                                     break;
     
                                    case '*' :strcpy(regis_op->unite,"oprel");
     
     
                                     default :
                                     i=0;
                                             do
                                             {
                                             s[i]=elem;
                                             elem=fgetc(f);
                                             i++;
                                             }
                                             while(is_sep(elem)==0);
                                             s[i]='\0';
                                             j=0;
                                             while((*res==0)&&(j<15))      
                                             {
                                                   if (strcmp(s,mc[j])==0) 
                                                      {     *res=1 ;
                                                            strcpy(regis_mc->unite,s);
                                                strcpy(regis_mc->attribut,"0");
                                                               return(s);
                                                       } 
                                                        else
                                                         j++;       
                                              }
     
     
                                      if (*res==0) {
                                                   if((isdigit(s[0]))&&(!(nb=atoi(s)))&&(!(nbr=atof(s))))
     
                                                   printf("%s --->ID INCORRECTE  (debut avec un chiffre)\n",s);  
     
                                                    else if (nb=atoi(s)) {  
                                                          strcpy(regis_bn->unite,"nb");
                                                strcpy(regis_id->attribut,s);
                                                            return("nb");
                                                            *res=2; 
                                                          }    
                                                         else if (nbr=atof(s)){
                                                           strcpy(regis_nbr->unite,"nbr");
                                                strcpy(regis_nb->attribut,s);
                                                              return("nbr");
                                                            *res=3;  
                                                           }
                                                 else {
                                                           strcpy(regis_id->unite,"id");
                                                strcpy(regis_id->attribut,s);
                                                              return("id");
                                                            *res=4;  
                                                           }
                                         }
     
     
     
     
                            }//fermeture du switch
                     }//fermeture du if
    }//fermeture du fonction
     
    int main()
    {
        printf("\nENTRER LE CHEMIN DU FICHIER A ANALYSER:");
         scanf("%s",&chemin);
         f=fopen(chemin,"r");
         if (f==NULL)
            {printf("LE FICHIER EST INTROUVABLE !\n");}
            else
            {
                 printf("la fichier s'est ouvert");
                 res=0;
                 while ((elem=fgetc(f))!=EOF){
                     symbole=anal_lex(elem,&res,&regis_mc,&regis_op,&regis_id,&regis_nb,f);
     
                                         if(res==0) {
                                                     printf("%s /n %s",regis_op.unite,regis_op.attribut);
                                                     }
                                                      else if(res==1){
                                                      printf("%s /n %s",regis_mc.unite,regis_mc.attribut);
                                                                 }
                                                      else if (res==2) {
                                                           printf("%s /n %s",regis_nb.unite,regis_nb.attribut);
                                                                 }
     
                                                      else if(res==3){
                                                           printf("%s /n %s",regis_nbr.unite,regis_nbr.attribut);}
                                                           else {
                                                            printf("%s /n %s",regis_id.unite,regis_id.attribut);
                                                                 }     
            }//fermeture du while
     
    }//fermeture du else
     fclose(f);
    system("pause");
    return 0;
    }
    //fermeture du main

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Tu as déjà une fonction qui fait plus de 130 lignes. Pour des soucis de compréhension de ton code, je pense qu'il faudrait que tu fasses plus de fonctions.

    Tu as aussi de jolies variables globales qu'il faudrait éviter.


    Ensuite, ton programme fait plus de 200 lignes, et tu nous dit juste :
    à chaque foix j'entre le chemin du fichier à compiler le programme cese de fonctionner ili se bloque
    C'est assez vague, as-tu essayé de placer de simples "printf" pour voir exactement où il bloque?

    Par bloquer, qu'entends-tu?

    Déjà, rien qu'en sachant où cela "bloque" et en regardant l'état de certaines variables, on devrait être plus à même de te dire ce qu'il ne va pas.

    NB : soigne aussi l'indentation


    EDIT : par "se bloque" est-ce que tu ne voudrais pas dire que ton programme se plante et renvois un code d'erreur 3 (SEGFAULT ?)
    Tu as une structure contenant deux (char *), tu fais un strcpy et je ne vois pas où tu as alloué la mémoire!

    Déclarer un (char *) n'alloue pas de tableau de char, ici ton pointeur pointera sur n'importe quoi.
    Un strcpy n'alloue pas non plus la mémoire et va écrire à l'emplacement pointé par le (char *) donc tu va écrire n'importe où dans la mémoire...

    Tu devrais regarder (m/c/re)alloc ainsi que free.

    EDIT2 : Quel est l'intérêt de déclarer une variable globale pour ensuite la passer en paramètre???

  3. #3
    Membre confirmé
    Femme Profil pro
    etudiante
    Inscrit en
    Mars 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : etudiante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 51
    Par défaut
    merci,mais le problème que mon programme se bloque dés que j'entre le chemin:le nom du fichier, j'ai pensé alors que le problème c'est de l'allocation dynamique mais il m'affiche une erreure de compilation dés que j'ajoute ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *chemin=NULL;
    chemin=(char *)malloc(100*sizeof(char));
    et l'erreur c'est:
    conflicting types for chemin!

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Où mets-tu exactement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chemin=(char *)malloc(100*sizeof(char));
    Entre quelle et quelle ligne?

  5. #5
    Membre confirmé
    Femme Profil pro
    etudiante
    Inscrit en
    Mars 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : etudiante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 51
    Par défaut
    dans la ligne 16 après la declaration du chemin en tant que pointeur sur char

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut


    On ne met jamais de code exécutable (!= prototypes, déclarations) en-dehors d'une fonction ou du main !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main()
    {
         char * chemin;
         chemin = (char *)malloc(100*sizeof(char));
         
        printf("\nENTRER LE CHEMIN DU FICHIER A ANALYSER:");
         scanf("%s",chemin);//chemin est un char *, c'est donc déjà un pointeur, on ne met pas de '&'
         f=fopen(chemin,"r");
         //....
    }
    Tu ne connais pas la taille de ton chemin même pendant l'exécution avant de charger le chemin dans ta variable, un malloc est donc inutile ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
         char chemin[100];
        printf("\nENTRER LE CHEMIN DU FICHIER A ANALYSER:");
         scanf("%s",chemin);//chemin est un char [], c'est donc déjà un pointeur, on ne met pas de '&'
         f=fopen(chemin,"r");
         //....
    }

  7. #7
    Membre confirmé
    Femme Profil pro
    etudiante
    Inscrit en
    Mars 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : etudiante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 51
    Par défaut
    merci,il l'accepte mais le problème reste le meme sauf que à cette il accepte le fichier grace à l'allocation dynamique mais le programme cesse de fonctionner,j'ai mis un affichage juste après l'appel de la fonction en main mais rien ne s'affiche et le programme se ferme je sais pas ou est le problème :/

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Il faudrait que tu place des printfs pour me dire exactement à quelle ligne ton programme plante.
    Ensuite, il faudrait que tu me donne le code de retour de ton programme ou le message d'erreur.

    De toute façon tu programme planteras lors de la fonction de la ligne 178 puisque tu vas faire des strcpy avec des (char *) qui pointent n'importe où vu que tu n'as jamais fait de malloc()

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hela.sfar Voir le message
    le programme cesse de fonctionner,j'ai mis un affichage juste après l'appel de la fonction en main mais rien ne s'affiche et le programme se ferme je sais pas ou est le problème :/
    Quand on ne sait pas où le programme s'arrête, on blinde en printf() et / ou on utilise un débogueur.


    Je ne m'engagerais pas beaucoup à parier que cette ligne pose problème :
    Il faudrait aussi régler les warnings à la compilation :
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez.c||In function 'anal_lex'
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez.c|136|warning: suggest parentheses around assignment used as truth value|
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez.c|142|warning: suggest parentheses around assignment used as truth value|
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez.c|161|warning: control reaches end of non-void function|
    ||=== Build finished: 0 errors, 3 warnings ===|

    Je ne suis pas certain de ça (j'ai eu le problème hier mais je n'ai pas réussi à répondre à la question), mais essayer de fermer un pointeur NULL pose problème :
    Pourquoi avoir d'ailleurs déclarer f comme une variable globale ?
    Cette ligne apparait 2 fois et pourtant mon compilateur ne râle pas.... Ca m'étonne.

  10. #10
    Membre confirmé
    Femme Profil pro
    etudiante
    Inscrit en
    Mars 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : etudiante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 51
    Par défaut
    j'ai essayé de régler mon programme afin d'voir un résultat satisfaisant mais meme problème et en plus le run cette fun ne se deroule plus aidez moi svp il me retourne exit 1:

    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<ctype.h>
     
     
      struct registre
           {
           char *unite  ;
           char *attribut;
           };
    char  mc[][20]= {"program","debut","fin","si","alors","tantque","faire","var","tableau","entier","et","non","ou","pour","de","réel"};
       FILE *f;    
     
         struct registre regis_mc,regis_id,regis_op,regis_nb,regis_nbr;
     
     
         FILE *f;
    char elem;int res;
     
    int is_sep(char x) //verifie si c'est un separateur;
    {
     int r=0;
     
       if ( (x==' ')||(x=='\n') ) 
           r=1 ;        
     
     return(r);
    };
     char *anal_lex(char elem,int *test, struct registre *regis_mc,struct registre *regis_op,struct registre *regis_id,struct registre *regis_nb,struct registre *regis_nbr,FILE *f)
     {
          int i,j,nb;
          float nbr;char *s=NULL;
          s=(char *)malloc(sizeof(*s));
                       if(is_sep(elem)==0)
                       {  printf("teste possible\n"); 
                            switch (elem) {
                                       case ';' :strcpy(regis_op->unite,"pv");
                                                strcpy(regis_op->attribut,"0");
                                                return("pv");
                                                  printf("affectation reussite\n");
                                        break;
     
                                         case '=' : strcpy(regis_op->unite,"oprel");
                                                strcpy(regis_op->attribut,"EGA");
     
                                                    return("oprel");
     
                                         break;
                                         case ':': elem=fgetc(f);
                                                  if(elem=='='){
                                                                strcpy(regis_op->unite,"opaff");
                                                strcpy(regis_op->attribut,"0");
                                                }
                                                else
                                                                                  break;
     
     
                                        case '<' : strcpy(regis_op->unite,"oprel");
     
                                                   elem=fgetc(f);
                                                   if (elem=='='){
     
                                                strcpy(regis_op->attribut,"PPE");
                                                   }
                                                   else if(elem=='>')
     
                                                strcpy(regis_op->attribut,"DIF");
     
                                                           else 
     
                                                strcpy(regis_op->attribut,"PPQ");
     
     
                                         break;
     
                                        case '>' : strcpy(regis_op->unite,"oprel");
     
                                               elem=fgetc(f);
                                               if (elem=='='){
     
                                                strcpy(regis_op->attribut,"PGE");
                                                  }
                                               else
     
                                                strcpy(regis_op->attribut,"PGQ");
     
                                        break; 
     
                                       case '('  :strcpy(regis_op->unite,"oprel");
     
     
                                       break;
     
                                   case ')' :strcpy(regis_op->unite,"oprel");
     
     
                                   break;
     
                                    case '+' :strcpy(regis_op->unite,"oprel");
     
     
                                     break;
     
                                    case '*' :strcpy(regis_op->unite,"oprel");
     
     
                                     default :
                                     i=0;
                                             do
                                             {
                                             s[i]=elem;
                                             elem=fgetc(f);
                                             i++;
                                             }
                                             while(is_sep(elem)==0);
                                             s[i]='\0';
                                             j=0;
                                             while((*test==0)&&(j<15))      
                                             {
                                                   if (strcmp(s,mc[j])==0) 
                                                      {     *test=1 ;
                                                            strcpy(regis_mc->unite,s);
                                                strcpy(regis_mc->attribut,"0");
                                                               return(s);
                                                       } 
                                                        else
                                                         j++;       
                                              }
     
     
                                      if (*test==0) {
                                                   if((isdigit(s[0]))&&(!(nb=atoi(s)))&&(!(nbr=atof(s))))
     
                                                   printf("%s --->ID INCORRECTE  (debut avec un chiffre)\n",s);  
     
                                                    else if (nb=atoi(s)) {  
                                                          strcpy(regis_nb->unite,"nb");
                                                strcpy(regis_id->attribut,s);
                                                            return("nb");
                                                            *test=2; 
                                                          }    
                                                         else if (nbr=atof(s)){
                                                           strcpy(regis_nbr->unite,"nbr");
                                                strcpy(regis_nb->attribut,s);
                                                              return("nbr");
                                                            *test=3;  
                                                           }
                                                 else {
                                                           strcpy(regis_id->unite,"id");
                                                strcpy(regis_id->attribut,s);
                                                              return("id");
                                                            *test=4;  
                                                           }
                                         }
     
     
     
     
                            }//fermeture du switch
                              {printf("teste reussis\n");
                     }//fermeture du if
    }//fermeture du fonction
     
    int main()
    {
        struct registre regis_mc,regis_id,regis_op,regis_nb,regis_nbr;
        regis_mc.attribut=(char *)malloc(sizeof( *regis_mc.attribut));
           regis_mc.unite=(char *)malloc(sizeof( *regis_mc.unite));
            regis_op.attribut=(char *)malloc(sizeof( *regis_op.attribut));
           regis_op.unite=(char *)malloc(sizeof( *regis_op.unite));
            regis_nb.attribut=(char *)malloc(sizeof( *regis_nb.attribut));
           regis_nb.unite=(char *)malloc(sizeof( *regis_nb.unite));
            regis_nbr.attribut=(char *)malloc(sizeof( *regis_nbr.attribut));
           regis_nbr.unite=(char *)malloc(sizeof( *regis_nbr.unite));
        char *chemin=NULL;
    chemin=(char *)malloc(sizeof(*chemin));
     char *symbole=NULL;
     symbole=(char *)malloc(sizeof(*symbole));
     
        printf("\nENTRER LE CHEMIN DU FICHIER A ANALYSER:");
         scanf("%s",chemin);
         f=fopen(chemin,"r");
         if (f==NULL)
            {printf("LE FICHIER EST INTROUVABLE !\n");}
            else
            {
                 printf("la fichier s'est ouvert");
                 res=0;
                 while ((elem=fgetc(f))!=EOF){
     
                     symbole=anal_lex(elem,&res,&regis_mc,&regis_op,&regis_id,&regis_nb,&regis_nbr,f);
                       printf("appel de la fonction\n");
                                         if(res==0) {
                                                     printf("%s /n %s",regis_op.unite,regis_op.attribut);
                                                     }
                                                      else if(res==1){
                                                      printf("%s /n %s",regis_mc.unite,regis_mc.attribut);
                                                                 }
                                                      else if (res==2) {
                                                           printf("%s /n %s",regis_nb.unite,regis_nb.attribut);
                                                                 }
     
                                                      else if(res==3){
                                                           printf("%s /n %s",regis_nbr.unite,regis_nbr.attribut);}
                                                           else {
                                                            printf("%s /n %s",regis_id.unite,regis_id.attribut);
                                                                 }     
            }//fermeture du while
     
    }//fermeture du else
     
     
     fclose(f);
    system("pause");
    return 0;
     
    }//fermeture du main

  11. #11
    Membre confirmé
    Femme Profil pro
    etudiante
    Inscrit en
    Mars 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : etudiante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 51
    Par défaut
    l'erreur c'est
    undefined reference to winmain@16'

  12. #12
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Tu fais n'importe quoi avec les malloc.

    A quoi ça sert d'avoir un malloc si c'est pour allouer l'espace dès le début du main?

    Si tu as une taille fixe, tu utilises des tableaux de char :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char monTableau[50];
    Sinon tu alloues un espace d'un char pour toutes tes chaines de caractères... Or les chaînes de caractères que tu mets dedans font entre 2 et 6 caractères.

    Pour l'utilisation du malloc, il faut l'utiliser juste avant le strcpy et allouer l'espace en fonction de la taille de la chaîne de caractère que tu veux copier (sans oublier le '\0' final)

    J'ai vu des malloc mais pas de free...

    Quand on te parle d'une fonction que tu ne connais pas, le premier réflexe c'est de regarder dans le man et de faire quelques recherches par toi-même!
    Programmer au hasard, sans savoir ce que l'on fait n'est pas une bonne manière de programmer!


    Faq : Que signifie l'erreur : unresolved external symbol _WinMain@16 ?

    Soit tu cherches et tu essayes déjà de trouver un peu par toi-même et tu nous pose des questions si vraiment tu ne comprend pas. Soit tu attends que tout te tombe du ciel dans un plateau d'argent et tu pourras attendre longtemps.

  13. #13
    Membre confirmé
    Femme Profil pro
    etudiante
    Inscrit en
    Mars 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : etudiante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 51
    Par défaut
    dsl j'ai pas compris c'est quoi le problème avec strcpy puisque j'ai déja fais les malloc cette foix?
    en tous cas voici le 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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<ctype.h>
     
     
      struct registre
           {
           char *unite ;
           char *attribut;
           };
    char  mc[][20]= {"program","debut","fin","si","alors","tantque","faire","var","tableau","entier","et","non","ou","pour","de","réel"};
       FILE *f;    
     
         struct registre regis_mc,regis_id,regis_op,regis_nb,regis_nbr;
     
     
         FILE *f;
    char elem;int res;
     
    int is_sep(char x) //verifie si c'est un separateur;
    {
     int r=0;
     
       if ( (x==' ')||(x=='\n') ) 
           r=1 ;        
     
     return(r);
    };
     char *anal_lex(char elem,int *res, struct registre *regis_mc,struct registre *regis_op,struct registre *regis_id,struct registre *regis_nb,struct registre *regis_nbr,FILE *f)
     {
          int i,j,nb;
          float nbr;char *s=NULL;
          s=(char *)malloc(sizeof(*s));
                       if(is_sep(elem)==0)
                       { 
                            switch (elem) {
                                       case ';' :strcpy(regis_op->unite,"pv");
                                                strcpy(regis_op->attribut,"0");
                                                return("pv");
                                        break;
     
                                         case '=' : strcpy(regis_op->unite,"oprel");
                                                strcpy(regis_op->attribut,"EGA");
     
                                                    return("oprel");
     
                                         break;
                                         case ':': elem=fgetc(f);
                                                  if(elem=='='){
                                                                strcpy(regis_op->unite,"opaff");
                                                strcpy(regis_op->attribut,"0");
                                                }
                                                else
                                                                                  break;
     
     
                                        case '<' : strcpy(regis_op->unite,"oprel");
     
                                                   elem=fgetc(f);
                                                   if (elem=='='){
     
                                                strcpy(regis_op->attribut,"PPE");
                                                   }
                                                   else if(elem=='>')
     
                                                strcpy(regis_op->attribut,"DIF");
     
                                                           else 
     
                                                strcpy(regis_op->attribut,"PPQ");
     
     
                                         break;
     
                                        case '>' : strcpy(regis_op->unite,"oprel");
     
                                               elem=fgetc(f);
                                               if (elem=='='){
     
                                                strcpy(regis_op->attribut,"PGE");
                                                  }
                                               else
     
                                                strcpy(regis_op->attribut,"PGQ");
     
                                        break; 
     
                                       case '('  :strcpy(regis_op->unite,"oprel");
     
     
                                       break;
     
                                   case ')' :strcpy(regis_op->unite,"oprel");
     
     
                                   break;
     
                                    case '+' :strcpy(regis_op->unite,"oprel");
     
     
                                     break;
     
                                    case '*' :strcpy(regis_op->unite,"oprel");
     
     
                                     default :
                                     i=0;
                                             do
                                             {
                                             s[i]=elem;
                                             elem=fgetc(f);
                                             i++;
                                             }
                                             while(is_sep(elem)==0);
                                             s[i]='\0';
                                             j=0;
                                             while((*res==0)&&(j<15))      
                                             {
                                                   if (strcmp(s,mc[j])==0) 
                                                      {     *res=1 ;
                                                            strcpy(regis_mc->unite,s);
                                                strcpy(regis_mc->attribut,"0");
                                                               return(s);
                                                       } 
                                                        else
                                                         j++;       
                                              }
     
     
                                      if (*res==0) {
                                                   if((isdigit(s[0]))&&(!(nb=atoi(s)))&&(!(nbr=atof(s))))
     
                                                   printf("%s --->ID INCORRECTE  (debut avec un chiffre)\n",s);  
     
                                                    else if (nb=atoi(s)) {  
                                                          strcpy(regis_nb->unite,"nb");
                                                strcpy(regis_id->attribut,s);
                                                            return("nb");
                                                            *res=2; 
                                                          }    
                                                         else if (nbr=atof(s)){
                                                           strcpy(regis_nbr->unite,"nbr");
                                                strcpy(regis_nb->attribut,s);
                                                              return("nbr");
                                                            *res=3;  
                                                           }
                                                 else {
                                                           strcpy(regis_id->unite,"id");
                                                strcpy(regis_id->attribut,s);
                                                              return("id");
                                                            *res=4;  
                                                           }
                                         }
     
     
     
     
                            }//fermeture du switch
                     }//fermeture du if
    }//fermeture du fonction
     
    int main()
    {
        char *chemin=NULL;
    chemin=(char *)malloc(sizeof(*chemin));
     char *symbole=NULL;
     symbole=(char *)malloc(sizeof(*symbole));
        printf("\nENTRER LE CHEMIN DU FICHIER A ANALYSER:");
         scanf("%s",chemin);
         f=fopen(chemin,"r");
         if (f==NULL)
            {printf("LE FICHIER EST INTROUVABLE !\n");}
            else
            {
                 printf("la fichier s'est ouvert");
                 res=0;
                 while ((elem=fgetc(f))!=EOF){
                         {printf("Le while se deroule \n");
                     symbole=anal_lex(elem,&res,&regis_mc,&regis_op,&regis_id,&regis_nb,&regis_nbr,f);
                       {printf("appel de la fonction\n");}
                                         if(res==0) {
                                                     printf("%s /n %s",regis_op.unite,regis_op.attribut);
                                                     }
                                                      else if(res==1){
                                                      printf("%s /n %s",regis_mc.unite,regis_mc.attribut);
                                                                 }
                                                      else if (res==2) {
                                                           printf("%s /n %s",regis_nb.unite,regis_nb.attribut);
                                                                 }
     
                                                      else if(res==3){
                                                           printf("%s /n %s",regis_nbr.unite,regis_nbr.attribut);}
                                                           else {
                                                            printf("%s /n %s",regis_id.unite,regis_id.attribut);
                                                                 }     
            }//fermeture du while
     
    }//fermeture du else
    }
     fclose(f);
    system("pause");
    return 0;
     
    }//fermeture du main
    et l'affichage de ce commantaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      {printf("appel de la fonction\n");}
    ne se montre pas et le programme cesse de fonctionner il accepte selement le fichier il entre ds la boucle while mais il se bloque à l'appel de la fonction

  14. #14
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (Type *)malloc(k*sizeof(Type));
    //avec k entier > 0
    Ensuite tu as des structures "registre" contenant chacune deux (char *).

    A partir de la ligne 38 du fait un strcpy, sans avoir alloué l'espace nécessaire.
    Un char * n'est qu'un pointeur. Déclarer un char * ne déclare pas un tableau de char!

Discussions similaires

  1. Mon programme de boot ne marche pas
    Par ninouchou dans le forum x86 16-bits
    Réponses: 7
    Dernier message: 09/07/2013, 12h09
  2. mon code j.s ne marche plus
    Par Invité dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 21/06/2011, 13h49
  3. Mon programme pr MSN marche plus
    Par Galdon dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 15/03/2007, 05h28
  4. [Classloader]mon progr ne marche plus après modif des *.class
    Par Melchisedec dans le forum API standards et tierces
    Réponses: 16
    Dernier message: 30/04/2006, 20h48
  5. [FLASH 8] Mon menu marche puis marche plus...
    Par mixomatoz dans le forum Flash
    Réponses: 1
    Dernier message: 24/11/2005, 10h24

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