Question de pointeurs

daivil Messages postés 87 Date d'inscription mardi 25 juin 2002 Statut Membre Dernière intervention 4 juin 2005 - 18 oct. 2003 à 21:40
gillig Messages postés 32 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 4 décembre 2003 - 30 oct. 2003 à 18:09
Bonsoir,

Alors admettons un type :

typedef struct
{
int nbPommes;
int nbBananes;
} T_panier;

//Admettons ensuite une fonction main
int main(void)
{
T_panier *monPanier;

//j'appelle une fonction de mon programme
ajouterPomme(monPanier)

}

//Fonction d'ajout dans le panier
void ajouterPomme(T_panier *unPanier)
{
unPanier->nbPommes++;
}

Mon problème est que lorsque le sous-programme ajouter une pomme dans mon panier, celle-ci n'est pas visible dans le main !

Je vous remercie a l'avance pour votre aide !

Bonne soirée @ tous

-- Devil --

18 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 oct. 2003 à 00:06
T_panier *monPanier;
Ce pointeur pointe sur quoi ???
BruNews, ciao...
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
19 oct. 2003 à 10:12
La VERITABLE fonction main !

int main(void)
{
T_panier monPanier;

//j'appelle une fonction de mon programme
ajouterPomme(&monPanier)

}
0
daivil Messages postés 87 Date d'inscription mardi 25 juin 2002 Statut Membre Dernière intervention 4 juin 2005
19 oct. 2003 à 12:07
Uhm... ok

Je crois comprendre....

Je vais tester ca et je vous dis quoi !
-- Devil --
0
daivil Messages postés 87 Date d'inscription mardi 25 juin 2002 Statut Membre Dernière intervention 4 juin 2005
19 oct. 2003 à 12:08
Il ne faut donc pas déclarer de pointeur avec * ???
-- Devil --
0

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

Posez votre question
daivil Messages postés 87 Date d'inscription mardi 25 juin 2002 Statut Membre Dernière intervention 4 juin 2005
19 oct. 2003 à 12:10
Et dans la fonctio n???

void ajouterPomme(T_panier *unPanier)

On laisse l'étoile ?

merci
-- Devil --
0
daivil Messages postés 87 Date d'inscription mardi 25 juin 2002 Statut Membre Dernière intervention 4 juin 2005
19 oct. 2003 à 12:30
En fait, je viens de comprendre en testant....

Le problème est beaucoup plus vicieux que ce que je pensais...

Ma fonction se présente de la sorte

void ajouterPomme(T_Panier *unPanier)
{
unPanier->nbPommes++;
ajouterBanane(unPanier);
}

void ajouterBanane(T_Panier *unPanier)
{
unPanier->nbBananes++;
}

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

Merci pour votre aide !

-- Devil --
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
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
0
daivil Messages postés 87 Date d'inscription mardi 25 juin 2002 Statut Membre Dernière intervention 4 juin 2005
19 oct. 2003 à 16:16
uhm....

Je ne comprends pas pkoi ca marcherait !
Etant donné qu'on ne passe pas d'adresse en paramètre (cf : &)

si ?
-- Devil --
0
daivil Messages postés 87 Date d'inscription mardi 25 juin 2002 Statut Membre Dernière intervention 4 juin 2005
19 oct. 2003 à 16:18
j'ai testé mes fonctions et celles qui étaient imbriquées posaient problème :-\

Je te mets tout le code source tout à l'heure...

-- Devil --
0
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
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 *);
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
20 oct. 2003 à 17:54
Le probleme n'ai pas un probleme de compilation mais t'execution a ce que j'ai compris !
0
gillig Messages postés 32 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 4 décembre 2003
30 oct. 2003 à 02:51
Et pourquoi ne pas faire ceci :

struct T_panier
{
int nbPommes;
int nbBananes;
void AjouterPomme() { nbPommes++; }
void AjouterBanane() { nbBananes++; }
};

T_panier panier;
panier.AjouterPomme();
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
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.
0
gillig Messages postés 32 Date d'inscription mercredi 5 février 2003 Statut Membre Derniè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...
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
30 oct. 2003 à 13:47
dans

struct T_panier
{
int nbPommes;
int nbBananes;
void AjouterPomme() { nbPommes++; }
void AjouterBanane() { nbBananes++; }
};

il y a deux pointeurs sur fonctions (je n'y peut rien !)
0
gillig Messages postés 32 Date d'inscription mercredi 5 février 2003 Statut Membre Derniè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++; }
};

struct T_panier_bis
{
int nbPommes;
T_panier_bis() : nbPommes(0) {}
virtual void AjouterPomme() { nbPommes++; }
};

T_panier a;
T_panier_bis b;
cout << sizeof(a) << " " << sizeof(b);
return 0;
}
On obtient 4 (un int) et 8 (un int et un pointeur)
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
30 oct. 2003 à 17:36
Je ne fais que tu C, et non du C++, donc tes trucs vituels je n'y comprend rien.

de plus tu changes la structures, c'etait :

struct T_panier
{
int nbPommes;
int nbBananes;
void AjouterPomme() { nbPommes++; }
void AjouterBanane() { nbBananes++; }
};

ca c'etait du C.
0
gillig Messages postés 32 Date d'inscription mercredi 5 février 2003 Statut Membre Derniè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...
0
Rejoignez-nous