begin process at 2010 02 10 00:51:34
  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 :4 833

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 OPERATION SUR LES MATRICES CARREES AVEC CLASSE GENERIQUE par chouhad
Source avec une capture OPÉRATIONS SUR MATRICES C++ par Minilogus
[DEV-C++] CALCUL DE LA RACINE CARRÉE D'UN RÉEL par Jhep
PROGRAMME QUI CALCUL LE PPCM ET LE PGCD par AnoSantino
EVALUER UNE EXPRESSION MATHÉMATIQUE par begueradj

 Sources en rapport avec celle ci

Source avec Zip COMPARATIF DES TRIS QUADRATIQUE par gnairod
Source avec Zip COMBSORT ALGORITHME DE TRI SIMPLE RAPIDE NON-RECURSIF par xtremejames183
Source avec Zip FRACTIONS_DLL, UNE DLL QUI CALCULE DES FRACTIONS par ghuysmans99
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 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 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 xml-RPC [ par electroonn ] Bonjour,    je veux realiser un protocole d'appelle de fonctions a distance, c-a-d une machine cliente qui envoit a un serveur une fonctions avec ses Fonctions avec paramètres... [ par flamgreg ] Bonjour à tous,Je vous explique mon petit problème.  Je créer un logiciel de compta et j'aurais besoin d'aide en ce qui concerne la gestion des formul Urgent - Créer Bibliothèque [ par otavioreis ] Bonjour,   <p class="MsoNormal" st Ou sont les sources [ par gambi01 ] Bonjour,Ma question va sembler bien naïve.Je sais que l'on doit inclure des fichiers entète .h dans son source.Je regarde un fichier h (par ex :stdio. de C# à C++ [ par tayourt ] Bonjour, J'ai un code C# et je veux le changer à un code C++ (exigences de l'entreprises).. Le problème contient plusieurs fonctions comme IsIconic et


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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 : 0,686 sec (4)

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