begin process at 2012 05 29 14:51:40
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

Passage d'arguments par valeur ou par adresse


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Passage d'arguments par valeur ou par adresse

mercredi 3 octobre 2007 à 08:54:20 | Passage d'arguments par valeur ou par adresse

ToutEnMasm

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














mercredi 3 octobre 2007 à 13:00:51 | Re : Passage d'arguments par valeur ou par adresse

The_Guardian

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
mercredi 3 octobre 2007 à 14:44:09 | Re : Passage d'arguments par valeur ou par adresse

ToutEnMasm

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.



 

 

mercredi 3 octobre 2007 à 15:14:11 | Re : Passage d'arguments par valeur ou par adresse

The_Guardian


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
jeudi 4 octobre 2007 à 09:42:19 | Re : Passage d'arguments par valeur ou par adresse

ToutEnMasm

Réponse acceptée !

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


 



Cette discussion est classée dans : valeur, passage, adresse, argument, arguments


Répondre à ce message

Sujets en rapport avec ce message

passage d'arguments à un programme [ par VolaiL ] J'ai réalisé un programme en C qui necessite le passage de 2 arguments lors de l'appel de l'executable.( ex : nom_du_prog arg1 arg2 )Pas de probleme, passage de parametre [ par Ricool ] Salut a tousVoila, j'ai un pb de passage de parametre.J'ai une fonction qui allou un pointeur de typetypedef struct { char type; /* type de Passage par valeur et par reference [ par jfk20004 ] Quelle est la difference des 2 moyens de passer des valeurs mais surtout leur interet respectif et dans quel casemploie t on l'un ou l'autre Pb de passage de parametres en C++ [ par hergestridgefr ] Bonjour,J'ai un souci avec un appli que j'ai développée en C++, et qui recoit des arguments d'une autre appli (faite en Flash), avant de les traiter.S Passage d'arguments [ par tibob51 ] Bisoir a tout le monde,Je galère encore pour le passage d'argument d'un programme a l'autre.Si quelqu'un pouvais m'aider pour que je puis clarifié tou Passage par adresse ds une fonction [ par benus ] Bonjour j'ai un ti soucis avec une fonction c++, il doit y avoir un probleme dans la recuperation de la variable :#include #include void entrer_carac [Performance] Passage par valeur | Passage vers pointeur [ par BIG_BOSS_001 ] Bonjour,Je me pose une petite question sur les performances entre le passage par valeur et par pointeur.Je sais que le premier reçoit par la pile une passage d'une union en argument d'une fonction [ par SesechXP ] Salut !J'ai une union déclarée dans un fichier "toto.h" :union DEVICE_T {CHAR <a class="code" href="unionDEVICE__T.ht Probleme de passage d'argument [ par dr971 ] Bonjour , j'ai un petit prob (plutot un gros)En fait j'ai une class A et une class BclassA{   public :        void setResistance(int);         //mutat limiter une valeur d'argument [ par ElMatador06 ] Bonjour a tous,Voila mon problème : j'ai un programme qui prend comme argument une base (nombre entre 2 et 16), un chiffre (1 ou 2), 1 pour addition e


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales