Pointeur de fonction dans une structure 'C'

claw59

Membre actif
14 Décembre 2005
119
1
Dunkerque
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.


Bloc de code:
typedef struct _gParticle {

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

CFMutableDictionaryRef (*remplirSchemaConfig)(CompetenceAlpha); 

} gParticle, *lgParticle;

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

Bloc de code:
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 ??
 
Tu pourrais compléter ton code stp pour qu'on voit l'appel à la fonction. :zen:

PS : en programmation objet, les pointeurs sur des fonctions ne sont plus utilisés, on passe par des objets de type "functor".
 
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 à mon escient. Aussi, je veux ré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ère, durant l'utilisation de l'animation openGL 'flurry' sur un contrôle NSOPENGLVIEW je peux utiliser un NSTableView contenant toutes les propriétés des particules comme la pression, le poids, la vitesse d'expansion, etc... et les modifier "à la volée".

Aussi je veux rajouter dans ma structure un pointeur de fonction déclarant une méthode comme :
Bloc de code:
CFMutableDictionaryRef modifierSchemaConfig(CompetenceAlpha competence)
{
...
...
...
}

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

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

Cette structure a pour vocation à être utilisé dans un objet 'Objective-C' tel que :


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

NSMutableArray *myFlurries;

}


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

}

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

@end

donc je voudrais utiliser mon pointeur de fonction de la façon suivante :

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

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

}
 
Un petit tour sous Google pour avoir quelques exemples.
Il semble qu'il manque une étape initialisant les pointeurs de fonction dans ta structure et les fonctions à 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 à M. Jourdain : faire de la programmation objet sans le savoir :D
Déclare une classe Particle qui englobe la structure _gParticle, ça sera quand même plus simple. :D
 
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.
 
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: :p :D