begin process at 2012 02 09 14:55:16
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > [C - ANSI] - EXEMPLE D'UTILISATION DES POINTEURS DE FONCTIONS DANS LE CADRE D'UN TRI A BULLE RECURSIF

[C - ANSI] - EXEMPLE D'UTILISATION DES POINTEURS DE FONCTIONS DANS LE CADRE D'UN TRI A BULLE RECURSIF


 Information sur la source

Note :
5 / 10 - par 1 personne
5,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :recursif, pointeurs, fonctions, tri, bulles Niveau :Débutant Date de création :06/06/2007 Vu :6 231

Auteur : jean84

Ecrire un message privé
Site perso
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 Description

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

  • #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);
  • }
  • }
  • }
#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


 Sources du même auteur

Source avec Zip Source avec une capture [DEV / WIN32 / C++] GENERATEUR DE SCRIPT POUR NTBACKUP
Source avec Zip CLASSE WINSOCK POUR NEWBIE
Source avec Zip NEWBIE/LINUX/QT : LECTEUR VIRTUEL
FRAME SIMPLE EN QT POUR NEWBIE

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture [C++] CLASSE DE GESTION DE FONCTIONS par pop70
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70
Source avec Zip COMPARATIF DES TRIS QUADRATIQUE par gnairod
Source avec Zip POINTEURS DE FONCTIONS DANS LE CAS D'UN TRI PAR SELECTION GÉ... par rabbbi
Source avec Zip PRINCIPALES FONCTIONS DE TRI par yphelizo

Commentaires et avis

Commentaire de acx01b le 07/06/2007 13:00:37

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

Commentaire de jean84 le 07/06/2007 23:54:16

Ok merci beaucoup, c'est plus clair maintenant ;-) (et plus simple surtout ^^)

@++

Commentaire de ketrika_cpp le 10/08/2007 09:34:19

je pense que la fonction free c'est pas bon pour la suppression d'une chaine! non

Commentaire de jean84 le 24/09/2007 23:28:26

Bah c'est cool mais tu proposes quoi d'autres ? Je pensais que free() faisait correctement son boulot...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

j'utilise qsort pour le tri mais il faut créer des fonctions globales [ par djmix73 ] Comment fait on pour créer des fonctions globale avec visual c++6 pour quel se mette dans le dossier globale? pointeurs et fonctions [ par alfred289 ] tableau de pointeurs de fonctions [ par trapic ] Bonjour, &nbsp;&nbsp;&nbsp; J'aimerais r&#233;aliser une proc&#233;dure appelant une liste de fonctions variables &#224; argument variables. Exemple Pointeurs sur fonction entre class [ par zeGouky ] Bonjour,voilà j'ai un petit soucis avec les pointeurs de fonctions, je m'explique j'ai une class A et une class B tel que :class A {     int  mafuncti Pointeurs fonctions de types inconnus [ par Galmiza ] Bien le bonjour,J`aimerai recuperer des pointeurs vers des fonctions dont je ne connais pas le type a l`avance.Ex:DWORD FonctionAlacon(char* pStr){&nb Génération de nom de fonctions [ par buno ] Bijour les gens!J'ai besoin votre avis sur le "probl&#232;me" suivant:Dans une fonction,&nbsp;on trouve&nbsp;ce morceau de code:switch (mode){&nbsp; c Langage C(niveau débutant): tableaux et pointeurs [ par DeltaX ] Bonjour &#224; tous.J'ai trouv&#233; ce site par hazard et esp&#232;re que quelqu'un aura quelques secondes pour m'aider, mon niveau &#233;tant tr&#23 Debutant - Pointeurs [ par DeltaX ] Bonjour.Je d&#233;bute en programmation(je commence par le C)&nbsp;et, et m&#234;me si je sais &#224; peu pr&#232;s comment ils fonctionnent(d&#233;cl problemme de complilation avec Borland C++ [ par yev ] Bonjour a tous, je sis nouveau sur le forum.je viens chercher du secour, et voila mon prob:je fais un petit programme en C avec un fichier.h avec les& Déclaration de pointeurs [ par sevenace ] Salut &#224; tous ! Je sais tr&#232;s bien d&#233;clarer des pointeurs (type Personne: une de mes classes) dans le Unit.h, et les initialiser dans le


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,368 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales