Soyez le premier à donner votre avis sur cette source.
Snippet vu 8 126 fois - Téléchargée 30 fois
#include <conio.h> #include <stdio.h> #include <stdlib.h> void swap(void*, void*, size_t); void sort(void*, size_t, size_t, int (*)(void*, void*)); int char_superieur_ou_egal(void *a, void *b) { return *((char*)a)>=*((char*)b); } int char_inferieur_ou_egal(void *a, void *b) { return *((char*)a)>=*((char*)b); } void swap(void *buffer1, void *buffer2, size_t size) { void *buffer3; buffer3 = malloc(size); memcpy(buffer3, buffer1, size); memcpy(buffer1, buffer2, size); memcpy(buffer2, buffer3, size); free(buffer3); } void sort(void *buffer, size_t size, size_t count, int (*compare)(void*, void*)) { size_t left, right, i; void *temp; temp = (void*) malloc(size); for(right=0; right<count; right++) { memcpy(temp, buffer+size*right, size); for(left=0; left<right; left++) if(compare(buffer+size*right, buffer+size*left)==1) break; if(left<right) { for(i=right; i>left; i--) memcpy(buffer+size*i, buffer+size*(i-1), size); memcpy(buffer+size*left, temp, size); } } free(temp); } #define TAB_COUNT 5 #define AFFICHER_LE_TABLEAU for (i=0; i<TAB_COUNT; i++) printf("%d\n", tab[i]) main() { //on a besoin d'un tableau et d'une variable pour les boucles char tab[TAB_COUNT], i; int (*comparaison)(void*, void*); //on rempli le tableau dont on affiche les valeurs for (i=0; i<TAB_COUNT; i++) tab[i]=rand()%20; AFFICHER_LE_TABLEAU; //tri dans l'ordre décroissant printf("\n"); sort(tab, sizeof(char), TAB_COUNT, &char_superieur_ou_egal); AFFICHER_LE_TABLEAU; //tri dans l'ordre croissant printf("\n"); sort(tab, sizeof(char), TAB_COUNT, &char_inferieur_ou_egal); AFFICHER_LE_TABLEAU; //on inverse les deux premiers éléments du tableau printf("\n"); swap(&tab[0], &tab[1], sizeof(char)); AFFICHER_LE_TABLEAU; getch(); }
14 juil. 2012 à 19:39
une fonction sommet qui retourne le sommet de la pile passée en paramètre
4 juin 2004 à 00:08
{
return (strcmp(a, b) >= 0);
} // mais ou est l'interet ? "
l'interet est tout simplement de faire une fonction pour classer des chaines de caracteres dans l'odre alphabétique, mais c'est juste un exemple. apres c vrai que tu peux refaire ta fonction de comparaison de chaine de caracteres mais autant utiliser ce qui existe et fonctionne... (je precise que si tu veux classer des mots dans l'ordre alphabétique il faut aupravant mettre les lettres de chaque mot au meme format cad: soit majuscule soit minuscule)
bool n'est pas ansi c vrai, mais tu peux faire typedef char bool .... mais bon la plus part des compilateurs le reconnaissent ainsi...
c juste que niveau comprehension (et pas compression faute de frappe) c qd meme préférable (a noter que toute librairie , api etc qui se respecte defini un type booléen)
et j'avais ecrit :
int char_superieur_ou_egal(void *a, void *b)
{
return (strcmp((char*)a, (char*)b) >= 0);
}
parce que son compilateur provoque une erreur de cast si c pas de format int(*)(void*,void*)
dri >> "return (strcmp(a, b) >= 0
Il me semble que faire ca n'est justement pas bon. Je vérifirai mais il me semble qu'en le faisant on ne donne pas l'adresse des chaines à comparer mais l'adresse de leurs poibteurs respectifs... C'est pour ca que je voulais passer cette adresse à d'autres variables et que je suis passé par des memcpy, ne sachant faire autrement
"
et ben justement ca c bon puisque qu'une chaine de caractere c un tableau de taille FIXE dont le pointeur sur le premier caractere est le nom de ta variable sachant que ta chaine de caractere se finit des l'apparition du premier caractere nul '\0'
tu peux refaire ta fonction de comparaison si tu le veux mais strcmp te permet de savoir facilement(et de facon portable et optimisée) si les chaines sont identiques, inferieures ou supérieures...
30 mai 2004 à 11:17
Dri
29 mai 2004 à 17:58
temp = malloc(size);
il te balance une erreur?
29 mai 2004 à 17:41
Dri
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.