Pointeur sur fonction

Résolu/Fermé
anthony - 24 avril 2010 à 02:24
 anthony - 25 avril 2010 à 13:30
Bonsoir,
Alors voici un code que je ne comprends pas très bien :

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

#define MAXLINES 25

int get_lines(void);
void sort(char *p[], int n, int sort_type);
void print_strings(char *p[], int n);
int lire_clavier(char *str, int taille);
int alpha(char *p1, char *p2);
int reverse(char *p1, char *p2);

char *lines[MAXLINES];

int main()
{
    int number_of_lines, sort_type;

    number_of_lines = get_lines();

    if(number_of_lines < 0)
    {
        puts("Erreur d'allocation mémoire");
        exit(EXIT_FAILURE);
    }

    puts("Tapez 0 pour trier en ordre alphabétique inverse");
    puts("ou 1, pour trier en oredre alphabétique direct :");

    scanf("%d", &sort_type);

    sort(lines, number_of_lines, sort_type);
    print_strings(lines, number_of_lines);
    exit(EXIT_SUCCESS);
}

int get_lines(void)
{
    int n = 0;
    char buffer[80];

    puts("Tapez les phrases une par une");
    puts("Terminez par une simple appui sur Entrée");

    while(n < MAXLINES && (lire_clavier(buffer, sizeof(buffer))) != 0)
    {
        if((lines[n] = malloc(strlen(buffer)+1)) == NULL)
            return -1;

        strcpy(lines[n++], buffer);
    }
    return n;
}

void sort(char *p[], int n, int sort_type)
{
    int a, b;
    char *x;

    int (*compare)(char *s1, char *s2);

    compare = sort_type ? reverse : alpha;

    for(a = 1; a < n; a++)
        for(b = 0; b < n-1; b++)
        {
            if(compare(p[b], p[b+1]) > 0)
            {
                x = p[b];
                p[b] = p[b+1];
                p[b+1] = x;
            }
        }
}

void print_strings(char *p[], int n)
{
    int count;
    for(count = 0; count < n; count++)
        printf("%s\n", p[count]);
}

int alpha(char *p1, char *p2)
{return strcmp(p2, p1);
}

int reverse(char *p2, char *p1)
{strcmp(p1, p2);
}

int lire_clavier(char *str, int taille)
{
    int i;
    fgets(str, taille, stdin);
    str[taille-1] = '\0';
    for(i=0; str[i]; i++)
    {
        if(str[i] == '\n')
        {
            str[i] = '\0';
            break;
        }
    }
    return(i);
}


ici ce que je ne comprends pas c'est ceci:

void sort(char *p[], int n, int sort_type)
{
    int a, b;
    char *x;

    int (*compare)(char *s1, char *s2);

    compare = sort_type ? reverse : alpha;

    for(a = 1; a < n; a++)
        for(b = 0; b < n-1; b++)
        {
            if(compare(p[b], p[b+1]) > 0)
            {
                x = p[b];
                p[b] = p[b+1];
                p[b+1] = x;
            }
        }
}


ce que je ne comprends pas c'est le pointeur sur fonction, ici comme on peut le voir il est initialisé par une condition qui dépend de la valeur de la variable sort_type
donc imaginons que sort_type vaut 1 alors le pointeur compare va pointer sur la fonction reverse. Puis ensuite il y a une boucle imbriquée si on regarde la boucle interne on peut voir qu'elle utilise le pointeur compare qui lui même va utiliser la fonction reverse mais c'est a partir de la que je ne comprends pas, la fonction reverse retourne strcmp(p1, p2) mais ces chaine p1 et p2 d'ou sort-il ?
dans la fonction main() on fait pas appel a la fonction reverse donc on ne peut pas lui transmettre des chaines en entrée ??

A voir également:

3 réponses

chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
Modifié par chuka le 25/04/2010 à 11:23
Salut,
la fonction get_lines() va remplir ton tableau lines des adresses de tes chaines de caractères saisies, puis les copier.
Tu passes en argument de la fonction sort le tableau précédemment rempli: lines. (ce qui ne semble pas nécessaire car lines est déclaré en tant que variable globale...mais bon, pourquoi pas...)
Donc,compare(p[b], p[b+1]), prend ici comme argument les pointeurs du tableau lines à l'index b et b+1 qui sont bien de type char*... donc p1=p[b+1]=lines[b+1] et p2=p[b]=lines[b]...strcmp(p1, p2) equivaut donc à strcmp(lines[b+1], lines[b])
dans la fonction main() on fait pas appel a la fonction reverse donc on ne peut pas lui transmettre des chaines en entrée ??
Une fonction ne'est pas forcement appelé dans le main....mais peut être appelé n'importe où...notamment dans une autre fonction!!
@+
Ce n'est pas parce que certaines choses semblent inexplicables, qu'il faut faire semblant de les expliquer!
1
quelqu'un peut m'aider ???
0
ah ok je comprends
ben merci de ton aide
0