Passage d'arguments par valeur ou par adresse

Résolu
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 - 3 oct. 2007 à 08:54
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 - 4 oct. 2007 à 09:42
Salut,
J'ai besoin de savoir comment le c++ determine si un argument est passé par adresse ou par valeur.
Bien que sachant le rôle du *,& et du int,const ....
Un cas particulier me pose problème:
Cette fonction passe son argument par adresse
DECLARE_INTERFACE_(ID3DXBaseMesh, IUnknown)
{
 ...
    STDMETHOD(GetDeclaration)(THIS_ D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) PURE;
 ..
}

Je l'ai vérifié en la décompilant.
Celle ci passe deux arguments par valeur
HRESULT AssocCreate(CLSID clsid,REFIID riid,LPVOID *pqa);
Si on voit clairement que LPVOID *pqa est passé par adresse (*) il n'en va pas de même pour
D3DVERTEXELEMENT9 ,rien n'indique un passage par adresse.

Les deux fonctions ont ceci de commun,elles passent des structures en arguments.Les structures ont une taille supérieur a un dword.

Quelqu'un peut il éclairer ma lanterne ?
                              ToutEnMasm

4 réponses

ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
4 oct. 2007 à 09:42
Salut,
J'ai posé la question sur plusieurs forums et j'ai finalement obtenue une réponse satisfaisante (en anglais) que je vais traduire içi.


la méthode GetDeclaration reçoit un taleau de type D3DVERTEXELEMENT9 tandis que la méthode AssocCreate reçoit un objet de type CLSID.
Pour être plus clair:
*** D3DVERTEXELEMENT9 est une structure contenant des dword ,des bytes...
c'est une référence
*** CLSID est un type défini à partir de la structure GUID.Ce n'est pas une référence mais un objet.


C'est la distinction entre référence et objet qui crée le passage par valeur ou par adresse.Un tableau ne peut pas être passé par valeur.L'objet ,lui le peut .Si on ne rajoute aucune précision en passant l'objet,c'est l'objet lui même (par valeur) qui est passé.

Merci pour l'aide


 
3
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
3 oct. 2007 à 13:00
Bonjour,

ton DVD3 la, tu dis que c'est une structure, ok maintenant, le compilateur peut faire ce qu'il veut car il peut passer la structure complete par valeur (ce qui ne se fait pas en général)  ou bien il peut passer l'adresse d'une copie de la structure
Donc tu gardes la propriété que modifier la structure n'a pas de répercussion sur la structure passée et essaye de modifier ta structure dans la fonction et voit si elle est modifiée à l'extérieur ou pas mais au final, laisse faire le compilateur, il sait ce qu'il fait. tu as demandé un passage par valeur, il va faire ce qu'il faut pour que ca le soit
 ===
Une autruche ne se cuit pas aux petits lardons
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
3 oct. 2007 à 14:44
Salut,
Savoir que le compilateur c++ sait ce qu'il fait,est rassurant pour l'utilisateur du C++.
Ce qui m'interesse , moi,c'est de traduire le prototype de la fonction pour masm.Pour ça,j'ai besoin d'en savoir autant que le compilateur c++.

Une méthode,simple,pour ça ,est de décompiler le source .cpp.On voit tout de suite le résultat (par adresse ou par value).Dommage que la méthode ne soit pas utilisable lorsqu'on écrit un traducteur de header c++ en masm.






 


 
0
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
3 oct. 2007 à 15:14
re

ah ok, tu fais en fait de l'assembleur, pas du C++
Donc savoir ce que fait le compilateur C++ quand on est un utilisateur du C++ ca peut induire en erreur, enfin c'est bien d'avoir les bases comme meme, ca on est ok sinon je vois ton probleme, fin j'ai l'impression.
tu parses le .cpp alors ?
Donc faudrait lire la doc de ton compilateur C++ pour être sûr, mais tu peux supposer que les structures sont jamais passées par valeur et essaye sur des petites structures, histoire de voir sur des trucs que tu maitrises plus que du DVD3
 (enfin dans le sens ou yen  moins de .h à manipuler, etc, tu matrises certainement le DVD3)
mais c'est sur que dans la doc de ton compilateur (si elle existe, ce qui est le cas pour les bons compilateurs), tu vas trouver la methode exacte de generation du code objet, voila.
==
Une autruche ne se cuit pas aux petits lardons
0
Rejoignez-nous