# Pointeur de fonction dans une structure 'C'



## claw59 (17 Mai 2007)

bonjour,

dans le but de me fabriquer des petits exercices de tutorial, j'aimerai apprendre à utiliser correctement des pointeurs de fonctions dans des structures 'C' sous Objective-c.



```
typedef struct _gParticle {

....
Particle *p;
vectorGradiant *lpGradiant;
...

CFMutableDictionaryRef (*remplirSchemaConfig)(CompetenceAlpha); 

} gParticle, *lgParticle;
```

Mon problème c'est que quand je fais :


```
lgParticle myParticle;

myParticle=(gParticle*)malloc(50*sizeof(gParticle));

myParticle->....
```

he bien je n'arrive pas à accéder à mon pointeur de fonction, ou est mon erreur ??


----------



## ntx (17 Mai 2007)

Tu pourrais compléter ton code stp pour qu'on voit l'appel à la fonction.  

PS : en programmation objet, les pointeurs sur des fonctions ne sont plus utilisés, on passe par des objets de type "functor".


----------



## claw59 (18 Mai 2007)

En fait le code provient du code source exemple fournit par apple avec Xcode sous l'appellation 'FlurryDemo', j'essaye de comprendre comment je pourrais utiliser leur code &#224; mon escient. Aussi, je veux r&#233;utiliser leur structure 'global_info_t' contenu originellement dans le fichier 'gl_saver.h' et y rajouter un dictionnaire comme CFMutableDictionaryRef' contenant un ensemble d'informations de configuration des particules.

De cette mani&#232;re, durant l'utilisation de l'animation openGL 'flurry' sur un contr&#244;le NSOPENGLVIEW je peux utiliser un NSTableView contenant toutes les propri&#233;t&#233;s des particules comme la pression, le poids, la vitesse d'expansion, etc... et les modifier "&#224; la vol&#233;e".

Aussi je veux rajouter dans ma structure un pointeur de fonction d&#233;clarant une m&#233;thode comme :

```
CFMutableDictionaryRef modifierSchemaConfig(CompetenceAlpha competence)
{
...
...
...
}

CFMutableDictionaryRef initialiserSchema(CompetenceAlpha competence)
{
...
..
...
}
```

En sachant que cette structure est d&#233;clar&#233; dans un fichier 'C' comme 'Fourniture.h'
que les fonctions associ&#233;s aux pointeurs de fonctions sont d&#233;clar&#233;s dans le fichier 'Fourniture.c'.

Cette structure a pour vocation &#224; &#234;tre utilis&#233; dans un objet 'Objective-C' tel que :



```
/* objet pluriel de stockage dynamique */
@interface FlurriesArray: NSObject    
{

NSMutableArray *myFlurries;

}


/* objet singulier r&#233;f&#233;ren&#231;ant des comp&#233;tences en langage 'C' et 'CoreFoundation' */
@interface Flurry: NSObject
{
NSTimer *timeLife; //gestion de la dur&#233;e de vie d'une particule
gParticle *myParticle; //si malloc(50*sizeof(gParticle)) alors on a un flot &#233;l&#233;mentaire de particules

}

-(BOOL)activateParticleWithColor: (NSColor *)aColor  withPhysique: (NSMutableDictionary *)dicoPhysique

@end

donc je voudrais utiliser mon pointeur de fonction de la fa&#231;on suivante :

-(BOOL)activateParticleWithColor: (NSColor *)aColor  withPhysique: (NSMutableDictionary *)dicoPhysique
{
myParticle=(gParticle*)malloc(50*sizeof(gParticle));

myParticle->initialiserSchema(Competence); // Competence obtenu gr&#226;ce &#224; dicoPhysique
myParticle->evolutionSchema(CompetenceGradiant); // comp&#233;tence du gradiant de la particule
myParticle->associationSchema(competenceDivergeant); // divergeant associ&#233; du support particule
myParticle->inclusionSchema(competenceRotationnel); //prise en compte du rotationnel pour la gestion de l'entit&#233; d&#233;di&#233; des particules.

}
```


----------



## ntx (18 Mai 2007)

Un petit tour sous Google pour avoir quelques exemples.
Il semble qu'il manque une &#233;tape initialisant les pointeurs de fonction dans ta structure et les fonctions &#224; pointer. A chaque instanciation d'une variable du type de ta structure, il faut initialiser les membres de cette structure.

Et tu sais que tu joues &#224; M. Jourdain : faire de la programmation objet sans le savoir  
D&#233;clare une classe Particle qui englobe la structure _gParticle, &#231;a sera quand m&#234;me plus simple.


----------



## claw59 (18 Mai 2007)

merci pour ton aide... de mon côté je me suis rendu compte par ton lien en provenance de CPPFrance.com que c'est un code classique C/C++

Or sous Xcode quand on utilise nativement l'objective-C, puisque c'est une surcouche du C, il ne reconnaît rien du C++ .... et je crois que rajouter des pointeurs de fonctions dans une structure, c'est une particularité d'extention du C pour obtenir du C++.

Donc, moralité :

La structure doit être placé dans un fichier C comme par exemple 'Fourniture.h'
L'objet 'C++' qui va utiliser les pointeurs de fonction dans une classe comme 'FournitureAlpha'.

utiliser l'objet 'FournitureAlpha' dans un objet objective-C comme 'Flurry' et modifier le suffix de 'Flurry.m' en 'Flurry.mm' pour que le compilateur puisse valider l'objective-C++ (c'est à dire utiliser conjointement les caractéristiques du C++ conjointement avec l'objective-C) et là à mon avis cela devrait rentrer dans l'ordre.


----------



## ntx (18 Mai 2007)

claw59 a dit:


> utiliser l'objet 'FournitureAlpha' dans un objet objective-C comme 'Flurry' et modifier le suffix de 'Flurry.m' en 'Flurry.mm' pour que le compilateur puisse valider l'objective-C++ (c'est à dire utiliser conjointement les caractéristiques du C++ conjointement avec l'objective-C) et là à mon avis cela devrait rentrer dans l'ordre.


Effectivement si tu veux utiliser du code C++ dans une application Obj-C, il suffit de renommer les fichiers .m en .mm. Il fallait commencer par cette question avant de te lancer dans tes pointeurs de fonctions. :rateau:


----------

