caster une fonction

caster une fonction - C++ - Programmation

Marsh Posté le 30-07-2003 à 16:44:23    

quelque chose me dit que l'appel de _beginthread est faux :/ (le 1er arg): voila le contenu de mes 2 fichiers :
 

Code :
  1. //fichier : main.cpp :
  2. HANDLE t_rig2ss
  3. t_rig2ss = _beginthread(comm.AD_Read, 0, NULL);
  4. //fichier : CCard_comm.cpp
  5. int CCard_comm::AD_Read (void)
  6. {
  7. ...
  8. return 1;
  9. }


 
Je voudrais appeler cette fonction AD_Read() avec l'objet comm. c possible ?


Message édité par Giz le 30-07-2003 à 16:58:45
Reply

Marsh Posté le 30-07-2003 à 16:44:23   

Reply

Marsh Posté le 30-07-2003 à 16:55:24    

prototype c vrai :D
 

Code :
  1. unsigned long _beginthread( void( __cdecl *start_address )( void * ), unsigned stack_size, void *arglist );


 

Reply

Marsh Posté le 30-07-2003 à 17:24:19    

Code :
  1. int wraperForAD_Read(void * comm)
  2. {
  3.   return (CCard_comm*)comm->AD_Read()
  4. }
  5. t_rig2ss = _beginthread(wraperForAD_Read, 0, &comm);


 
A part ça ...

Reply

Marsh Posté le 30-07-2003 à 17:39:03    

Kristoph a écrit :

Code :
  1. int wraperForAD_Read(void * comm)
  2. {
  3.   return (CCard_comm*)comm->AD_Read()
  4. }
  5. t_rig2ss = _beginthread(wraperForAD_Read, 0, &comm);


 
A part ça ...
 


 
ta fonction renvoie un int au lieu d'un void :/...wraperForAD_Read
 
Je voulais faire un truc du style :
 
Je donne un parametre (void* pvoid) bidon a ma fonction AD_Read, je declare le pointeur de fonction ad_read: void (* ad_read) (void *);
 
et je fais  
 
ad_read = comm.AD_Read;
 
le seul ptit hic c que AD_Read renvoie un int (je veux caster le retour de la fonction AD_Read en void). Je prefere ca, c plus propre que de creer une fonction de castage non (puis ca revient au meme que ta fct wraperForAD_Read nivo proto)?
 
g essaie :
 

Code :
  1. ad_read = (void) (comm.AD_Read)


 
mais ca passe pas


Message édité par Giz le 30-07-2003 à 17:41:49
Reply

Marsh Posté le 30-07-2003 à 17:44:06    

les cast C, capuducucu

Reply

Marsh Posté le 30-07-2003 à 17:44:58    

en fait c pour creer un thread !...la fonction executer par le thread doit obligatoirement rien renvoyer alors :/


Message édité par Giz le 30-07-2003 à 17:45:55
Reply

Marsh Posté le 30-07-2003 à 17:50:04    

Si je comprends bien, une fonction executer par un thread qui devrait renvoyee une valeur (c mon cas avec AD_Read) est impossible ? parce que cette valeur renvoyee servira a un autre thread...Suis je oblige de me taper une variable globale de m**de qui pu plus qu'un castage pour passer la valeur de retour du 1er thread au 2eme ?  :sarcastic:

Reply

Marsh Posté le 30-07-2003 à 17:55:36    

Nan pas oblige  
 
mais bon vu ton code ca marchera jamais ... ta fonction est pas statique a ta classe ou globale donc impossible de l utiliser en tant que Thread

Reply

Marsh Posté le 30-07-2003 à 18:02:15    

VisualC++ a écrit :

Nan pas oblige  
 
mais bon vu ton code ca marchera jamais ... ta fonction est pas statique a ta classe ou globale donc impossible de l utiliser en tant que Thread


 
Tu peux expliquer :/
...tu veux dire que la fonction doit etre dans le meme fichier d'ou on appelle le thread ?  :??:

Reply

Marsh Posté le 30-07-2003 à 18:11:35    

non la fonction doit etre une fonction globale ou alors une fonction statique membre d'un objet (une classe) sinon impossible de l utiliser (ca link pas il te le dit)
 
D'ou l'utilite du parametre passe lors du _begin dans le cas d'une statique, tu lui passe le pointeur sur ton objet (donc ta classe) et hop tu as acces a ton objet. Ou tu passes par un wrapper qui ne fait que appele une fonction non statique de ta classe, enfin c pareil a part se trainer des pThis-> ... c tout)
 
Car jsuis motive, code qui fonctionnera
 

Code :
  1. class CCard_comm {
  2. ...
  3. public:
  4.     static int m_fniAD_Read(void*);
  5. ...
  6. };
  7. ######
  8. int CCard_comm::m_fniAD_Read(void* pParam)
  9. {
  10.     CCard_comm* pThis = reinterpret_cast<CCard_comm*>(pParam);
  11.     if (pThis == NULL)
  12.         return -1;
  13.     // ton ojbet accessible via pThis
  14.     ....
  15.     return 0;
  16. }
  17. ####
  18. int main(int argc, char** argv)
  19. {
  20.     ....
  21.     HANDLE t_rig2ss;
  22.     t_rig2ss = _beginthread(comm.m_fniAD_Read, 0, &comm);
  23.     ....
  24. }


 
voila de tete ca devrait etre bon

Reply

Marsh Posté le 30-07-2003 à 18:11:35   

Reply

Marsh Posté le 30-07-2003 à 18:22:04    

VisualC++ a écrit :

non la fonction doit etre une fonction globale ou alors une fonction statique membre d'un objet (une classe) sinon impossible de l utiliser (ca link pas il te le dit)
 
D'ou l'utilite du parametre passe lors du _begin dans le cas d'une statique, tu lui passe le pointeur sur ton objet (donc ta classe) et hop tu as acces a ton objet. Ou tu passes par un wrapper qui ne fait que appele une fonction non statique de ta classe, enfin c pareil a part se trainer des pThis-> ... c tout)
 
Car jsuis motive, code qui fonctionnera
 

Code :
  1. class CCard_comm {
  2. ...
  3. public:
  4.     static int m_fniAD_Read(void*);
  5. ...
  6. };
  7. ######
  8. int CCard_comm::m_fniAD_Read(void* pParam)
  9. {
  10.     CCard_comm* pThis = reinterpret_cast<CCard_comm*>(pParam);
  11.     if (pThis == NULL)
  12.         return -1;
  13.     // ton ojbet accessible via pThis
  14.     ....
  15.     return 0;
  16. }
  17. ####
  18. int main(int argc, char** argv)
  19. {
  20.     ....
  21.     HANDLE t_rig2ss;
  22.     t_rig2ss = _beginthread(comm.m_fniAD_Read, 0, &comm);
  23.     ....
  24. }


 
voila de tete ca devrait etre bon

Bah merci  [:spamafote]  
...Mais j'ai exactement (ou bien j'allais faire exactement :D) pareil hormis le mot cle statique de la fonction dans la classe sinon j'ai exactement pareil :/
PS : le mot cle statique d'une fonction signifie qu'elle n'est pas utilisable en dehors du fichier ou elle est definie...par consequent, ton appelle a _beginthread marche-t-il ? :/ (j'essaierai tout ca merci  :jap: )


Message édité par Giz le 30-07-2003 à 18:22:40
Reply

Marsh Posté le 30-07-2003 à 19:12:41    

giz a écrit :

Bah merci  [:spamafote]  
...Mais j'ai exactement (ou bien j'allais faire exactement :D) pareil hormis le mot cle statique de la fonction dans la classe sinon j'ai exactement pareil :/
PS : le mot cle statique d'une fonction signifie qu'elle n'est pas utilisable en dehors du fichier ou elle est definie...par consequent, ton appelle a _beginthread marche-t-il ? :/ (j'essaierai tout ca merci  :jap: )
 


 
Une fonction membre statique, ce n'est pas ça : c'est une fonction accessible en dehors de toute instance de ta classe :)

Reply

Marsh Posté le 31-07-2003 à 10:58:47    

Kristoph a écrit :


 
Une fonction membre statique, ce n'est pas ça : c'est une fonction accessible en dehors de toute instance de ta classe :)
 


 
 

Citation :

1.6.6. Fonctions statiques
Par défaut, lorsqu'une fonction est définie dans un fichier C/C++, elle peut être utilisée dans tout autre fichier pourvu qu'elle soit déclarée avant son utilisation. Dans ce cas, la fonction est dite externe. Il peut cependant être intéressant de définir des fonctions locales à un fichier, soit afin de résoudre des conflits de noms (entre deux fonctions de même nom et de même signature mais dans deux fichiers différents), soit parce que la fonction est uniquement d'intérêt local. Le C et le C++ fournissent donc le mot clé static qui, une fois placé devant la définition et les éventuelles déclarations d'une fonction, la rend unique et utilisable uniquement dans ce fichier. À part ce détail, les fonctions statiques s'utilisent exactement comme des fonctions classiques.  
 
Exemple 1-19. Fonction statique
 
// Déclaration de fonction statique :
static int locale1(void);
 
/* Définition de fonction statique : */
static int locale2(int i, float j)
{
    return i*i+j;
}


 
[:alisson]

Reply

Marsh Posté le 31-07-2003 à 11:05:21    

giz a écrit :


 
 

Citation :

1.6.6. Fonctions statiques
Par défaut, lorsqu'une fonction est définie dans un fichier C/C++, elle peut être utilisée dans tout autre fichier pourvu qu'elle soit déclarée avant son utilisation. Dans ce cas, la fonction est dite externe. Il peut cependant être intéressant de définir des fonctions locales à un fichier, soit afin de résoudre des conflits de noms (entre deux fonctions de même nom et de même signature mais dans deux fichiers différents), soit parce que la fonction est uniquement d'intérêt local. Le C et le C++ fournissent donc le mot clé static qui, une fois placé devant la définition et les éventuelles déclarations d'une fonction, la rend unique et utilisable uniquement dans ce fichier. À part ce détail, les fonctions statiques s'utilisent exactement comme des fonctions classiques.  
 
Exemple 1-19. Fonction statique
 
// Déclaration de fonction statique :
static int locale1(void);
 
/* Définition de fonction statique : */
static int locale2(int i, float j)
{
    return i*i+j;
}


 
[:alisson]


le mot clé de sa phrase était "membre". :sarcastic:

Reply

Marsh Posté le 31-07-2003 à 11:08:11    

et pour le C++ :
 

Citation :

8.10.2. Fonctions membres statiques
Les classes peuvent également contenir des fonctions membres statiques. Cela peut surprendre à première vue, puisque les fonctions membres appartiennent déjà à la classe, c'est-à-dire à tous les objets. En fait, cela signifie que ces fonctions membres ne recevront pas le pointeur sur l'objet this, comme c'est le cas pour les autres fonctions membres. Par conséquent, elles ne pourront accéder qu'aux données statiques de l'objet.

 
 

Reply

Marsh Posté le 31-07-2003 à 11:10:03    

et  moi je passe mon temps à faire des posts pour les mecs comme vous...

Reply

Marsh Posté le 31-07-2003 à 11:14:59    

et pour l'exemple :
 

Citation :

Exemple 8-15. Appel de fonction membre statique
 
class Entier
{
    static int i;
public:
    static int get_value(void);
};
 
int Entier::i=3;
 
int Entier::get_value(void)
{
    return i;
}
 
int main(void)
{
    // Appelle la fonction statique get_value :
    int resultat=Entier::get_value();
    return 0;
}


 
Conclusion : ben ouai a partir du main(), on n'a pas besoin de creer d'objet pour appeler la fonction ;) (Donc c bien ca).
et ceci et donc moins cracra qu'une variable globale ? (declarer une fonction et une variable en statique ds la classe)

Reply

Marsh Posté le 31-07-2003 à 11:23:14    

les fonctions machin(void) c'est du C pré-ANSI tout ça. c'est inutile. () veut bien dire pas de paramètres.
le return 0 final est facultatif. ton exemple fonctionne bien pour un type de base, pour des objets, c'est autre chose (problème d'initialisation)

Reply

Marsh Posté le 31-07-2003 à 12:32:02    

lorsque qu'on execute une fonction de classe sans creer d'instance, on doit donc la declarer en statique...et si celle ci se sert des donnees menbres de la classe, on doit declarer TOUTES les donnees menbres de la classe en static...c cracra ?

Reply

Marsh Posté le 31-07-2003 à 12:39:26    

Bon mon compilo (VC++6) n'a pas l'air de bien aprecier les fonction membres statique :/ :
 
fichier ccard_comm.h :

Code :
  1. class CCard_comm
  2. {
  3. private :
  4. ...
  5. static int return_value;
  6.         ...
  7. public :
  8.         ...
  9. static int return_value(void);
  10.         ...
  11. };
  12. int CCard_comm::return_value = 0;


 
fichier ccard_comm.cpp :

Code :
  1. static int CCard_comm::return_value(void)
  2. {
  3. return return_value;
  4. }


 
Errors de compilation :
 

Code :
  1. d:\amap\headers\ccard_comm.h(26)[/g] : error C2040: 'return_value' : 'int (void)' differs in levels of indirection from 'int'
  2. d:\amap\sources\ccard_comm.cpp(30) : error C2724: 'return_value' : 'static' should not be used on member functions defined at file scope
  3. d:\amap\sources\ccard_comm.cpp(30) : error C2720: 'return_value' : 'static ' storage-class specifier illegal on members
  4. d:\amap\sources\ccard_comm.cpp(30) : error C2063: 'return_value' : not a function
  5. d:\amap\sources\ccard_comm.cpp(30) : fatal error C1903: unable to recover from previous error(s); stopping compilation


 
des idees ? :/

Reply

Marsh Posté le 31-07-2003 à 12:45:46    

j'ai enleve le mot cle statique dans ccard_comm.cpp...et j'ai plus qu'une erreur (la 1ere de ma reponse precedente)...que je ne comprend pas :( Mon code est le meme que l'exemple que j'ai cite (reponse juste avt Taz)


Message édité par Giz le 31-07-2003 à 12:48:28
Reply

Marsh Posté le 31-07-2003 à 13:04:53    

giz a écrit :

j'ai enleve le mot cle statique dans ccard_comm.cpp...et j'ai plus qu'une erreur (la 1ere de ma reponse precedente)...que je ne comprend pas :( Mon code est le meme que l'exemple que j'ai cite (reponse juste avt Taz)


 
Essaye de changer le nom de la variable...return_value désigne à la fois la variable et la fonction!

Reply

Marsh Posté le 31-07-2003 à 13:16:57    

giz a écrit :

j'ai enleve le mot cle statique dans ccard_comm.cpp...et j'ai plus qu'une erreur (la 1ere de ma reponse precedente)...que je ne comprend pas :( Mon code est le meme que l'exemple que j'ai cite (reponse juste avt Taz)


 
Remet statique pour la fonction et vire moi le nom de ta variable=nom de ta fonction, ce que je t ai indique ca marche tres bien sous VC6 et VC.net et ca compile sans warning ni erreur
 
De plus pas besoin que ta variable de retour soit declare en statique .. et si c car utilisee par d autre thread autre que l appelant dans le code mm des threads c pas une statique qu il te faut (comme dit pThis->unevardelaclasse ca marche) mais une synchro via criticalsection/mutex/semaphore ou autre

Reply

Marsh Posté le 31-07-2003 à 13:20:48    

skeye a écrit :


 
Essaye de changer le nom de la variable...return_value désigne à la fois la variable et la fonction!


vie c bon  :jap: ...je ne savais pas qu'ils ne devaient pas avoir le meme nom :/
....
juste un dernier truc :
 
pour executer un thread 2 facons :
 
On cree une fonction ayant le bon prototype puis on fait comme l'a si bien fais VisualC++ (merci au passage)
ou bien
on met tout en statique dans la classe et on execute directement la fonction de la classe (dans mon cas c possible)
 
c 2eme solution est plus cracra non ?

Reply

Marsh Posté le 31-07-2003 à 13:23:15    

VisualC++ a écrit :


 
Remet statique pour la fonction et vire moi le nom de ta variable=nom de ta fonction, ce que je t ai indique ca marche tres bien sous VC6 et VC.net et ca compile sans warning ni erreur
 
De plus pas besoin que ta variable de retour soit declare en statique .. et si c car utilisee par d autre thread autre que l appelant dans le code mm des threads c pas une statique qu il te faut (comme dit pThis->unevardelaclasse ca marche) mais une synchro via criticalsection/mutex/semaphore ou autre


 
ben une fonction static menbres ne peut acceder qu'au donnees menbres static de la classe  [:spamafote] (cf citation)

Reply

Marsh Posté le 31-07-2003 à 13:31:15    

Oui c vrai .. mais tu lis a moitie les indications donnee et la je peu rien pour toi.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed