Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/03/2009, à 18:51

TatrefThekiller

Question C, pointeurs

Bonjour,

Je réalise un programme en C, et j'ai quelques soucis. J'ai créé une structure vecteur :

struct Vect
{
    double x, y, z;
};

Puis des fonctions basiques (somme, produit scalaire, etc) :

Vect addVect(Vect* u, Vect* v)
{
    Vect res;

    res.x = u->x + v->x;
    res.y = u->y + v->y;
    res.z = u->z + v->z;

    return res;
}

Le problème est que je n'arrive pas à enchaîner les fonctions sans passer par des variables temporaires :

 Vect v1;
    Vect v2;
    // v3 = v1 + v2 + v1
    Vect v3 = VectAdd(&VectAdd(&v1, &v2), &v1);

J'ai l'erreur suivante à la compilation : "lvalue required as unary ‘&’ operand"
Ceci marche bien en créant une variable temporaire, mais ne me parrait pas du tout optimal !!!
J'aimera savoir s'il existe une manière de résoudre ce problème...

Merci d'avance.

Hors ligne

#2 Le 28/03/2009, à 18:58

Link31

Re : Question C, pointeurs

Vect addVect(Vect u, Vect v)
{
    Vect res;

    res.x = u.x + v.x;
    res.y = u.y + v.y;
    res.z = u.z + v.z;

    return res;
}
 Vect v1;
    Vect v2;
    // v3 = v1 + v2 + v1
    Vect v3 = VectAdd(VectAdd(v1, v2), v1);

Dernière modification par Link31 (Le 28/03/2009, à 18:58)

Hors ligne

#3 Le 28/03/2009, à 19:08

TatrefThekiller

Re : Question C, pointeurs

Merci, ça marche !

Hors ligne

#4 Le 30/03/2009, à 10:55

jofab

Re : Question C, pointeurs

Salut,
Attention quand meme, la solution de Link31 fonctionne mais n'est pas optimale : l'intégralité du contenu de ta structure est copiée dans la pile puis copiée dans les variables locales. Idem pour le resultat, la structure est completement copié dans la pile puis à nouveau dans la variable résultat. Si ta structure devient grosse, il va y avoir bcp de transferts...
Pour ton code &VectAdd(&v1, &v2) ne peut pas fonctionner : le resultat de la fonction est dans la pile. Demander l'adresse de ce resultat n'est pas possible car la pile va etre dépilée...

Hors ligne

#5 Le 30/03/2009, à 12:24

Link31

Re : Question C, pointeurs

En l'occurrence, c'est très bien adapté vu que la structure ne contient que 3 doubles.

Souvent, rechercher ce genre d'"optimisation" à coup de pointeurs est plus dangereux qu'autre chose, et on finit souvent par retourner un pointeur ou une référence sur un objet dans la pile. De plus, le compilateur n'est pas stupide et va complètement optimiser en inline de tels passages et retours par valeur.

Dernière modification par Link31 (Le 30/03/2009, à 12:24)

Hors ligne

#6 Le 30/03/2009, à 14:17

jofab

Re : Question C, pointeurs

Link31 a écrit :

En l'occurrence, c'est très bien adapté vu que la structure ne contient que 3 doubles.

Il faut quand meme avoir conscience de ce qui est fait et faire ensuite son choix en connaissance de cause...

Link31 a écrit :

Souvent, rechercher ce genre d'"optimisation" à coup de pointeurs est plus dangereux qu'autre chose, et on finit souvent par retourner un pointeur ou une référence sur un objet dans la pile.

Ca dépend de la taille de la structure, du nombre d'appels, du temps que l'on dispose au runtime... C'est sur cette base la que l'on prend la decision de faire un truc simple si ca suffit ou plus cplx si besoin.

Link31 a écrit :

De plus, le compilateur n'est pas stupide

hmm

Link31 a écrit :

et va complètement optimiser en inline de tels passages et retours par valeur.

Laisse moi douter un peu : sur le retour je veux bien, sur les parametres j'y crois pas trop (sauf peut etre si tu mets un const sur tes params...).

Hors ligne

#7 Le 30/03/2009, à 17:43

TatrefThekiller

Re : Question C, pointeurs

À la base, c'est pour éviter les copies que j'avais utilisé des pointeurs...

Hors ligne