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

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

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.