Pointeur null

Signaler
Messages postés
6
Date d'inscription
lundi 30 novembre 2009
Statut
Membre
Dernière intervention
30 décembre 2010
-
Messages postés
6
Date d'inscription
lundi 30 novembre 2009
Statut
Membre
Dernière intervention
30 décembre 2010
-
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

Messages postés
14979
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
1 mars 2021
94
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
Messages postés
14979
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
1 mars 2021
94
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
Messages postés
6
Date d'inscription
lundi 30 novembre 2009
Statut
Membre
Dernière intervention
30 décembre 2010

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.
Messages postés
14979
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
1 mars 2021
94
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
Messages postés
6
Date d'inscription
lundi 30 novembre 2009
Statut
Membre
Dernière intervention
30 décembre 2010

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;

}
Messages postés
14979
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
1 mars 2021
94
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
Messages postés
14979
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
1 mars 2021
94
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
Messages postés
6
Date d'inscription
lundi 30 novembre 2009
Statut
Membre
Dernière intervention
30 décembre 2010

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.
Messages postés
14979
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
1 mars 2021
94
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
Messages postés
6
Date d'inscription
lundi 30 novembre 2009
Statut
Membre
Dernière intervention
30 décembre 2010

ça pas marché j'ai le même erreur.
Messages postés
14979
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
1 mars 2021
94
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
Messages postés
6
Date d'inscription
lundi 30 novembre 2009
Statut
Membre
Dernière intervention
30 décembre 2010

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.