Pointeur sur fonction
Résolu
anthony
-
anthony -
anthony -
Bonsoir,
Alors voici un code que je ne comprends pas très bien :
ici ce que je ne comprends pas c'est ceci:
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 ??
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:
- Pointeur sur fonction
- Fonction si et - Guide
- Pointeur souris - Guide
- Curseur Windows 10 : comment bien voir la souris à l'écran - Guide
- Fonction miroir - Guide
- Fonction remplacer sur word - Guide
3 réponses
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!
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!