Pointeur null

lamita20 Messages postés 6 Date d'inscription lundi 30 novembre 2009 Statut Membre Dernière intervention 30 décembre 2010 - 28 déc. 2010 à 08:52
lamita20 Messages postés 6 Date d'inscription lundi 30 novembre 2009 Statut Membre Dernière intervention 30 décembre 2010 - 30 déc. 2010 à 17:13
Bonjour,
j'ai un problème au niveau de ma fonction, lorsque j'essayed'afficher le contenu de la liste elle me retourne null, j'ai pas compris quel est le problème.


void *extraire_f(FILE * f, char * chaine){
 
    char buffer[BUFSIZ];
    char *result = NULL; 
    int rang = 0;
    char * pf;
    liste_f tete = NULL;
 
    do{
   
        fflush(0);
        fseek(f,(rang-1)*sizeof(char *),SEEK_SET);
        fgets(buffer,sizeof(buffer),f);
        result=memchr(buffer,' ',strlen(buffer));
        pf = result;
        tete = ins_fin_f(tete, pf);
        printf("le fait est : %s\n",pf);
 
    }while((strcspn(buffer,chaine) != 0)  && (!feof(f)));
    return tete;
} 

12 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
28 déc. 2010 à 09:43
Hello,
Tu as un problème avec ta variable rang à mon avis:
tu l'init à 0, tu fais donc un fseek(f,-1,...), et tu ne l'incrémentes pas
Après, je n'ai pas regardé en détail...
Une remarque, prend l'habitude, quand tu travailles avec des char* d'utiliser les fonctions strXXX plutôt que memXXX
@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
28 déc. 2010 à 09:44
En passant, tu ferais mieux de poster dans la partie C++ plutôt que dans le Bar.
Je demande aux admins de déplacer ta demande.

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
0
lamita20 Messages postés 6 Date d'inscription lundi 30 novembre 2009 Statut Membre Dernière intervention 30 décembre 2010
30 déc. 2010 à 11:28
Merci pour la réponse et désolé pour le retard de réponse
j'ai pas de problème avec le fseek et le rang car en affichant le fait elle me donne ce que j'ai besoin mais en recupérant le pointeur tete pour afficher le contenu de la liste j'ai la valeur null.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
30 déc. 2010 à 11:30
Fais voir ta fonction ins_fin_f() ?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lamita20 Messages postés 6 Date d'inscription lundi 30 novembre 2009 Statut Membre Dernière intervention 30 décembre 2010
30 déc. 2010 à 11:35
c'est la fct ins_fin_f qui permet l'insertion à la fin d'une liste
void *ins_fin_f(liste_f tete,char * p)
{
liste_f ptr = tete;
liste_f nouv;

nouv = (liste_f) malloc(sizeof(liste_f));
if (nouv != NULL){
nouv->fait = p;
nouv->suiv= NULL;
}else printf("erreur");
if (tete == NULL)
tete = nouv;
else {
while (ptr->suiv != NULL){
ptr = ptr->suiv;
}
ptr->suiv = nouv;
}
return tete;

}
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
30 déc. 2010 à 11:47
nouv = (liste_f) malloc(sizeof(liste_f));

Si je comprends bien, liste_f est un typedef d'un pointeur. Or, tu le passes en paramètre du malloc. Tu réserves donc de la place pour un pointeur et non un élément de ta liste

nouv->fait = p;

Si tu veux faire une copie de chaine de caractères, il faut utiliser strcpy()

if (tete == NULL)

Attention! Ici, tu peux très bien avoir nouv qui vaut NULL. Je te conseille de mettre ce code dans la 1ère instruction de ton if

return tete;

Je vois pas pourquoi tu retournes tete à chaque fois. A priori, il ne change pas...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
30 déc. 2010 à 11:55
Voici quelques corrections (attention, je n'ai pas testé)
void *ins_fin_f(liste_f tete,char * p) 
{ 
    liste_f ptr = tete; 
    liste_f nouv; 
    
    nouv = (liste_f) malloc(sizeof(liste_f)); 
    if (nouv != NULL)
    { 
      nouv->fait = (char*)malloc(strlen(p));
      strcpy(nouv->fait, p);

      nouv->suiv= NULL; 
      
      if (tete == NULL) 
          tete = nouv; 
      else
      { 
          while (ptr->suiv != NULL)
          { 
              ptr = ptr->suiv; 
          } 
          ptr->suiv = nouv; 
      } 
    }
    else
     printf("erreur"); 

    return tete; 
}



@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
0
lamita20 Messages postés 6 Date d'inscription lundi 30 novembre 2009 Statut Membre Dernière intervention 30 décembre 2010
30 déc. 2010 à 12:36
J'ai pas compris l'utilité de "nouv->fait = (char*)malloc(strlen(p));"
déja il m'affiche erreur de segmentation lorsque je l'ajoute à mon code.
En fait mon structure est:
struct element1{
char * fait;
struct element1 *suiv;
};
typedef struct element1 *liste_f;
donc il suffit d'allouer de l'espace pour la structure pour enregistrer le fait.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
30 déc. 2010 à 14:19
Non. Quand tu alloues la mémoire pour ta structure, tu réserve 4 octets pour un pointeur de caractères. Or, ta chaine en fait plus je pense...
L'erreur de seg vient du fait que j'ai oublié le caractère terminal
nouv->fait = (char*)malloc(strlen(p)+1);

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
0
lamita20 Messages postés 6 Date d'inscription lundi 30 novembre 2009 Statut Membre Dernière intervention 30 décembre 2010
30 déc. 2010 à 15:26
ça pas marché j'ai le même erreur.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
30 déc. 2010 à 16:07
Je sais pas trop ce que tu veux faire en fait...
Je te montre le code que j'ai fait, qui tourne sans erreur
#include <stdio.h>

struct element1{ 
       char * fait; 
       struct element1 *suiv; 
}; 
typedef struct element1 *liste_f;

void *ins_fin_f(liste_f tete,char * p) 
{ 
    liste_f ptr = tete; 
    liste_f nouv; 
    
    nouv = (liste_f) malloc(sizeof(struct element1)); 
    if (nouv != NULL)
    { 
      nouv->fait = (char*)malloc(strlen(p)+1);
      strcpy(nouv->fait, p);

      nouv->suiv= NULL; 
      
      if (tete == NULL) 
          tete = nouv; 
      else
      { 
          while (ptr->suiv != NULL)
          { 
              ptr = ptr->suiv; 
          } 
          ptr->suiv = nouv; 
      } 
    }
    else
     printf("erreur"); 

    return tete; 
}

void *extraire_f(FILE * f, char * chaine){
 
    char buffer[BUFSIZ];
    char *result = NULL; 
    int rang = 0;
    char * pf;
    liste_f tete = NULL;
 
    do{
        fflush(0);
        fseek(f,(rang-1)*sizeof(char *),SEEK_SET);
        fgets(buffer,sizeof(buffer),f);
        result=memchr(buffer,' ',strlen(buffer));
        pf = result;
        tete = ins_fin_f(tete, pf);
        printf("le fait est : %s\n",pf);
 
    }while((strcspn(buffer,chaine) != 0)  && (!feof(f)));
    return tete;
} 

int main()
{
 FILE* f=fopen("test.txt","r");
 extraire_f(f,"121345");
 return 0;    
}


Dans mon fichier test.txt, j'ai ça:
coucou hello waza hi5

Je remarque que la boucle n'est exécuté qu'une fois: en effet, le buffer récupérant tout mon fichier, la condition strcspn est vrai.

Expliques-moi le but de la manip et je pourrais t'aider à corriger le tir.

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
0
lamita20 Messages postés 6 Date d'inscription lundi 30 novembre 2009 Statut Membre Dernière intervention 30 décembre 2010
30 déc. 2010 à 17:13
merci pour l'aide
En fait j'essaye de réaliser un système expert, j'ai un fichier, je doit découper ses lignes pour stocker les règles et les prémisses dans des listes et les faits dans une autre liste pour les comparer avec les prémisses. c'est tout et je me suis bloqué maintenant au niveau du stockage des faits dans une liste.
0
Rejoignez-nous