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 dans l'exécution


Sujet :

C

  1. #1
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Par défaut problème dans l'exécution
    salut
    je veux faire une saisie d'une chaine de caracère qui contient des motsséparées par des ';'. chaque mot est séparé par un '- '(je peux distinguer dans chaque mot une partie gauche et une autre droite grace à '-'.puis je veux inserer cette chaine dans une liste chaineé :chaque fois que je trouve un ';' j'insere ce mot(la partie gauche dans le champ A de la structure RGL et la partie gauche dans le champ termin,et si dans un mot je trouve '|' j'insere ce qui est avant '|' dans un noeud et ce qui est apès '|' dans un autre noeud mais avec le meme champ A (EXEMPLE : si j'ai comme chaine E-BC;Z-as |R ;
    je veux mettre E,B et C dans le meme noeud (E dans le champ A et BC dans le champ termin puis j'insere un nouveau noeud dont le champ A contient Z et le champ termin contient as puis j'insère un nouveau noeud dont le champ A contient Z et le champ termin contient R)
    j'ai developpé un code en c il compile mais il ne s'éxécute pas pouvez vous m'aider svp?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include<conio.h>
    struct regle
          {
           char A;
           char termin[16];
           struct regle* next;
     
          };
    typedef struct regle RGL;
     
    struct grammaire
          {
           char nntrmn[16];
           char trmn[16];
           RGL *r;
           char S ;
          };
    typedef struct grammaire GRM ;
     
     
     //ajout d'une production
     RGL *ajout ( RGL *p, char A,char B[])
    {
       /* allocation du noeud */
       RGL *p_new = malloc (sizeof *p_new);
     
       /* si tout s'est bien passe : */
       if (p_new != NULL)
       {
          /* mise a jour des champs : */
     
          /* donnees */
          p_new->A=A;
          strcpy(p_new->termin,B);
          /* chainage par defaut */
          p_new->next = NULL;
     
          /* chainage */
          if (p == NULL)
          {
             /* c'est le premier : */
             p = p_new;
          }
          else
          {
             /* on cherche le dernier noeud */
             RGL *q = p;
     
             while (q->next != NULL)
             {
                /* pointer sur le suivant */
                q = q->next;
             }
     
             /* modification du chainage */
             q->next = p_new;
          }
       }
       return p;
    }
     
    //affichage de la liste des productions
    void affichage (RGL *p)
    {
       RGL *q = p;
     
       while (q != NULL)
       {
          /* afficher les données courantes */
          printf ("%s ", q->A);
          printf ("%s ", q->termin);
     
     
          /* pointer sur le suivant */
          q = q->next;
       }
       /* afficher la fin */
       printf ("NIL\n");
    }
     
    int main(int argc,char argv[])
     
    {
        //saisie d'une grammaire
     
        GRM *m;
        char NT[16];
        char T [16];
        char P[18];
        char A[1];
        int i,pos,s,e,i1,j;
        RGL *p=NULL;
        printf("Donner les symboles non terminaux de votre grammaire \n" );
        scanf("%s",NT);
     
        printf("Donner les symboles terminaux de votre grammaire \n ");
        scanf("%s",T);
     
        printf("Donner votre axiome \n ");
        scanf("%s",A);
        printf("Veuillez entrer vos regles de productions ( Marquez un ; a la fin de chaque regle et separez votre partie droite de celle gauche par -) \n ");
        scanf("%s",P);
        for(i=1;i<strlen(P);i++)
        {
          if(P[i]='-')
          {   char k[]="";
              for(j=i;P[j+1]=';';j++)
              {
                  sprintf(k, "%c", P[j]);
              }
              ajout(p,P[i-1],k);
          }
          else if(P[i]='|')
          {
              char l[]="";
              pos=0;
              char c[]="";
              for(s=i;P[s]='-';s--)
              ;
              pos=s-1;// pour chercher la position du non terminal
              for(e=pos+2;P[e+1]='|';e++)
              {
                  sprintf(l,"%c",P[e]);
              }
              ajout(p,P[pos],l);//je récupère la partie droite de la production avant le | et je la mets ds une production
              for(i1=i+1;P[i1]==';';i1++)
              {
                sprintf(c,"%c",P[i1]);
              }
              ajout(p,P[pos],c);//je récupère la partie gauche de la production après le | et je la mets ds une production
          }
        }
        //affichage de la liste des productions
        affichage(p);
     
     
     
     
     
        system("pause");
    }

  2. #2
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Bon, j'ai pas tout épluché en détail, mais ce que j'en ai retenu.

    - A la ligne 110, est-ce normal que P[j+1] soit affecté à ';' à l'aide de l'opérateur '='. Ne voulais-tu pas plutôt utiliser l'opérateur de comparaison '=='.
    - J'ai vu plusieurs fois des chaînes de caractère déclarées comme ceci :
    Le problème c'est que, comme tu ne donnes pas explicitement la taille de la chaîne entre crochets, c va avoir une taille égale au nombre de caractères spécifiés lors de l'initialisation. Ici, c contient simplement le caractère '\0', donc c sera une chaîne de caractère de taille 1. Du coup, dans tes sprintf qui suivent, tu risques un débordement de tableau à plusieurs reprises. D'où les erreurs de segmentation rencontrées, qui « empêchent » l'exécution de ton programme.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Par défaut
    merci pour ton aide

  4. #4
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Par défaut
    ça s'éxécute maintenant mais il m'affiche NIL il ne m'affiche pas ma liste chaineé

  5. #5
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut bonne année
    108 if(P[i]=='-')
    pas une affectation
    109 { char k[16]; char * kk; kk = k;
    pour pouvoir ajouter des lettres a la chaine k
    avec sprintf il faut tenir à jour un pointeur
    sur la caractère suivant : kk
    110 for(j = i + 1; P[j] != ';'; j++)
    j = i indexe '-', on ne le garde pas d'ou i + 1
    avec P[j + 1] == ';' on n'entre jamais dans la boucle
    avec P[j + 1] != ';' oui, mais on oublie le char avant ';'
    avec P[j} != ";' c'est mieux
    111 kk += sprintf(kk, "%c", P[j]);
    pour ne pas toujours ecrire au debut de la chaine k
    112 sprintf(kk, "%c", 0);
    pour terminer la chaine par un 0
    111 p = ajout(p, P[i - 1], k);
    pour que p ne reste pas NULL

    idem dans la suite du programme...

    rem lol sprintf au lieu de k[n++] = P[j]

    rem tel quel ton programme stocke les 3
    {a, bc|ef} {a, bc} {a, ef}
    quand il analyse
    a-bc|ef;

    bonne chance

  6. #6
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Par défaut
    j'ai changé ce que tu m'as dit mais dés que je fais la saisie de ma chaine et je tappe sur entreé il me dit le programme cesse de fonctionner

  7. #7
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Tu peux nous communiquer ton nouveau code ?
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  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
    Ajoute des printf pour savoir où le programme plante et donne nous la ligne.

  9. #9
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut
    j'ai un peu modifié ton code pour ne pas avoir à entrer à chaque test les entrées de la grammaire en utilisant les argv[i] d'une une ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gram azer uv z "a-uv;z-ue|ev;e-az|zr;r-vv;"
    où gran est le nom de l'exécutable résultant de la compilation de
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include<conio.h>
    struct regle
          {
           char A;
           char termin[16];
           struct regle* next;
     
          };
    typedef struct regle RGL;
     
    struct grammaire
          {
           char nntrmn[16];
           char trmn[16];
           RGL *r;
           char S ;
          };
    typedef struct grammaire GRM ;
     
     
     //ajout d'une production
     RGL *ajout ( RGL *p, char A,char B[])
    {
    //		printf("p=%p A=%c B=%s\n", p, A, B);
       /* allocation du noeud */
       RGL *p_new = malloc (sizeof *p_new);
     
       /* si tout s'est bien passe : */
       if (p_new != NULL)
       {
          /* mise a jour des champs : */
     
          /* donnees */
          p_new->A=A;
          strcpy(p_new->termin,B);
          /* chainage par defaut */
          p_new->next = NULL;
     
          /* chainage */
          if (p == NULL)
          {
             /* c'est le premier : */
             p = p_new;
          }
          else
          {
             /* on cherche le dernier noeud */
             RGL *q = p;
     
             while (q->next != NULL)
             {
                /* pointer sur le suivant */
                q = q->next;
             }
     
             /* modification du chainage */
             q->next = p_new;
          }
       }
       return p;
    }
     
    //affichage de la liste des productions
    void affichage (RGL *p)
    {
       RGL *q = p;
    // 		printf("affiche %p\n", p);
       while (q != NULL)
       {
          /* afficher les données courantes */
          printf ("%c ", q->A);
          printf ("%s ", q->termin);
     
     
          /* pointer sur le suivant */
          q = q->next;
       }
       /* afficher la fin */
       printf ("NIL\n");
    }
     
    int main(int argc,char * argv[])
     
    {
        //saisie d'une grammaire
     
        GRM *m;
        char NT[16];
        char T [16];
        char P[80];
        char A;
        int i, pos, s, e, i1, j;
        RGL *p = NULL;
     
    		strcpy(NT, argv[1]);
        printf("Donner les symboles non terminaux de votre grammaire : %s\n", NT);
    //    scanf("%s",NT);
     
    		strcpy(T, argv[2]);
        printf("Donner les symboles terminaux de votre grammaire : %s\n", T);
    //    scanf("%s",T);
     
    		A = argv[3][0];
        printf("Donner votre axiome : %c\n", A);
    //    scanf("%s",A);
    		strcpy(P, argv[4]);
        printf("Veuillez entrer vos regles de productions ( Marquez un ; a la fin de chaque regle et separez votre partie droite de celle gauche par -)\n"
        			 "%s\n", P);
    //    scanf("%s",P);
        for(i = 1; i < strlen(P); i++)
        { 
          if(P[i]=='-')
          {   
    			    char k[16];
          		char * kk = k;
              for(j = i + 1; P[j] != ';'; j++)
                  kk += sprintf(kk, "%c", P[j]);
              sprintf(kk, "%c", 0);
              p = ajout(p, P[i - 1], k);
          }
          else if(P[i]=='|')
          {
              char l[16];
              char * ll;
              pos=0;
              char c[16];
              char * cc;
     
              ll = l;
              cc = c;
              for(s = i; P[s] != '-'; s--)
              ;
              pos=s-1;// pour chercher la position du non terminal
              for(e = pos + 2; P[e] != '|'; e++)
              {
                  ll += sprintf(ll,"%c",P[e]);
              }
              sprintf(ll, "%c", 0);
              p = ajout(p,P[pos],l);//je récupère la partie droite de la production avant le | et je la mets ds une production
              for(i1 = i + 1; P[i1] != ';'; i1++)
              {
                cc += sprintf(cc,"%c",P[i1]);
              }
              sprintf(cc, "%c", 0);
              p = ajout(p,P[pos],c);//je récupère la partie gauche de la production après le | et je la mets ds une production
          }
        }
        //affichage de la liste des productions
        affichage(p);
     
        system("pause");
        return 0;
    }
    qui compile aussi bien sous tiny C qu'avec gcc pour produire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    gram azer uv z "a-uv;z-ue|ev;e-az|zr;r-vv;"
     
    Donner les symboles non terminaux de votre grammaire : azer
    Donner les symboles terminaux de votre grammaire : uv
    Donner votre axiome : z
    Veuillez entrer vos regles de productions ( Marquez un ; a la fin de chaque regle et separez votre partie droite de celle gauche par -)
    a-uv;z-ue|ev;e-az|zr;r-vv;
    affiche 003E2430
    a uv z ue|ev z ue z ev e az|zr e az e zr r vv NIL
    Appuyez sur une touche pour continuer...
    A+

  10. #10
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Par défaut
    je l'ai exécuté avec dev c++ et codebloks mais il m'affiche le programme s'arrete de fonctionner

  11. #11
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    je l'ai exécuté avec dev c++ et codebloks mais il m'affiche le programme s'arrete de fonctionner
    Tu dois exécuter ton programme avec des arguments en ligne de commande, sinon tu as le droit à une erreur de segmentation à cette ligne :

    anarchasis > tu aurais pu tester la valeur de argc.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  12. #12
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Par défaut
    anarchasis stp dans l'éxécution je ne veux pas avoir z ue|ev je veux seulement z ue z ev et merciii bcp pour vos aide tous

  13. #13
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Tu peux passer par l'invite de commande (Démarrer->Exécuter->"cmd" de mémoire).
    Tu compiles le fichier avec le compilateur de ton IDE.
    Tu te déplaces vers le dossier de ton exécutable à l'aide de la commande cd (ou alors tu tapes le chemin absolu de ton exécutable), puis tu tapes la ligne :

    nomDuFichier.exe argument1 argument2 argument3 ... argumentn
    @keli : pourquoi tu as édité ton message ?
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  14. #14
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Pourquoi demandes-tu de changer de compilateur ? gcc ne te convient pas ?
    Quelle explication te gène ?
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  15. #15
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Par défaut
    stp c'est la 1ère fois que je travaille avec gcc je trouve un problème tu veux dire par ID mon compilateur de codeblok ou devc ++ ou quoi?et lorsque j'écris cd et aprés mon nom du fichier il me dit 'saisie_c.exe' n'est pas reconnu en tant que commande interne ou externe ,un programme exécutable ou un fichier de commande

  16. #16
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Bon, alors, faisons le point.

    Un IDE, c'est un environnement de développement. Un ensemble d'outils (un éditeur de texte pour écrire son code, un compilateur, etc.). Exemple : Dev C++, Code::Blocks.
    Un compilateur, c'est un outil pour transformer tes fichiers sources .c en un exécutable .exe (à tous les experts qui me lisent, je simplifie, on va pas rentrer dans l'édition des liens et compagnie, ce n'est pas le sujet de ce message).

    Bon, tu commences par compiler ton code en cliquant sur l'icône prévu de ton IDE (sous Code::Blocks, je crois que c'est un petit rouage jaune). Si tu n'as pas d'erreurs, normalement, un exécutable se crée dans un sous-répertoire du dossier de ton projet. Tu peux aller faire du repérage en passant par ton explorateur de fichier. Ton exécutable est situé dans le répertoire bin, puis « Debug » ou « Release » suivant le mode de compilation utilisé. Maintenant, pour plus de simplicité, tu peux copier/coller le chemin de ton exécutable (en n'oubliant pas le nom de l'exécutable lui-même).

    Donc, ensuite, tu ouvres ton invite de commande, tu colles le chemin de ton exécutable, tu ajoutes les arguments que tu souhaites, et tu appuies sur Entrée. Si il t'affiches que ce n'est pas reconnu en tant que commande interne [...], c'est que tu t'es trompé de chemin.

    Voilà pour une explication qui je l'espère sera plus détaillée.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  17. #17
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Par défaut
    en fait je veux appliquer à mes règles de production les algorithmes de simplification suivant :

    Pour cela, algorithme récursif n°1 :
    - Les Non-Terminaux dont une production au moins ne contient que des terminaux sont utiles;
    - Les Non-Terminaux dont une production au moins ne contient que des terminaux et des
    symboles utiles sont utiles.
    Cet algorithme se termine en fournissant les symboles à retenir.
    Les autres sont inutiles, on les enlève. La grammaire ainsi obtenue est équivalente à la
    grammaire de départ.
    Puis éliminer tous les symboles (terminaux ou non) n'appartenant à aucun mot dérivé de
    l'axiome.
    Pour cela, algorithme récursif n°2:
    - L'axiome est utile ;
    - Les symboles apparaissant dans les productions de symboles utiles sont utiles.
    Les symboles non retenus sont inutiles, on les enlève et on a encore une grammaire
    équivalente.
    La suppression des symboles inutiles se fait en appliquant l'algorithme n°1 puis l'algorithme
    n°2. L'ordre a de l'importance.

    Exemple : Partons de la grammaire G suivante :
    S  AB | CA
    A  a
    B  AB | EA
    C  aB | b
    D  aC
    E  BA
    L'algorithme n°1 conserve A et C, puis S et D.
    Il reste donc :
    S  CA
    A  a
    C  b
    D  aC
    L'algorithme n°2 élimine D.
    Il reste finalement :
    S  CA
    A  a
    C  b
    voici le code que j'ai développé mais il m'affiche le programme a cessé de fonctionner
    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
     
      //suppression d'une production
    RGL *supprim_noeud (RGL *r, char x)
    {
        RGL *m = NULL;
       if (r && r->A== x)
       {
     
          m = r->next;
          r->next = m->next;
          free ( m);
          m= NULL;
       }
      return m;
    }
     
    int existe(char b[],char t[])
     {
          int k=0;
          int i;
          for(i=0;i<strlen(b);i++)
          {  if( strchr(t,b[i]) != NULL )
             k++;
          }
          if (k=strlen(b)) return 1;
          else return 0;
     }
     
     
    int existance (char b[],char t[], char prod[])
    {
     
          int k=0;
          int i;
          for( i=0;i<strlen(b);i++)
          {  if( (strchr(t,b[i])!= NULL ) || (strchr(prod,b[i])!= NULL ))
             k++;
          }
          if (k=strlen(b)) return 1;
          else return 0;
     
     
     }
         void calcul_prod( GRM *m )
    {
     
     
      char prod[16];
         char tab[16];
         int i,j=0;
        RGL *mr;
         mr=m->r;
         for( ;mr;  mr=mr->next)
         {
            while(existe(mr->termin ,m->trmn))
            {
                prod[i]= mr->A;
                   i=i+1;
            }
     
         }
     
     
        for(;mr;mr=mr->next)
        {
          if (existance(mr->termin, prod,m->trmn))
              {
                tab[j]=mr->A;
                j++;
                 strcat(prod,tab);
               }
         }
     
        for(;mr;mr=mr->next)
        {
            if ( strchr(prod,mr->A)== NULL )
            {
               supprim_noeud(mr,mr->A); // supprime le noeud
            }
        }
     
    // affichage de la nouvelle liste chainée
    affichage(mr);
    }
    pouvez vous m'aider svp?

  18. #18
    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
    Citation Envoyé par keli1 Voir le message
    voici le code que j'ai développé mais il m'affiche le programme a cessé de fonctionner

    Déjà donne nous le message d'erreur précis.

    Ensuite, c'est pas bien compliquer de mettre des printf pour trouver et nous donner la ligne où le programme cesse de fonctionner...

    Tu nous files un code : "ça marche pas, corrigez-le pour moi"

    Non, ça ne fonctionne pas comme cela, on est là pour t'aider, pas pour déboguer à ta place.
    Donc comme déjà à chercher la ligne de l'erreur, repérer où une erreur se produit c'est quand même la base.

    Ligne 12, pourquoi faire un m = null? il me semble qu'après un free, les pointeur sont réinitialisé à null non?

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Ligne 12, pourquoi faire un m = null? il me semble qu'après un free, les pointeur sont réinitialisé à null non?
    Non, la mémoire pointée est libérée mais le pointeur pointe toujours sur cette zone.
    Vu qu'il s'agit d'un pointeur temporaire dans une fonction, c'est superflue.

    @Keli1 : quid des printf pour savoir quand ça plante ?
    Dans ton IDE, tu peux choisir de lancer le programme avec des paramètres en spécifiant une commande à joindre au lancement de l'executable depuis ton IDE (fouille un peu, je n'utilise plus code::blocks - et encore moins dev-cpp : tu devrais en faire de même pour ce dernier et ne plus l'utiliser)

    En dehors de ça, désolé mais je n'ai pas lu en détail le sujet, mais la manipulation de chaîne de caractères en C est grande source d'erreur de mémoire, ton programme peut planter à bien des endroits, de bien des manières.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  20. #20
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Par défaut
    j'ai mis des printf mais il ne m'affiche rien juste le programme a cessé de fonctionner

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/01/2010, 16h30
  2. Réponses: 4
    Dernier message: 14/11/2009, 14h52
  3. Problème dans l'exécution d'une requete !
    Par zouzou_18 dans le forum VB.NET
    Réponses: 4
    Dernier message: 07/08/2009, 16h30
  4. Problème dans l'exécution du start.bat sous jbpm
    Par Simply Smart dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 19/02/2008, 14h31

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