C'est en fait l'appel a la fonction dans la fonction qui pose problème ! Si le programme se résumait a une seule fonction, ceci fonctionnerait parfaitement...
Mais c'est cette imbrication qui me fait perdre le pointeur sur mon panier de départ
cs_JCDjcd
Messages postés1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 19 oct. 2003 à 16:12
Je ne crois pas que ce soit cela ! tu peux mettre tout ton code ? Normalement quand du va ajouter un pomme ca va aussi ajouter une bananes. L'imbrication ne pose pas de probleme
garslouche
Messages postés583Date d'inscriptionmardi 26 novembre 2002StatutMembreDernière intervention29 mai 20151 20 oct. 2003 à 10:58
Je ne comprends pas pk personne ne t'a donné la solution...c'est pourtant une erreur très très classique!
Ton programme est lu de haut en bas. Du coup au moment on le main() est lu, la fonction ajouterPomme() est inconnue !
Pour eviter ce pb tu as deux solutions :
- soit tu mets la fonction ajouterPomme() avant le main
- soit tu mets le prototype de tes fonctions au début du fichier:
int main(void);
void ajouterPomme(T_panier *);
void ajouterBanane(T_Panier *);
cs_JCDjcd
Messages postés1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 30 oct. 2003 à 09:03
Bah l'inconvenient c'est que dans chaque panier il y aura 2 pointeurs sur fonctions. Celles-ci ne changent pas.
On met des pointeurs sur des fonctions que quand les fonctions sont suceptibles de variees selon le strutures.
La je ne pense pas que se soit utile.
gillig
Messages postés32Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 4 décembre 2003 30 oct. 2003 à 13:40
Dites-moi si je me trompe, mais je ne pense pas qu'il y aura de pointeurs de fonction dans le cas que je donne. Il faudrait que les méthodes soient virtuelles pour ça.
Peut-être est-ce plus clair en écrivant class T_panier...
gillig
Messages postés32Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 4 décembre 2003 30 oct. 2003 à 15:09
Ben non, je viens de vérifier sous debugger visual C++, y'a pas de pointeur de fonction. Et c'est normal, le compilo génère des pointeurs de fonction seulement pour les méthodes virtuelles (pourquoi le ferait-il alors qu'il n'y a pas d'ambiguité sur la fonction à appeler, lorsqu'elle n'est pas virtuelle, ça se résoud statiquement à la compile)
Essaye le code suivant :
#include "iostream.h"
int main(int argc, char* argv[])
{
struct T_panier
{
int nbPommes;
T_panier() : nbPommes(0) {}
void AjouterPomme() { nbPommes++; }
};
gillig
Messages postés32Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 4 décembre 2003 30 oct. 2003 à 18:09
Non c'est du C++. M'étonnerait que ça passe avec un compilo C, ce code : la syntaxe n'est pas bonne pour déclarer des pointeurs de fonction, et en plus, aucune chance de mettre du code dans la structure !
En ce qui concerne le changement de structure : Excuse-moi de ne pas avoir refait EXACTEMENT la même structure. Je me disais que l'exemple des pommes seules devait suffire, puisque pour traiter le cas des bananes il suffit de dupliquer le code, mais bon, j'ai dû me tromper.
Bon, cette polémique n'est pas vraiment passionnante. OK, tout aurait été plus clair si j'avais utilisé dès le début une classe au lieu d'une structure, mais je voulais modifier le moins possible le code de Daivil, tout en proposant une solution : je voulais suggèrer à Daivil de passer en C++, sans trop de douleurs, son problème disparait puisqu'il n'aurait plus besoin de balader un pointeur de panier...
panier.AjouterPomme(); c'est plus simple que
AjouterPomme(T_panier *panier); je trouve...