question sur le passage d'un pointeur en paramètre - C++ - Programmation
Marsh Posté le 02-04-2003 à 20:27:56
static void vecteur3d::coincide(vecteur3d *p1, vecteur3d *p2) {
...
}
vecteur3d *p1, *p2;
vecteur3d::coincide(p1, p2);
devrait marcher ...
sinon, si tu as
vecteur3d p1, p2;
tu dois faire :
vecteur3d::coincide(&p1, &p2);
et dernière solution : si les & sont dans la déclaration de ta fonction (à la place des étoiles) alors la solution est :
vecteur3d p1, p2;
vecteur3d::coincide(p1, p2);
les miracles du passage par référence ou par valeur ...
Marsh Posté le 02-04-2003 à 21:07:53
theShOcKwAvE a écrit : |
et en mettant des const (référence ou valeur) c'est le bonheur.
Marsh Posté le 02-04-2003 à 23:11:26
Konar a écrit : |
c'est vrai qu'on peut mettre des const ....
donc nouveau proto de fonction :
static void vecteur3d::coincide(const vecteur3d *p1, const vecteur3d *p2);
Marsh Posté le 03-04-2003 à 21:31:28
theShOcKwAvE a écrit : |
les const c pas juste pour les constantes
ça fait quoi d'autre sinon ?
Marsh Posté le 03-04-2003 à 21:35:22
airseb a écrit : Soit la fonction suivante : |
(voir la question en gras)
sachant que p1 et p2 ont été déclarés comme pointeurs de type vecteur3d
Marsh Posté le 04-04-2003 à 00:21:20
airseb a écrit : |
ca ne marche pas quand tu mets des & devant p1 et p2 car tu demandes l'adresse de ces variables => tu obtiens un pointeur sur un pointeur de vecteur ... Un niveau d'indirection en trop ...
Les const sont effectivement pour préciser les constantes ... Et par conséquent, quand, dans une fonction, tu ne modifies pas les paramètres, tu peux les déclarer en const ... C'est plus explicite pour l'utilisateur qui reprendra tes classes ...
Marsh Posté le 04-04-2003 à 01:25:08
theShOcKwAvE a écrit : |
et ca permet (dans certains cas) au compilateur d'optimiser plus ou moins le code.
Marsh Posté le 04-04-2003 à 04:40:18
Konar a écrit : |
Hmm ce n'est jamais le cas meme si c'est un mythe assez répandu.
En aucun cas un const n'est une indication au compilateur
d'optimisation. Et s'il fait l'analyse pour voir les variables qui ne sont accédés qu'en lecture alors il n'a pas besoin de const pour le voir (et s'il tenait compte du const il y aurait de forte chances pour qu'il ait tout faux).
Afin que ce soit clair: const n'est qu'un outil qui améliore la type safety des programmes, par l'ajout de warnings et d'erreurs à la compilation lorsqu'elle n'est pas respectée mais jamais utilisée par le compilateur pour optimisation.
Seule optimisation "algorithmique" permise par const: la surcharge de fonction,
j'ai une string de char appelee machaine
- en version non const, machaine[1] renverra une reference non const sur un char.
- en version const, machaine[1] renverra un simple char en copie.
mais dans ce cas c'est une optimisation faite par l'utilisateur et non par le compilateur.
LeGreg
Marsh Posté le 02-04-2003 à 19:49:30
Soit la fonction suivante :
void coincide (vecteur3d *p11, vecteur3d *p22)
{
...
}
et son appel :
p2->coincide (p1, p2) ;
p1 et p2 sont des pointeurs de type verteur3d (une classe)
Pourquoi ça ne marche pas quand je met des & devant p1 et p2 ?