Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1911 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  caster une fonction

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

caster une fonction

n°472205
Giz
Posté le 30-07-2003 à 16:44:23  profilanswer
 

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
mood
Publicité
Posté le 30-07-2003 à 16:44:23  profilanswer
 

n°472235
Giz
Posté le 30-07-2003 à 16:55:24  profilanswer
 

prototype c vrai :D
 

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


 

n°472286
Kristoph
Posté le 30-07-2003 à 17:24:19  profilanswer
 

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 ...

n°472317
Giz
Posté le 30-07-2003 à 17:39:03  profilanswer
 

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
n°472324
Taz
bisounours-codeur
Posté le 30-07-2003 à 17:44:06  profilanswer
 

les cast C, capuducucu

n°472325
Giz
Posté le 30-07-2003 à 17:44:58  profilanswer
 

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
n°472330
Giz
Posté le 30-07-2003 à 17:50:04  profilanswer
 

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:

n°472336
VisualC++
J'va y penser ...
Posté le 30-07-2003 à 17:55:36  profilanswer
 

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

n°472341
Giz
Posté le 30-07-2003 à 18:02:15  profilanswer
 

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 ?  :??:

n°472347
VisualC++
J'va y penser ...
Posté le 30-07-2003 à 18:11:35  profilanswer
 

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

mood
Publicité
Posté le 30-07-2003 à 18:11:35  profilanswer
 

n°472355
Giz
Posté le 30-07-2003 à 18:22:04  profilanswer
 

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
n°472392
Kristoph
Posté le 30-07-2003 à 19:12:41  profilanswer
 

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 :)

n°472897
Giz
Posté le 31-07-2003 à 10:58:47  profilanswer
 

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]

n°472909
skeye
Posté le 31-07-2003 à 11:05:21  profilanswer
 

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:

n°472914
Giz
Posté le 31-07-2003 à 11:08:11  profilanswer
 

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.

 
 

n°472916
Taz
bisounours-codeur
Posté le 31-07-2003 à 11:10:03  profilanswer
 

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

n°472928
Giz
Posté le 31-07-2003 à 11:14:59  profilanswer
 

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)

n°472960
Taz
bisounours-codeur
Posté le 31-07-2003 à 11:23:14  profilanswer
 

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)

n°473062
Giz
Posté le 31-07-2003 à 12:32:02  profilanswer
 

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 ?

n°473070
Giz
Posté le 31-07-2003 à 12:39:26  profilanswer
 

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 ? :/

n°473073
Giz
Posté le 31-07-2003 à 12:45:46  profilanswer
 

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
n°473078
skeye
Posté le 31-07-2003 à 13:04:53  profilanswer
 

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!

n°473084
VisualC++
J'va y penser ...
Posté le 31-07-2003 à 13:16:57  profilanswer
 

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

n°473088
Giz
Posté le 31-07-2003 à 13:20:48  profilanswer
 

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 ?

n°473089
Giz
Posté le 31-07-2003 à 13:23:15  profilanswer
 

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)

n°473095
VisualC++
J'va y penser ...
Posté le 31-07-2003 à 13:31:15  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  caster une fonction

 

Sujets relatifs
[Perl] classer des e-mails en fonction du fournisseurdefinir une touche qui lancera une fonction a n importe quel moment ?
besoin de testeurs: retour de fonctionChanger une image en fonction de la sélection d'un menu déroulant ?
listbox qui se place en fonction des caracteres tapésfonction de remplacement de html_entity_decode()
Dans excel : affecter un intitulé en fonction d'une valeurGestion des erreurs sur la fonction mail.
[php] cherche Fonction pour lire un fichier en phpamnesie: fonction pour obtenir la page qui a appelé le script php ?
Plus de sujets relatifs à : caster une fonction


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR