Erreur comparaison pointeur à un entier
dachitaib
Messages postés
4
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour tout le monde, dans le cadre de mon projet on nous a demandé de faire un modèle de liste, voila ce que j'ai fait au début
tout marche à merveille à part la dernière fonction qui devrait chercher un element et le supprimer ... on m'indique le message suivant : "list.c:56: erreur:comparaison entre un pointeur et un entier"
Voici le fichier Main
SVP , Aidez moi je me plante :( Et Merci Infiniment de bien vouloir m'aider.
#include <stdlib.h> #include <stdio.h> #include <string.h> #include "list.h" list *creation_list() { list* l = NULL; return l; } void insertion_tete(list** l, void* valeur) { list *p=(list*)malloc(sizeof(list)); p->val=valeur; p->suivant=*l; *l=p; } void insertion_queue(list** l, void* valeur) { list *elementpos=(*l); list *p=(list*)malloc(sizeof(list)); p->val=valeur; p->suivant=NULL; while(elementpos->suivant != NULL) { elementpos=elementpos->suivant; } elementpos->suivant=p; } void supprimerElementEnTete(list** l) { list *p; if(l != NULL) { p=*l; *l=(*l)->suivant; free(p); } else { printf("Liste Vide"); } } void supprimeElement(list ** l,int x) { list *p,*pred; if( (*l)->val == x) { p=*l; *l=(*l)->suivant; free(p); } else { pred=*l; p=pred->suivant; while(p!=NULL && p->val != x) { pred=p; p=pred->suivant; } if(p==NULL) printf("inexistant"); else { pred->suivant=p->suivant; free(p); } } }
tout marche à merveille à part la dernière fonction qui devrait chercher un element et le supprimer ... on m'indique le message suivant : "list.c:56: erreur:comparaison entre un pointeur et un entier"
Voici le fichier Main
#include <stdlib.h> #include <stdio.h> #include <string.h> #include "list.h" int main() { list *deb=creation_list(); list *temp; int *i=(int*)malloc(sizeof(int)); int *j=(int*)malloc(sizeof(int)); int *k=(int*)malloc(sizeof(int)); int *l=(int*)malloc(sizeof(int)); int *r=(int*)malloc(sizeof(int)); *i=3; *j=7; *k=19; *l=100; *r=150; insertion_tete(&deb,i); insertion_tete(&deb,j); insertion_tete(&deb,k); insertion_queue(&deb,l); insertion_queue(&deb,r); temp=deb; while(temp!=NULL) { printf("%d \t", (*(int*)temp->val)); temp=temp->suivant; } printf("\n"); supprimerElementEnTete(&deb); temp=deb; while(temp!=NULL) { printf("%d \t", (*(int*)temp->val)); temp=temp->suivant; } printf("\n"); supprimeElement(&deb,3); while(temp!=NULL) { printf("%d \t", (*(int*)temp->val)); temp=temp->suivant; } printf("\n"); free(i); free(j); free(k); free(l); free(r); return 0; }
SVP , Aidez moi je me plante :( Et Merci Infiniment de bien vouloir m'aider.
A voir également:
- Erreur comparaison pointeur à un entier
- Pointeur souris - Guide
- Curseur Windows 10 : comment bien voir la souris à l'écran - Guide
- Erreur 0x80070643 - Accueil - Windows
- Erreur 4201 france tv ✓ - Forum Réseaux sociaux
- J'aime par erreur facebook notification - Forum Facebook
1 réponse
Comme le dit si bien ton message d'erreur, à la ligne 56 de ton fichier list.c, tu compares un pointeur à un entier. Tu sais que c'est interdit ? Car ça ne veut rien dire.
Tu peux comparer deux pointeurs (ton pointeur et l'adresse d'un entier) ou deux entiers (ce qui est pointé par le pointeur et ton entier) mais pas deux variables différentes.
Dans ton cas précis :
ou
seraient syntaxiquement corrects, mais la comparaison de deux pointeurs ne voudrait rien dire, car x est une variable locale et son adresse n'a rien à voir avec ta liste.
En fait, il y a pour moi un problème de logique dans ta démarche :
- Soit ta liste est dédiée à des entiers, et son champ val devrait être un int et non pas un int*, et tes fonction d'insertion devraient donc avoir des int et non pas des int * comme paramètres
- Soit ta liste est plus générale, et il faut alors qu'elle mémorise le type de variable stockée à chaque noeud, pour que ta fonction de suppression sache si elle doit comparer deux char, deux entiers, deux structures... pour trouver le noeud à détruire
Tu peux comparer deux pointeurs (ton pointeur et l'adresse d'un entier) ou deux entiers (ce qui est pointé par le pointeur et ton entier) mais pas deux variables différentes.
Dans ton cas précis :
(*l)->val == x est incorrect
(*l)->val == &x // comparaison de deux pointeurs
ou
*(int*)((*l)->val) == x // comparaison de deux entiers
seraient syntaxiquement corrects, mais la comparaison de deux pointeurs ne voudrait rien dire, car x est une variable locale et son adresse n'a rien à voir avec ta liste.
En fait, il y a pour moi un problème de logique dans ta démarche :
- Soit ta liste est dédiée à des entiers, et son champ val devrait être un int et non pas un int*, et tes fonction d'insertion devraient donc avoir des int et non pas des int * comme paramètres
- Soit ta liste est plus générale, et il faut alors qu'elle mémorise le type de variable stockée à chaque noeud, pour que ta fonction de suppression sache si elle doit comparer deux char, deux entiers, deux structures... pour trouver le noeud à détruire