Pointeurs de fonction dans des structures

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 923 fois - Téléchargée 30 fois

Contenu du snippet

Ce code montre comment stocker vos fonctions dans une structure et cmt les utiliser par la suite...

Source / Exemple :


#include <stdlib.h>
#include <unistd.h>

typedef struct compteur {
	int nb;

	void (*increment)(struct compteur *this);
	void (*decrement)(struct compteur *this);

	int (*getValue)(struct compteur *this);
	void (*setValue)(struct compteur *this, int n);

	void (*free)(struct compteur *this);
} compteur;

/* définition des différentes méthodes */
void __compteur__increment(compteur *this){
	this->nb++;
}

void __compteur__decrement(compteur *this){
	this->nb--;
}

int __compteur__getValue(compteur *this){
	return this->nb;
}

void __compteur__setValue(compteur *this, int n){
	this->nb = n;
}

/* fin des méthodes  générales */

/* méthodes particulières */

	// destructeur
	void __compteur__free(compteur *this){
		free(this); // libération
	}

	// constructeur
	compteur *Compteur() {
		compteur *n = malloc(sizeof(compteur)); // allocation

		n->nb = 0;

		// set des fonctions
		n->increment = __compteur__increment;
		n->decrement = __compteur__decrement;
		n->getValue = __compteur__getValue;
		n->setValue = __compteur__setValue;
		n->free = __compteur__free;

		return n;
	}
/* fin méthodes particulières */

int main(void){
	// création
	compteur *c = Compteur();

	// traitement
	c->setValue(c,20);
	c->increment(c);
	c->increment(c);

	// affichage
	printf("%d\n",c->getValue(c)); 

	// libération
	c->free(c);
}

Conclusion :


Voila, ce code doit donner 22 (20+1+1).
Réalisé pour Jingle

A voir également

Ajouter un commentaire

Commentaires

NitRic
Messages postés
409
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
-
Note:

typedef double (*__function)( double );
__function MaFonction;

(*MaFonction)( une_valeur ); /* fonctionnel */
MaFonction( une_valeur ); /* fonctionnel */

Pour appeller la fonction, le (*...) n'est pas obligatoire, ou plutôt, n'est _plus_ obligatoire ...


Donc ` tab[i].test( tab[i].nb ); ` suffit ...




~(.:: NitRic ::.)~
Taranael
Messages postés
54
Date d'inscription
dimanche 27 février 2005
Statut
Membre
Dernière intervention
21 juin 2007
1 -
Le code a l'air correct mais pourquoi mettre niveau Initié ?
gilids
Messages postés
7
Date d'inscription
jeudi 11 décembre 2003
Statut
Membre
Dernière intervention
19 avril 2006
-
Tu sais que tu es en train de réinventer la notion d'objet ? ;-)
NitRic
Messages postés
409
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
-
`réinventer la notion d'objet` ... et bien ... sans commentaire ...




~(.:: NitRic ::.)~
Arnaud16022
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2 -
Lol tu m'étonnes, ce code est bien pour savoir comment ca marche mais de la a se mettre en Initié ya un gouffre
autre chose:
(*tab[i].test)(tab[i].nb)
heu...
c'est correct mais chiant, le C++ a crée une nouvelle notation (heu nouvelle, elle a bien 15 ans hein)
tab[i]->test(tab[i].nb)
c'est plus compréhensible comme ca non?
++
ad

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.