[c - ansi] - exemple d'utilisation des pointeurs de fonctions dans le cadre d'un tri a bulle recursif

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 873 fois - Téléchargée 22 fois

Contenu du snippet

J'ai fait ce code afin de mieux comprendre l'utilisation des pointeurs de fonctions fraichement appris. J'ai voulu essayer de coder un algo récursif qui utiliserai un pointeur de fonction afin d'illustrer le fonctionnement de ceux-ci.
Rien d'énorme, juste un petit exemple tout simple pour ceux qui souhaitent un exemple ;) (et me permettre de clarifier certains points)

L'algo utilisé est un tri a bulle récursif, largement diffusé sur ce site ainsi que sur le net. La petite nouveauté (si on peut dire cela), c'est que la fonction utilise un pointeur sur elle même pour faire de la récursivité. J'ai essayé de commenter le plus possible mais n'hésitez pas a me demander d'autre explications si le code vous parait confus.

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define TAB_INT_LEN     150
#define MAX_GEN_VALUE   1000

/* Prototypes de fonctions */
void TriABulle(size_t *, size_t, void *);
void Affiche(size_t *, size_t);

/* Nouveau type de donnee : pointeur vers fonction (tres specifique a la fonction TriABulle() ) */
typedef void (*pFunc)(size_t *, size_t, void *);

int main( void )
{
    /* Initialisation du generateur de temps */
    srand((unsigned)time(NULL));
    
    /* Creation d'un tableau */
    size_t *pstTable = (int *)calloc(TAB_INT_LEN, sizeof(size_t));
    
    /* Remplissage aleatoires des cases avec des valeurs de 0 a MAX_GEN_VALUE */ 
    size_t i;
    for ( i=0; i<TAB_INT_LEN; i++ )
        pstTable[i] = rand()%(MAX_GEN_VALUE+1);
    
    /* Affiche le resultat avant le tri */
    Affiche(pstTable, TAB_INT_LEN);
    
    /* Creation pointeur de fonction et appel */
    pFunc pFuncTri = &TriABulle;
    (*pFuncTri)(pstTable, TAB_INT_LEN, (void *)pFuncTri);
    
    /* Affiche le resultat apres le tri */
    printf("\n\n");
    Affiche(pstTable, TAB_INT_LEN);
    
    /* Libere le tableau alloue */
    free(pstTable);
    
    return EXIT_SUCCESS;    
}

/* Affiche les valeurs du tableau passe en param */
void Affiche(size_t *stBuff, size_t stBuffLen)
{
    size_t i;
    for ( i=0; i<stBuffLen; i++ )
        printf("%d ", stBuff[i]);
}

/* Execute un tri a bulle de facon recursive */
void TriABulle(size_t *piTable, size_t stTableLen, void *pvFunc)
{
    /* On cast le param pvFunc en pointeur de fonction */
    pFunc pTriABulle = (pFunc)pvFunc;
    
    /* On declarre iTemp qui recevra les valeurs temporaires */
    size_t iTemp = 0;
    
    /* Parcours le tableau */
    size_t i;
    size_t iT;
    for ( i=1; i<(stTableLen); i++ )
    {
        iT = i - 1;
        if ( piTable[iT] > piTable[i] )
        {
            iTemp = piTable[iT];
            piTable[iT] = piTable[i];
            piTable[i] = iTemp;
            (*pTriABulle)(piTable, stTableLen, pvFunc); 
        }
    }
}

Conclusion :


Venant à peine d'apprendre et de comprendre le mode de fonctionnement des pointeurs de fonctions, tout commentaire me sera utile ;)

Merci et bon coding :P

A voir également

Ajouter un commentaire Commentaires
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
24 sept. 2007 à 23:28
Bah c'est cool mais tu proposes quoi d'autres ? Je pensais que free() faisait correctement son boulot...
ketrika_cpp Messages postés 2 Date d'inscription jeudi 26 juillet 2007 Statut Membre Dernière intervention 10 août 2007
10 août 2007 à 09:34
je pense que la fonction free c'est pas bon pour la suppression d'une chaine! non
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
7 juin 2007 à 23:54
Ok merci beaucoup, c'est plus clair maintenant ;-) (et plus simple surtout ^^)

@++
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
7 juin 2007 à 13:00
salut

ce ne sont pas des pointeurs de fonctions mais bel et bien des pointeurs de pointeurs de fonctions que tu utilises !!

int mafonction () {
return 5;
}

int main() {
int (*func)() = mafonction;
int k = func();
int (**pfunc)() = &func;
int kk = (*pfunc)();
printf(" %d %d ",k,kk);
}

attention : void *ptr = mafonction;
ou void *ptr = &mafonction;
auront le même résultat

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.