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 :

erreur de segmentation compilateur


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 81
    Points : 50
    Points
    50
    Par défaut erreur de segmentation compilateur
    bonsoir !!
    voici une fonction que j'ai créer pour insrer un IDF dans ma table des symbole mais lors de son utilisation elle me retourne erreur de segmentation je pense que c'est due au STRCPY
    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
    void insert(char *entite, char *type){
    liste p= recherche(entite);
    /* creation d'un noeud */
    if (p == NULL) {
    p = (liste) malloc(sizeof(elem));
    p->entite= (char*)malloc(sizeof(char)*strlen(entite));
    strcpy(p->entite,entite);
    p->type=type;
    p->ligneA=nbrligne;
    p->svt=NULL;
     
    /* insertion du noeud en tête de liste (LIFO) */
    p->svt = table_symboles;
    table_symboles = p;
    }
    }
    je fait appel a cette fonction au niveau bison
    merci de m'aider a trouver l'erreur

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lucastof Voir le message
    bonsoir !!
    voici une fonction que j'ai créée pour insrer un IDF dans ma table des symbole mais lors de son utilisation elle me retourne erreur de segmentation je pense que c'est dû au STRCPY
    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
    void insert(char *entite, char *type){
    liste p= recherche(entite);
    /* creation d'un noeud */
    if (p == NULL) {
    p = (liste) malloc(sizeof(elem));
    p->entite= (char*)malloc(sizeof(char)*strlen(entite));
    strcpy(p->entite,entite);
    p->type=type;
    p->ligneA=nbrligne;
    p->svt=NULL;
    
    /* insertion du noeud en tête de liste (LIFO) */
    p->svt = table_symboles;
    table_symboles = p;
    }
    }
    je fait appel a cette fonction au niveau bison
    merci de m'aider a trouver l'erreur
    Salut
    Si tu avais réfléchi un minimum à ton code pendant que tu le tapais, tu te serais rendu compte que strlen("toto") renvoie 4 alors que "toto" prend 5 octets en mémoire !!!

    Accessoirement, je sens ce code super pas propre. Du malloc non vérifié, de la variable globale (table_symboles)... bref cette erreur ci va être vite résolue mais à terme...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    salut merci pour votre réponse !!
    c'est vrai ce code n'est pas si propre je promet de le nétoyer dés que j'ai fini
    alors pour le malloc je dois juste multiplier le tous par 100 environ pour étre sur de ne pas depasser la capacité de p->entite.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p->entite= (char*)malloc(sizeof(char)*strlen(entite)*100);
    comme ceci ??

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lucastof Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p->entite= (char*)malloc(sizeof(char)*strlen(entite)*100);
    comme ceci ??
    Ouais. Mais pour être sûr, moi je multiplierais par 10000 !!!

    Laisse-moi deviner... tu ne bosserais pas chez Micro$oft ???

    Sans déconner, est-ce que tu connais les bases ??? Sais-tu comment sont stockées les chaines de caractères ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Microsoft!! ben non tu vois je ne sais méme pas utiliser strcpy() et strlen() enfin je debute tu vois et lorsque j'essaye d'en apprendre un peut je tombe sur toi qui a ce que je vois t'es encient sur le forum dailleur je ne comprend pas comment t arrivé a Expert Confirmé Sénior vu qu'au lieu d'aider des futures conféres au contraire tu te la joue devant eux !!
    en tous cas c'est la premiere fois que ça m'arrive sur ce forum, je sais qu'il y a des personnes qui m'aiderrons au lieu de se comporter comme toi !! merci quand méme !!

  7. #7
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Tu as aussi une fonction qui s'appelle strdup qui fait ce que tu veux...

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lucastof Voir le message
    c'est vrai ce code n'est pas si propre je promet de le nétoyer dés que j'ai fini
    Non. Il faut faire du code propre dés le début. C'est galère après de retoucher la structure pour rajouter par exemple des contrôles d'erreur, tu risques de modifier par erreur quelque chose qui marchait et tout casser. En plus, si ton code est propre, ta phase de débugage n'en sera que plus courte et plus simple. Tu t'exposes à ca :
    Citation Envoyé par Sve@r
    bref cette erreur ci va être vite résolue mais à terme...
    Il a raison. Même si tu n'es pas content


    Citation Envoyé par lucastof Voir le message
    alors pour le malloc je dois juste multiplier le tous par 100 environ pour étre sur de ne pas depasser la capacité de p->entite.
    Le problème la dedans, c'est le environ. La zone qui t'es allouée n'a pas une taille d'environ X octets, mais bien de X octets. Pas un de plus, pas un de moins.

    Citation Envoyé par lucastof Voir le message
    Microsoft!! ben non tu vois je ne sais méme pas utiliser strcpy() et strlen() enfin je debute tu vois et lorsque j'essaye d'en apprendre un peut je tombe sur toi qui a ce que je vois t'es encient sur le forum dailleur je ne comprend pas comment t arrivé a Expert Confirmé Sénior vu qu'au lieu d'aider des futures conféres au contraire tu te la joue devant eux !!
    en tous cas c'est la premiere fois que ça m'arrive sur ce forum, je sais qu'il y a des personnes qui m'aiderrons au lieu de se comporter comme toi !! merci quand méme !!
    J'espère que ton niveau en C est meilleur que ton niveau en orthographe. Cela ne sert à rien de s'énerver et "d'insulter" quelqu'un qui t'aide. Sauf si tu ne veux plus d'aide. Si Sve@r t'a vexé, tu peux lui dire mais reste zen.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lucastof Voir le message
    Microsoft!! ben non tu vois je ne sais méme pas utiliser strcpy() et strlen() enfin je debute tu vois et lorsque j'essaye d'en apprendre un peut je tombe sur toi qui a ce que je vois t'es encient sur le forum dailleur je ne comprend pas comment t arrivé a Expert Confirmé Sénior vu qu'au lieu d'aider des futures conféres au contraire tu te la joue devant eux !!
    Parce que mes futurs "confrères" ne viennent pas poster un code de niveau confirmé quand ils sont débutants en disant en plus "voilà la fonction que j'ai créée (tout en donnant l'impression qu'elle est issue d'un grand projet). Si vraiment ils veulent apprendre les bases ils viennent en disant "voilà je débute j'aimerais comprendre comment fonctionne telle ou telle notion". Et toi tu arrives sans donner ton niveau, tu nous montres un code qui est un code de confirmé (parce que les listes chainées ça ne se fait pas en 2 jours de C) et ensuite tu poses des questions de niais. Alors que doit-on penser ???

    Citation Envoyé par lucastof Voir le message
    en tous cas c'est la premiere fois que ça m'arrive sur ce forum, je sais qu'il y a des personnes qui m'aiderrons au lieu de se comporter comme toi !! merci quand méme !!
    Comme d'autres (surtout Bktero) te l'ont dit, je t'ai aidé. Notamment en te disant que "toto" prenait 5 octets en mémoire lorsque strlen("toto") renvoyait 4. N'importe qui d'un peu "logique" et intuitif et en aurait déduit qu'il suffit d'ajouter 1 à la valeur renvoyée par strlen(). Au pire, si vraiment il s'intéresse, il aurait cherché un peu sur les chaines en C. Alors quand je te vois raconter "je vais multiplier par 100" j'ai réellement l'impression que tu te fous un peu de nous (ou de ton travail ce qui, pour nous, revient au même). Donc bref je t'ai traité comme je t'ai ressenti...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    bon je m'excuse si j'ai dis quelque chose de mal, mais il faut me comprendre je suis sous une pression enorme et ce probléme persiste!!
    je ne suis qu' un étudiant c'est a dire un charognard de bonnes notes
    de nos jours les études nous éloigne de esprit de recherche
    j'attends avec impatience le jour ou je terminerais mes études ce jour la je pourrais m'auto former !!
    je suis vraiment désolé pour tous effectivement vous m'avez aidé et a cause de la pression qui est sur moi je n'est pas su le voir !!
    désolé !!

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Sans être méchant ni quoi que ce soit, mais tu risques d'avoir mal quand tu arriveras en entreprise ^^ Profite d'être étudiant et d'avoir des profs et le temps à consacrer à ça pour comprendre. Quand tu seras en entreprise, tu auras les deadlines des projets, tu seras confronter bien souvent à des technologies que tu ne connais pas ou peu, donc ton autoformation ira au vital, au nécessaire immédiatement car il y aura de la pression sur tes épaules. Le temps de comprendre les choses et de développer ton intelligence de programmeur, c'est maintenant

    Pour rebondir sur ce que dit Sve@r (qui n'y va pas par 4 chemins ), il est vrai que tu fais des trucs compliqués (listes chainées + allocation dynamique) alors que certaines de tes notions de bases semblent mal assises. Réviser les bases, c'est toujours bon.

    je suis vraiment désolé pour tous effectivement vous m'avez aidé et a cause de la pression qui est sur moi je n'est pas su le voir !!
    désolé !!

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lucastof Voir le message
    bon je m'excuse si j'ai dis quelque chose de mal, mais il faut me comprendre je suis sous une pression enorme et ce probléme persiste!!
    je ne suis qu' un étudiant c'est a dire un charognard de bonnes notes
    de nos jours les études nous éloigne de esprit de recherche
    j'attends avec impatience le jour ou je terminerais mes études ce jour la je pourrais m'auto former !!
    je suis vraiment désolé pour tous effectivement vous m'avez aidé et a cause de la pression qui est sur moi je n'est pas su le voir !!
    désolé !!
    Et ben voilà, on va repartir sur de meilleurs bases.

    Donc en fait, lorsque le C doit travailler sur une chaine de caractères, il ne prend en compte que l'adresse du premier caractère de la chaine. Donc si le "t" de "toto" est stocké à l'adresse "1000", tu n'as en main que cette valeur "1000". Mais de 1000 tu peux passer à 1001 pour récupérer le "o" puis à 1002 pour l'autre "t" et etc.
    Toutefois, comme le C ne sait rien de la chaine (même pas sa taille), celle-ci embarque une valeur spécifique qui est le '\0' (valeur 0 ascii) afin que tu saches où t'arrêter (pour éviter de partir de 1000 et de monter jusqu'à 9825). Mais cette valeur il faut la stocker. C'est pour ça qu'une chaine de x caractères a besoin de x+1 octets.
    Ensuite toute opération sur les chaines (affichage, copie, comptage) se fera à partir de son début et en la balayant jusqu'à ce fameux '\0'. Toutefois, ce genre d'opération a déjà été codé dans différentes fonctions "strxxx()". Chacune de ces fonction recevant une adresse considèrera qu'il s'agit de l'adresse d'une chaine et la remontera en cherchant ce fameux '\0'. Donc vaut mieux qu'il y soit. Et chaque fonction écrivant une chaine se chargera d'écrire le '\0'. Ton seul travail est de t'assurer qu'il y a la place.
    Or strlen() te renvoie la longueur visible de la chaine. Il s'ensuit que si tu veux stocker une chaine en ne connaissant que sa longueur visible, il te faudra toi-même prévoir le +1

    Code c : 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
    void insert(char *entite, char *type){
        liste p= recherche(entite);
        /* creation d'un noeud */
        if (p == NULL) {
            p = (liste) malloc(sizeof(elem));
            p->entite= (char*)malloc((strlen(entite) + 1) * sizeof(char));
            strcpy(p->entite,entite);
            p->type=type;
            p->ligneA=nbrligne;
            p->svt=NULL;
    
            /* insertion du noeud en tête de liste (LIFO) */
            p->svt = table_symboles;
            table_symboles = p;
        }
    }

    Citation Envoyé par lucastof Voir le message
    et ce probléme persiste!!
    Comme tu le vois, j'ai réécrit ta fonction en corrigeant le problème malloc+strcpy(). Mais en la réécrivant et en l'indentant correctement, je vois que tout le travail se fait si p (renvoyé par recherche()) est NULL. Et que se passe-t-il s'il ne l'est pas ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    enfaite c'est une insertion dans la table des symboles donc si p est différent de NULL c'est qu'il existe donc il ne sera pas inséré .

  14. #14
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    voici le code bison ou je fais appel a la fonction insert
    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
    %{
    #include <stdio.h>
     #include <string.h>
     #include <stdlib.h>
    %}
    %token IF
    %token ELSE
    %token CODE
    %token START
    %token IDF
    %token END
    %token INT
    %token REAL
    %token BOOLEAN
    %token CHAR
    %token STRING
    %token CONST
    %token WHILE 
    %token EXECUTE
    %token WHENE
    %token DO
    %token OTHERWISE
    %token AFFECT
    %token EGAL
    %token DIFF
    %token POINTVERGULE
    %token VERGULE
    %token POINT
    %token CONSTE
     
    %token CONSTR
     
    %token COMS
    %token SOM
    %token SOUS
    %token MUL
    %token DIV
    %%
    PGME:CODE IDF partie_principal END POINT  {printf("Fin de compilation !!enjoy!!\n");};
    partie_principal:partie_declaration START PARTIEINST  ;
    type:INT|BOOLEAN|CHAR|STRING|REAL ;
    partie_declaration:type IDF B A{insert($2,$1);}|CONST IDF EGAL CONSTANTE A{insert($2,$1);} | ;
    B:C IDF B|;
    C:VERGULE;
    CONSTANTE :CONSTE|CONSTR ;
    PARTIEINST: IDF AFFECT expression A |WHENE cond EXECUTE inst A|WHENE cond DO PARTIEINST OTHERWISE PARTIEINST|IF cond inst ELSE cond inst A ;
    expression :IDF|IDF SOM IDF|IDF SOUS IDF|IDF MUL IDF|IDF DIV IDF ;
    A :POINTVERGULE ;
    cond:IDF EGAL IDF|IDF DIFF IDF |IDF  EGAL CONSTANTE |IDF DIFF CONSTANTE   ;
    inst:PARTIEINST ;
    %%
    int main (void) {
    yyparse ();
    afficherts();
    return 0 ;
    }
    je veux récupérer l'IDF a la ligne 42 et le mettre dans la liste .

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lucastof Voir le message
    enfaite c'est une insertion dans la table des symboles donc si p est différent de NULL c'est qu'il existe donc il ne sera pas inséré .
    Ok - Donc on va montrer à ceux qui lisent notre code qu'on sait exactement ce qu'on fait. Accessoirement, on va mettre p en variable locale car ça ne sert à rien de le mettre en globale.

    Code c : 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
    void insert(char *entite, char *type){
        liste p;
     
        /* Si l'élément existe déjà alors on ne fait rien */
        if (recherche(entite) != NULL) return;
     
        /* creation d'un noeud */
        p = (liste) malloc(sizeof(elem));
        p->entite= (char*)malloc((strlen(entite) + 1) * sizeof(char));
        strcpy(p->entite,entite);
        p->type=type;
        p->ligneA=nbrligne;
        p->svt=NULL;    /* Instruction inutile vu qu'il est modifié 2 lignes plus bas */
     
        /* insertion du noeud en tête de liste (LIFO) */
        p->svt = table_symboles;
        table_symboles = p;
    }

    Ce n'est pas très puriste mais (avis purement perso) je trouve ce genre de syntaxe plus claire.


    Citation Envoyé par lucastof Voir le message
    voici le code bison ou je fais appel a la fonction insert
    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
    %{
    #include <stdio.h>
     #include <string.h>
     #include <stdlib.h>
    %}
    %token IF
    %token ELSE
    %token CODE
    %token START
    %token IDF
    %token END
    %token INT
    %token REAL
    %token BOOLEAN
    %token CHAR
    %token STRING
    %token CONST
    %token WHILE 
    %token EXECUTE
    %token WHENE
    %token DO
    %token OTHERWISE
    %token AFFECT
    %token EGAL
    %token DIFF
    %token POINTVERGULE
    %token VERGULE
    %token POINT
    %token CONSTE
     
    %token CONSTR
     
    %token COMS
    %token SOM
    %token SOUS
    %token MUL
    %token DIV
    %%
    PGME:CODE IDF partie_principal END POINT  {printf("Fin de compilation !!enjoy!!\n");};
    partie_principal:partie_declaration START PARTIEINST  ;
    type:INT|BOOLEAN|CHAR|STRING|REAL ;
    partie_declaration:type IDF B A{insert($2,$1);}|CONST IDF EGAL CONSTANTE A{insert($2,$1);} | ;
    B:C IDF B|;
    C:VERGULE;
    CONSTANTE :CONSTE|CONSTR ;
    PARTIEINST: IDF AFFECT expression A |WHENE cond EXECUTE inst A|WHENE cond DO PARTIEINST OTHERWISE PARTIEINST|IF cond inst ELSE cond inst A ;
    expression :IDF|IDF SOM IDF|IDF SOUS IDF|IDF MUL IDF|IDF DIV IDF ;
    A :POINTVERGULE ;
    cond:IDF EGAL IDF|IDF DIFF IDF |IDF  EGAL CONSTANTE |IDF DIFF CONSTANTE   ;
    inst:PARTIEINST ;
    %%
    int main (void) {
    yyparse ();
    afficherts();
    return 0 ;
    }
    je veux récupérer l'IDF a la ligne 42 et le mettre dans la liste .
    Désolé je ne connais pas bison. Mais que peux-tu me dire sur "table_symboles" qui récupère le pointeur en fin de fonction ??? A-t-il bien été initialisé à NULL au tout début du programme ???

    J'aimerais bien aussi que tu me parles de "type" qui est un pointeur que tu recopies tel quel. Qu'est-il sensé contenir ??? Une chaine de caractères ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  16. #16
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    bonjour !
    voici le code de la structure table_symboles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct elem * liste;
     
    typedef struct elem{
     char *entite;
     char *type;
     int ligneA; 
     liste svt;
    }elem;
     
    liste table_symboles = NULL;
    elle est bien initialisée a NULL

    en ce qui concerne le type c'est une chaine de caractére
    c'est le méme probléme donc le compilateur n'arrive pas a ce niveau l'erreure de segmentation surgit lorsque je veux récupérer la valeure et l'insérer dans la table .

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lucastof Voir le message
    en ce qui concerne le type c'est une chaine de caractére
    Donc entite est une chaine de caractères. Pour laquelle tu as développé tout un mécanisme de malloc() et de strcpy() pour pouvoir la copier là où il faut. Et type qui est aussi une chaine de caractères lui il n'a droit qu'à un bête "=" ???
    C'est quand-même pas compliqué de réfléchir et se dire "voyons, si pour un truc X je fais un travail T, alors pour un autre truc X analogue je dois forcément faire un travail T similaire" !!!

    Citation Envoyé par lucastof Voir le message
    bonjour !
    voici le code de la structure table_symboles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct elem * liste;
     
    typedef struct elem{
     char *entite;
     char *type;
     int ligneA; 
     liste svt;
    }elem;
     
    liste table_symboles = NULL;
    C'est une super mauvaise idée que de masquer les étoiles derrière un typedef. Parce que
    1) celui qui lit ton code ne sait pas forcément de quoi il s'agit (même s'il s'en doute)
    2) même masquée, l'étoile existe quand-même et a un effet. Mais si tu ne la vois plus, tu peux perdre le fil et avoir du mal à utiliser ton élément correctement
    3) c'est quand-même pas dur à manipuler
    Et en plus, ici, "elem" est un type complet alors que "liste" est un pointeur sur elem. Même la phonie des noms ne suit pas l'idée de ce que c'est (un peu comme si tu nommais un compteur de lignes "date_naissance"). Faut suivre après ça !!!

    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
    typedef struct s_elem{
     char *entite;
     char *type;
     int ligneA; 
     struct s_elem *svt;
    } t_elem;
     
    t_elem *liste = NULL;
     
    void insert(char *entite, char *type){
        t_elem *p;
     
        /* Si l'élément existe déjà alors on ne fait rien */
        if (recherche(entite) != NULL) return;
     
        /* creation d'un noeud */
        p = (t_elem*) malloc(sizeof(t_elem));
        p->entite= (char*)malloc((strlen(entite) + 1) * sizeof(char));
        strcpy(p->entite, entite);
        p->type= (char*)malloc((strlen(type) + 1) * sizeof(char));
        strcpy(p->type, type);
        p->ligneA=nbrligne;
        p->svt=NULL;    /* Instruction inutile vu qu'il est modifié 2 lignes plus bas */
     
        /* insertion du noeud en tête de liste (LIFO) */
        p->svt = liste;
        liste = p;
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  18. #18
    Membre expérimenté

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Parce que mes futurs "confrères" ne viennent pas poster un code de niveau confirmé quand ils sont débutants en disant en plus "voilà la fonction que j'ai créée (tout en donnant l'impression qu'elle est issue d'un grand projet). Si vraiment ils veulent apprendre les bases ils viennent en disant "voilà je débute j'aimerais comprendre comment fonctionne telle ou telle notion". Et toi tu arrives sans donner ton niveau, tu nous montres un code qui est un code de confirmé (parce que les listes chainées ça ne se fait pas en 2 jours de C) et ensuite tu poses des questions de niais. Alors que doit-on penser ???


    Comme d'autres (surtout Bktero) te l'ont dit, je t'ai aidé. Notamment en te disant que "toto" prenait 5 octets en mémoire lorsque strlen("toto") renvoyait 4. N'importe qui d'un peu "logique" et intuitif et en aurait déduit qu'il suffit d'ajouter 1 à la valeur renvoyée par strlen(). Au pire, si vraiment il s'intéresse, il aurait cherché un peu sur les chaines en C. Alors quand je te vois raconter "je vais multiplier par 100" j'ai réellement l'impression que tu te fous un peu de nous (ou de ton travail ce qui, pour nous, revient au même). Donc bref je t'ai traité comme je t'ai ressenti...

    Juste comme ça, je pouvais pas ne pas réagir, mais jusqu'à ce message, c'est quand même du grand n'importe quoi.

    Du niveau confirmé ? les listes chainées t'as vu ça en dernière année de licence toi? en master ?

    "voilà la fonction que j'ai créée (tout en donnant l'impression qu'elle est issue d'un grand projet)"...non mais t'as fumé avant d'écrire ou quoi ? parce que l'un des premiers symptômes de la fumette c'est la paranoïa... Bon perso je vois comment tu en déduit de telles sornettes, mais comme le dit "bktero" faut rester zen...


    Et toi tu arrives sans donner ton niveau... il vient de poster dans la section débuter........ comment dire .... N'importe qui d'un peu "logique" et intuitif et en aurait déduit qu'il se considère débutant sur ce topic...


    Alors que doit-on penser ??? Qu'un prof leur a filé ce code à comprendre, ou que sais-je encore... Et puis franchement, il vient pas ici demander un code tout prêt en réponse à un exercice comme ça arrive si souvent. Alors pourquoi s'emmerder à chercher des réponses à des questions inutiles ? Il a clairement besoin de comprendre des notions de base, alors aide le directement comme tu l'a fais après au lieu de commencer par le traiter comme de la merde.

    Et le réflexe de se creuser la tête jusqu'à la mort pour aller chercher la réponse soi-même plutôt que d'aller directement la chercher dans la tête d'un autre, ça s'apprend. C'est clair que c'est un réflexe à avoir, mais il faut du temps, pour des gens qui sortent fraichement d'un système éducatif qui les incite à poser des questions à des gens qui savent...


    BON J'AI FINI.... je sais ce que ce topic va provoquer mais bon... rien à foutre je poste....*clique sur Envoyer la réponse*

    J'ai dit ce que je pensais : allez-y, lynchez moi
    Nullius in verba

  19. #19
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Kaamui Voir le message
    Du niveau confirmé ? les listes chainées t'as vu ça en dernière année de licence toi? en master ?
    Ouais t'as raison "niveau confirmé" signifie "licence ou master". Non non, tu n'es pas du genre à déformer les propos des gens toi !!!

    Citation Envoyé par Kaamui Voir le message
    Il a clairement besoin de comprendre des notions de base,
    Ben non, je ne vois pas "clairement" ceci dans son premier post. Mais peut-être pourras-tu pallier à mon incapacité à voir ce qui est "clair" pour toi en me citant la ou les phrases de son post qui te font donner cette affirmation...

    Citation Envoyé par Kaamui Voir le message
    alors aide le directement comme tu l'a fais après
    Parce que expliquer que strlen("toto")=4 quand sizeof("toto")=5 suite à sa question sur strcpy() ce n'est pas "aider directement" ?

    Citation Envoyé par Kaamui Voir le message
    au lieu de commencer par le traiter comme de la merde.
    Non, ça c'est au second post suite à sa réponse ahurissante. Or "second" ne signifie pas "commencer" (enfin pour moi mais peut-être que tu as une autre définition du verbe "commencer" dans ta tête)...

    Citation Envoyé par Kaamui Voir le message
    Et le réflexe de se creuser la tête jusqu'à la mort pour aller chercher la réponse soi-même plutôt que d'aller directement la chercher dans la tête d'un autre, ça s'apprend. C'est clair que c'est un réflexe à avoir, mais il faut du temps, pour des gens qui sortent fraichement d'un système éducatif qui les incite à poser des questions à des gens qui savent...
    Donc tu présumes de ce qu'il est et d'où il sort. Tu en as le droit bien entendu... mais j'ai moi aussi le droit de présumer qu'un type qui arrive avec du bison + listes chainées c'est quelqu'un d'un peu habitué (moi m'a fallu un peu de temps pour comprendre et utiliser yacc)...

    PS: le "jusqu'à la mort" est de trop car j'ai dit "il aurait cherché un peu sur les chaines en C". Non non, tu n'es pas du genre à déformer les propos des autres toi (2x)

    Citation Envoyé par Kaamui Voir le message
    BON J'AI FINI.... je sais ce que ce topic va provoquer mais bon... rien à foutre je poste....*clique sur Envoyer la réponse*

    J'ai dit ce que je pensais : allez-y, lynchez moi
    Mouais, tu m'as l'air d'aimer polémiquer pour le plaisir...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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