begin process at 2012 05 30 12:57:21
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

(__cdecl *) => kesako?


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

(__cdecl *) => kesako?

samedi 16 avril 2005 à 18:01:11 | (__cdecl *) => kesako?

Oeil_de_taupe

Bonjour tout le monde,

J'ai créé deux classes qui représentent un protocole pour envoyer des données entre deux PC. Lors de l'appele de leur constructeurs elles demandent un pointeur sur une fonction afin d'envoyer des messages d'information sur la connection par protocole (un peu comme la fonction WndProc qui reçoit des messages sur la fenêtre ouverte).

Dans ma classe de décodage du protocole, mon constructeur demande un pointeur de type pFunc ou pFunc est déclaré de cette manière:
typedef bool (*pFunc)(int, SOCKET, const char*, int, int);

Il existe en plus des deux classe représentant le protocole, deux autres classes qui s'occupe que de la connection par Socket entre les deux ordinateurs.
Dans la classe serveur (qui contient celle de décodage du protocole) un thread se lance pour l'écoute avec un socket (c'est donc une fonction static). Je passe le pointeur de toute la classe au thread pour qu'il puisse accèder à sa classe (chose qui est impossible normalement avec une fonction static)

J'utilise donc le constructeur de la classe qui traite le protocole dans un thread  d'une autre classe. Voici la création de la calsse depuis le thread: lLocal->lDecodeur = new CTDecode(lLocal->MessageReceive, csock);


lLocal est le pointeur sur le tout de la classe (pour que la fonction static puisse accéder à sa classe, paramètre du thread)
lDecodeur est un pointeur sur la classe de décodage utilisée
et lLocal->MessageReceive est un pointeur sur la fonction qui permet de récupérer les messages de la classe protocole
(csock est un bête socket déjà connecté)
MessageReceive est une fonction qui reçoit les message (elle n'est pas static). Voici son prototype:
bool MessageReceive(int, SOCKET, const char*, int, int);

Mais lorsque je compile le compilo me met une erreur de ce type
error C2664: '__thiscall CTDecode::CTDecode(bool (__cdecl *)(int,unsigned int,const char *,int,int),unsigned int)' : cannot convert parameter 1 from 'bool (int,unsigned int,const char *,int,int)' to 'bool (__cdecl *)(int,unsigned int,const char *,int,int)'

Es-ce-que quelqu'un aurait une idée pourquoi le compilo me met ce bug?

(j'ai déjà essayé de mettre ce "(__cdecl *)"  dans le prototype de la fonction MessageReceive mais il y a toujours le même bug ...
samedi 16 avril 2005 à 18:23:47 | Re : (__cdecl *) => kesako?

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
Faudrait mettre ta fonction en static pour passer un pointeur dessus je pense.

ciao...
BruNews, MVP VC++
samedi 16 avril 2005 à 19:59:17 | Re : (__cdecl *) => kesako?

Oeil_de_taupe

Ho!!!

Tu as raison... Mais... Oulala!!! Je me sens vieillir . C'est pas possible, j'ai bloqué pendant une journée sur ce problème et tu me donne la solution en une phrase, alors qu'il me semblait que j'avais déjà tester ce que tu avais dit avant!!!

Mais sait tu pourquoi on ne peut pas donner le pointeur d'un fonction en non-static depuis une fonction static (alors que ces deux fonctions sont dans la même classe)...


La taupe voit toujours tout (sauf les bugs)
samedi 16 avril 2005 à 20:11:45 | Re : (__cdecl *) => kesako?

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
A la compilation le compilo doit savoir l'adresse de la fonction, si elle est membre de classe elle est chargée dynamiquement à l'instanciation de la classe et donc pas d'adresse fixe.

ciao...
BruNews, MVP VC++
dimanche 17 avril 2005 à 12:28:29 | Re : (__cdecl *) => kesako?

Oeil_de_taupe

Un mot va bien pour ta réponse BruNews: "MERCI"

La taupe voit toujours tout (sauf les bugs)
lundi 18 avril 2005 à 09:14:29 | Re : (__cdecl *) => kesako?

ymca2003

Réponse acceptée !
Petite précision : les fcts membres des classes ont une adresse fixe (les fct virtuelles sont à placer un peu à part mais bon). La raison pour laquelle elle ne peuvent servir de CALLBACK à l'API Windows c'est que toutes les fct membres des classes (non statiques) ont un argument supplémentaire implicite (this) que l'API Windows est incapable de fournir.

Il y a un moyen de passer une fct membre nons tatique d'une classe en CALLBACK à une autre fonction mais c'est plus délicat (le type de la CALLBACK doit contenir le nom de la classe). Les MFC s'en servent pour la table des messages. Mais cette technique n'est pas possible pour toi car le type de la CALLBACK est déjà fixé par une API.


Cette discussion est classée dans : fonction, int, classe, pointeur, protocole


Répondre à ce message

Sujets en rapport avec ce message

Pointeur vers une fonction dans une classe ... [ par MoDDiB ] Supposons que j'ai la fonctionvoid Fonction(int test,int t);appartenant a la classe Cclass.Quelle est la syntaxe pour creer un pointeur vers cette fon Probleme avec les threads en C++ sour linux [ par benjamvs ] Bonjour,j'ai le probleme suivant a regler en C++je travaille sur les threads sous linux, avec la librairie "pthread"Lorsque je crée un thread, celui c adresse d'une fonction membre d'une classe [ par gagah1 ] Salut à tous!Je voudrais avoir l'adresse mémoire d'une fonction membre d'une classe, alors que l'ISO C++ l'interdire l'accès.Je m'explique:J'ai une c pointeur de fonction [ par Larwin ] salut tout le mondebon j'suis un gros débutant c/c++ et je fais mes premiers pas depuis 2, 3 jours...j'ai deja un petit probleme :)je m'explique :j'ai convertir pointeur int* en reference int& ??? je fais quoi ? [ par equimose ] j'ai une fonction qui prend comme parametre une CMyLigne & ABet j'ai besoin d'envoyer a cette fonction un pointeur sur une CMyLigne * pLigne !c'est po Pointeur sur fonction ? [ par tintin72 ] Bonjour, J'ai un petit souci avec les pointeurs sur fonction. Voilà, j'ai une fonction qui prend comme argument un pointeur sur fonction: void maFonct fonction recevant un pointeur de fonction d'une classe [ par fuliculi ] Bonjour à tous,j'ai un thread qui doit faire évoluer une variable "progress" de 0 à 100% (j'utilise les mutex pour éviter les écritures/lectures simul pointeur sur une fonction [ par pasty ] Bonjour,J'appelle une fonction f(int *,int *,int) dont le code  est dans un DLL depuis le programme principal main.cpp Je déclare la fonction dans m pointeur de fonction membre [ par maximus4 ] bonjour a tous,je voudrai savoir comment on passe en paramètre d'une fonction membre une autre fonction membre d'une autre class déjà instanciéeex:cla Pointeur de fonction membre de classe dérivé en paramètre de fonction de classe mère [ par Fituza ] Bonsoir (encor moi c'est la dernière promis :D), je souhaiterai pouvoir passer la fonction QueryList de ma classe Client en paramètre de la fonction R


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 : 3,370 sec (3)

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