begin process at 2012 05 29 21:40:25
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

problème pointeurs en C


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

problème pointeurs en C

lundi 22 mai 2006 à 11:53:43 | problème pointeurs en C

blanccc

Bonjour à tous, voila je débute en C et j'aurais besoin de votre aide sur un truc qui va vous paraitre tout bete je pense : j'ai créé un type de variable appelé 't_Sommet' de la façon suivante : typedef struct { int Numero; float Abscisse; float Ordonnee; } t_Sommet; ensuite j'ai créé la liste chainée associée de façon classique : typedef struct { t_Sommet S; struct pSommet *prec; } pSommet; admettons maintenant que j'ai plusieurs sommets dans ma liste et que je veuille modifier les coordonnées d'un de ces sommets. Ma question est simple : comment je dois faire ? j'ai une fonction que j'ai créé qui pourrait peut-être vous aider : t_Sommet Sommet_Numero(pSommet *Sommets, int i) { t_Sommet Si; while(Sommets!=NULL) { Si = Sommets->S; if (Si.Numero == i) { return *Si; } if (Si.Numero != i) { Sommets = Sommets->prec; } } } Le problème avec cette fonction c'est que si je fais : Sommet1 = Sommet_Numero(*ListeSommets, i); je me retrouve avec Sommet1 qui vaut le ième sommet de ma liste chainée mais, si je modifie ensuite Sommet1, ça ne modifie pas celui de ma liste or c'est ce que je voudrais faire : modifier un élément de type 't_Sommet' dans ma liste dont l'attribut 'Numero' vaut i (je sais pas si c'est le bon terme 'attribut'). En fait c'est les valeurs des attributs 'Abscisse' et 'Ordonnee' que je veux modifier. J'espère avoir réussi à me faire comprendre. N'hésitez pas à me poser des questions si vous avez besoin de plus de détails. Merci d'avance ;) Cédric, un stagiaire en galère... lol
lundi 22 mai 2006 à 13:44:48 | Re : problème pointeurs en C

Bel0

D'après ce que j'ai compris de tes explications et en lisant ton code, je vois un petit truc scabreux dans cette affaire. En gros, tu voudrais pouvoir modifier ton sommet tout en le laissant dans ta liste. Le plus facile pour ça, c'est de retourner une référence vers le sommet en question. Je suppose que c'est ce que tu as voulais faire en faisant: "return *Si;" Mais ca ne fonctionnera pas. Au mieux tu retournes une copie du sommet, au pire ca ne compile meme pas étant donné que Si n'est pas un pointeur. Je te propose donc de modifier t'as source de la façon suivante: t_Sommet *Sommet_Numero(pSommet *Sommets, int i) { t_Sommet *current = Sommets; while(current != NULL) { if (current.Numero == i) return &(current->S); current = current->prec; } return NULL; // si le sommet n'est pas trouvé } De cette façon, tu reçois un pointeur vers le sommet que tu cherchais ou NULL si la valeur n'existe pas dans la liste. L'adresse retournée par la fonction restera bonne tant que la liste n'est pas libérée ou que l'entrée contenant le sommet en question n'est pas libérée. Avec cette méthode, comme tu utilises un pointeur vers le sommet, tu modifies bien celui qui est dans la liste. Belo
lundi 22 mai 2006 à 13:57:17 | Re : problème pointeurs en C

blanccc

Salut BalO, merci pour tes conseils. Donc si j'ai bien compris, je fais qqch du genre : t_Sommet *Sommet1; t_Sommet Sommet2; Sommet1 = Sommet_Numero(*ListeSommets, i); Sommet2.Numero = i; Sommet2.Abscisse = x; Sommet2.Ordonnee = y; Sommet1->S = Sommet2; C'est ça ? désolé si je met du temps à comprendre, j'ai vraiment du mal avec les passages de données par valeur et par référence... lol merci en tous cas (^_^)
lundi 22 mai 2006 à 15:12:24 | Re : problème pointeurs en C

blanccc

désolé BalO mais ça ne compile pas ton truc !!! j'ai bien fait gaffe aux accolades (tu en as oublié pour le 'if'). Merci quand même et, si tu as une autre idée, fais-moi signe...
lundi 22 mai 2006 à 15:29:39 | Re : problème pointeurs en C

Bel0

Pour l'utilisation du code .. pas besoin de faire si compliqué. Il suffit simplement de faire: t_Sommet *Sommet1; Sommet1 = Sommet_Numero(*ListeSommets, i); Sommet1->Numero = i; Sommet1->Abscisse = x; Sommet1->Ordonnee = y; pour changer les informations contenues dans le sommet (ca n'est pas fait pour ajouter un nouveau noeud !!). Euh, j'ai pas encore un compilateur intégré, mais je vois quelle erreur il pourrait y avoir dans le code. Si tu pouvais copier l'erreur renvoyée par le compilateur, ca pourrait être util pour t'aider. Belo
lundi 22 mai 2006 à 15:31:15 | Re : problème pointeurs en C

Bel0

oops parlé trop vite sur ce coup. Essaye de remplacer "if (current.Numero == i)" par "if (current->Numero == i)" Belo
lundi 22 mai 2006 à 15:56:14 | Re : problème pointeurs en C

blanccc

Réponse acceptée !
c'est bon, j'ai fait autrement en me basant sur ce que tu as fait : t_Sommet *Adresse_Sommet_Numero(pSommet *Sommets, int i) { pSommet *current = Sommets; t_Sommet Si; while (current!=NULL) { Si = current->S; if (Si.Numero == i) { return &(current->S); } current = current->prec; } return NULL; /* si jamais le Numero n'existe pas */ } et ensuite, dans le corps de mon prog j'ai une variable que je déclare : t_Sommet *Sommet3 puis je fais : Sommet3 = Adresse_Sommet_Numero(Sommets, i); Sommet3->Numero = i; Sommet3->Abscisse = x; Sommet3->Ordonnee = y; Seul problème maintenant, c'est que Sommet3 pointe toujours vers le même sommet. Comment faire pour dire que Sommet3 ne pointe plus vers rien ou qu'il pointe vers un autre Sommet ? Merci pour ton aide en tous, elle m'aura été bien précieuse ! Cédric


Cette discussion est classée dans : problème, liste, numero, sommets, sommet


Répondre à ce message

Sujets en rapport avec ce message

problème de création d'un objet sur une liste [ par Zaz16 ] Bonjour, Je travaille avec visualC++ 6.0 et les classes MFC. J'ai créé une fonction copier/coller avec un menu contextuel. Jusque là tout va bien. Je problème tri d'une liste d'objet ! [ par tomsawyerbelgique ] Bonjour, j'aimerais savoir comment on fait pour surdéfinir un foncteur de tri de liste d'objet. C'est objet sont des pointeurs sur une structure et la conversion int en char* [ par arwenita ] Encore un petit problème en C++...Dans mon programme, je voudrais afficher une liste de nombres (premiers), que je récupère de la fonction Crible(n).L Problème avec les nombres aléatoires [ par nisaloncaje ] Bonjour, j'ai un petit problème : dans un programme , pour générer un nombre aléatoire je fais ceci : int n,max=50,liste[15];for(i=0;isrand(time(0));  Iterateurs [ par dinarea ] Bonjour,Je travaille sur les collections. Mais en voulant personnaliser le code, j'ai un petit problème. Pouvez-vous m'aider pour ce problème svp?Voic template- au secours [ par toddy_101 ] bonjour tout le monde, j'ai un probleme au niveau des templates, ca bloke au niveau du linkage!! voici la declaration de la classe , et des methodes: Problème avec les structures [ par _michel ] J'ai un problème avec la compilation de mon programme. J'ai une vigtaine de fois la même erreur : "syntax error before '(' token".Voilà un exempl Problème QGridLayout de QT [ par D1m3x ] Salut à tous,Je suis en train de programmer un client IRC (cela ne fait même pas une semaine que je l'ai commencer) pour le moment je n'ai établi que Effacer élement liste stl [ par poiuytrez3 ] Bonjour,J'utilise depuis très peu de temps la stl.J'ai un problème lors de la suppression d'un élément d'une liste.Voici mon problème : J'ai une liste


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales