Pile en C problème de segmentation;
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

Pile en C problème de segmentation;



  1. #1
    vlad59134

    Pile en C problème de segmentation;


    ------

    Bonsoir à vous les gros geeks , je dois réaliser un code me permettant d'inverser une chaîne de caractères en c:

    Code:
    #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct el* pil; // struct el* = definition pointeur sur el ; pil=nom
    
    typedef struct el{
    char val;
    pil next; //pointe vers valeur de tel
    }tel;
    
    pil creelem(char val){
        pil aux;
        aux=(pil) malloc(sizeof(tel));
        aux->val=val;
        aux->next=NULL;
        return aux;
    }
    
    pil empiler(pil p, char val){
    	pil aux=creelem(val);
    	aux->next=p;
    	p=aux;
    	return p;
    }
    
    pil depiler(pil p, char *pv ){
    	pil aux;
    	aux=p;
    	printf("1\n");
    	if(p=NULL){
    	printf("pile vide\n");
    	exit(1);
    	}else{
    	printf("2\n");
    	p=p->next;
    	printf("3\n");
    	*pv=aux->val;
    	printf("4\n");
    	free(aux);
    	return p;
    	}
    	}
    
    
    
    void main(){
        char s[200];
        char t[200];
        int n=0;
        pil p=NULL;
        short int i=0;
        char a;
        printf("Bonjour,Votre mot à inverser:\n");
        gets(s);
        while(s[i]!='\0'){
           empiler(p,s[i]);
           i++;
           n=i;
           }
    	printf("on va depiler\n");
    	for(i=0;i<n;i++){
            
    	
        	p=depiler(p,&a);
            t[i]=a;
            }
            for(i=0;i<n;i++){
    	printf("%c",t[i]);
    	}    	
    
    }
    Pitié, pensez aux balises code !!!

    Bonjour,Votre mot � inverser:
    futurasciences
    on va depiler
    1
    2
    Erreur de segmentation

    J'ai mis des "balises" dans la fonction dépiler pour vous montrer ou mon programme foire!
    Pourriez vous m'aider SVP? (je ne cherche pas à avoir un programme particulièrement optimisé mais plutôt fonctionnel)

    -----
    Dernière modification par Jack ; 24/03/2011 à 22h26.

  2. #2
    invite025015c2

    Re : Pile en C problème de segmentation;

    Alors, c'est trop compliquer ce que tu fais.
    Je te montre une fonction que j'ai faite justement pour retourner une chaine (pas tester la fonction, je le recode de tête):

    Code:
    char	*revstr(char *str)
    {
    	char *rev = malloc(sizeof(char) * strlen(str));
    	for (i = strlen(str), y = 0; i >= 0; i--, y++)
    		rev[y] = str[i];
    	return (rev);
    }

  3. #3
    bzh_nicolas

    Re : Pile en C problème de segmentation;

    Citation Envoyé par vlad59134 Voir le message
    Bonsoir à vous les gros geeks
    Pas sur que tu auras beaucoup d'aide en commençant comme ça, bref...
    C'est demander dans ton exo la prise de tête avec les listes ? Parce qu'il y a beaucoup plus simple pour inverser une chaine...

  4. #4
    invite025015c2

    Re : Pile en C problème de segmentation;

    Citation Envoyé par bzh_nicolas Voir le message
    Pas sur que tu auras beaucoup d'aide en commençant comme ça, bref...
    C'est demander dans ton exo la prise de tête avec les listes ? Parce qu'il y a beaucoup plus simple pour inverser une chaine...
    J’hésitais a le dire mais bon, je suis dans un soir de gentillesse

  5. A voir en vidéo sur Futura
  6. #5
    vlad59134

    Re : Pile en C problème de segmentation;

    Citation:Envoyé par bzh_nicolas
    Pas sur que tu auras beaucoup d'aide en commençant comme ça, bref...
    C'est demander dans ton exo la prise de tête avec les listes ? Parce qu'il y a beaucoup plus simple pour inverser une chaine...

    J’hésitais a le dire mais bon, je suis dans un soir de gentillesse
    Hier 21h37
    Ahah, j'avais envie de vous provoquer un peu pour rire. Désolé si ça vous à vexé!

    Bref, merci pour vos réponses mais le programme que je dois réaliser (pour aujourd'hui ) doit avoir cette forme.
    Je ne peux donc pas utiliser la fonction ennoncée plus haut.
    Je pense petre pas loin de la vérité. C'est la fonction depiler qui fait tout sauter

    Code:
    pil depiler(pil p, char *pv ){
    	pil aux;
    	aux=p;
    	printf("1\n");
    	if(p=NULL){
    	printf("pile vide\n");
    	exit(1);
    	}else{
    	printf("2\n");
    	p=p->next;
    	printf("3\n");
    	*pv=aux->val;
    	printf("4\n");
    	free(aux);
    	return p;
    	}
    	}
    Voilà un message en bonnet difforme.

  7. #6
    whoami

    Re : Pile en C problème de segmentation;

    Bonjour,

    Déjà dit et re-dit : retour aux bases, papier + crayon.

    Tu dessines quelques cases pour le cellules, des flèches pour représenter les pointeurs cellule vers cellule, et tu regardes ce qu'il faut faire pour en ajouter ou supprimer une.

    Et au passage, vérifie que lorsque tu fais un test, c'est bien un test que tu as programmé, et non une affectation.

  8. #7
    invite025015c2

    Re : Pile en C problème de segmentation;

    le probleme viens plutot de "empiler" lors du
    Code:
    aux->next=p;
    Si tu bosse sur Unix/Linux, je te conseil d'utiliser GDB ou valgrind pour voir d'ou viens l'erreur.

  9. #8
    doul11

    Re : Pile en C problème de segmentation;

    Bonjour,

    T'as pas des nom de variables très explicites ...
    La logique est une méthode systématique d’arriver en confiance à la mauvaise conclusion.

  10. #9
    Jack
    Modérateur

    Re : Pile en C problème de segmentation;

    Et au passage, vérifie que lorsque tu fais un test, c'est bien un test que tu as programmé, et non une affectation.
    +1

    Bien vu.

    le probleme viens plutot de "empiler" lors du

    Code:

    aux->next=p;
    pourquoi? Visiblement l'empilage se fait en tête de liste.

    A+

  11. #10
    Garlik

    Re : Pile en C problème de segmentation;

    if(p=NULL){
    Ca c'est un test dans lequel on fait AUSSI une affectation; ca retourne toujours 0. p est alors un pointeur NULL après cela, d'ou le probleme lorsqu'on fait ensuite p=p->next;

  12. #11
    Jack
    Modérateur

    Re : Pile en C problème de segmentation;

    Citation Envoyé par Garlik Voir le message
    Ca c'est un test dans lequel on fait AUSSI une affectation; ca retourne toujours 0. p est alors un pointeur NULL après cela, d'ou le probleme lorsqu'on fait ensuite p=p->next;
    Explique-moi alors la différence entre
    p = NULL et
    if (p=NULL)
    parce je ne vois pas l'intérêt de faire un if sur une expression toujours fausse.

    A+

  13. #12
    Garlik

    Re : Pile en C problème de segmentation;

    Aucun intérêt; ca s'appelle une erreur de programmation et ca mène tout droit à un plantage. Je suppose qu'il voulait faire un "if (p==NULL)"...

  14. #13
    Jack
    Modérateur

    Re : Pile en C problème de segmentation;

    Citation Envoyé par Garlik Voir le message
    Aucun intérêt; ca s'appelle une erreur de programmation et ca mène tout droit à un plantage. Je suppose qu'il voulait faire un "if (p==NULL)"...
    on est d'accord. Mais apparemment vlad59134 ne semble plus vraiment concerné ...

    A+

  15. #14
    vlad59134

    Re : Pile en C problème de segmentation;

    Si j'avais trouvé qques heures après.
    Bien sûr le test et faux, de plus quand j'appelais la fonction empiler dans le main, je ne la stockais pas dans une pile pour le retour.

    Je vous remercie.

Discussions similaires

  1. [Divers] Segmentation spirale
    Par mikeuline dans le forum Biologie
    Réponses: 0
    Dernier message: 07/10/2009, 18h52
  2. [Physiologie] Segmentation digestive ??
    Par inviteee0acec6 dans le forum Biologie
    Réponses: 2
    Dernier message: 30/04/2009, 19h35
  3. [Divers] Segmentation
    Par invitec44e9f82 dans le forum Biologie
    Réponses: 1
    Dernier message: 06/03/2009, 15h18
  4. probleme de "segmentation fault" (langage C)
    Par invitea0f03ccc dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 27/01/2009, 14h41
  5. J'ai un problème avec un segmentation fault
    Par gatsu dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 30/01/2007, 08h08