begin process at 2012 05 27 21:05:50
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > [C] LE TRI, L'ÉCHANGE ET LES POINTEURS

[C] LE TRI, L'ÉCHANGE ET LES POINTEURS


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Niveau :Débutant Date de création :22/05/2004 Date de mise à jour :28/05/2004 11:03:25 Vu :5 170

Auteur : Dri

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

 Description

J'ai commencé par coder une fonction swap, ensuite je me suis dit que je pourrais m'en servir pour faire un tri bulle mais je me suis rappellé que le tri bulle je ne l'aime pas ^^...
Donc j'ai essayé de coder une fonction sort à ma sauce et comme y'a une chose que j'aime bien en C et qui s'apelle "pointeur" bah j'en ai usé et abusé ^^

Ce code est donc fait en C, très probablement compatible C++ et prend pour exemple un tableau char de 5 éléments... J'utilise le mode console pour afficher les résultats... C'est surtout les algos qui comptent pour moi...

J'ai utilisé le type de données size_t parce que c'est plus court à écrire que unsigned long ^^ et surtout parce que je l'ai vu dans plusieurs biblios (il est là donc autant l'utiliser)...

Les fonctions qui ne sont pas de moi sont :
malloc()
free() (quand on utilise malloc vaut mieux avoir celui là aussi...)
memcpy()

Je les aurai bien aussi codées moi même mais bon l'assembleur en ligne n'est pas le même partout et puis a part memcpy j'aurai pas pu coder grand chose...

J'essairai de les commenter, car seule la fonction main() l'est... Mais ceux qui connaissent le tri par insertion doivent pouvoir facilement s'y retrouver.

Voila... 36 15 My Life c'est terminé...

Source

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

 Conclusion

Au programme, surtout ce qui touche à la mémoire :
  -pointeurs
  -pointeurs de fonction
  -allocation dynamique
  -libération de la mémoire

Le tout de façon générique (fonctionne avec "tous" les types)

Avec ca comme point de départ (surtout le swap...) on peut facilement mettre en oeuvre une biblio en C pour faire des listes chaînées, je pense que je vais me lancer là dedans.


 Sources du même auteur

PLUS GRAND DÉNOMINATEUR COMMUN
Source avec Zip Source avec une capture CHRONO EN IMAGE (AVEC ALLEGRO SOUS DEV CPP)

 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

Commentaires et avis

Commentaire de Dri le 22/05/2004 18:22:56

Voila, j'espere avoir quelques commentaires sur des erreurs éventuelles etc...

Dri

Commentaire de djl le 22/05/2004 19:44:54

la seul fois ou tu utilise swap c'est pour faire
swap(&tab[0], &tab[1], sizeof(char));
alors que swap(char,char) aurait suffit

Commentaire de BruNews le 22/05/2004 20:15:24 administrateur CS

Dans char_superieur_ou_egal tu utilises memcpy, inutile.
Un pointeur se dereference, *((char*) a) irait bon.

Commentaire de Dri le 23/05/2004 00:00:59

Pour répondre à djl, c'est un swap générique, là pour l'exemple j'utilise des char mais c'est supposer être fonctionnel pour n'importe quel type...

Sinon pour les memcpy() inutiles, comme je ne savais pas faire autrement j'ai fais comme ca... Ce serait sympa de me donner un exemple avec cette fonction là.

Dri

Commentaire de Dri le 23/05/2004 00:14:29

C'est bon j'ai modifié la source...
Merci de la remarque :)

Dri

Commentaire de djl le 23/05/2004 00:32:15

dans swap tu cast un void* en void*

buffer3 = (void*) malloc(size); ?? il n'y a pas de cast qui tienne avec les types de bases

Commentaire de JCDjcd le 23/05/2004 10:46:48

#define AFFICHER_LE_TABLEAU for (i=0; i&lt;TAB_COUNT; i++) printf("%d\n", tab[i])


Il serait largement preferable de faire une fonction, ce qui serait plus simple, car la tu est dependant du nom de la variable &lt;i&gt;

Commentaire de djl le 23/05/2004 10:54:42


en c99 tu peux faire

inline void AFFICHER_LE_TABLEAU()
{
for (int i=0; i&lt;TAB_COUNT; i++)
printf("%d\n", tab[i]);
}

Commentaire de Dri le 23/05/2004 10:55:58

Je vois pas pourquoi tu me parle de types de base... J'en ai utilisé un pour l'exemple mais ma fonction swap marche pour n'importe quel type (enfin j'ai l'impression de me répéter). Donc si j'utilise du char j'échange des char... je vois pas où est le prob... Voila un petit exemple.

#include &lt;conio.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

void swap(void*, void*, size_t);

void swap(void *buffer1, void *buffer2, size_t size)
{
  void *buffer3;
  
  buffer3 = (void*) malloc(size);
  
  memcpy(buffer3, buffer1, size);
  memcpy(buffer1, buffer2, size);
  memcpy(buffer2, buffer3, size);
  
  free(buffer3);
}

typedef struct
{
  char ch;
  short sh;
  int in;
  long lo;
}bidon;

main()
{
  bidon a={1, 2, 3, 4}, b={5, 6, 7, 8};
  
  printf("a={%d, %d, %d, %d}\n", a.ch, a.sh, a.in, a.lo);
  printf("b={%d, %d, %d, %d}\n", b.ch, b.sh, b.in, b.lo);
  
  swap(&a, &b, sizeof(bidon)); printf("\nechange...\n\n\n");
  
  printf("a={%d, %d, %d, %d}\n", a.ch, a.sh, a.in, a.lo);
  printf("b={%d, %d, %d, %d}\n", b.ch, b.sh, b.in, b.lo);
  
  getch();
}

Le code que j'ai mis était juste pour illustrer l'utilisation de ces fonctions...

Dri

Commentaire de djl le 23/05/2004 11:01:43

POURQUOI tu fais buffer3 = (void*) malloc(size); et pas
buffer3 = malloc(size); ??

Commentaire de Dri le 23/05/2004 12:03:07

Bah j'avais une erreur de cast (Dev-C++) quand je ne le mettai pas... Alors j'ai bien été obligé de faire autrement... En fait mon erreur si situai ailleurs et quand je l'ai corrigée bah j'ai oublié de virer ca...
j'avai mal compris ^^ apparament, je vais modifier la source encore ^^

sinon pour le AFFICHER_LE_TABLEAU, c'est juste pour afficher tout ca dans la console... J'ai pas voulu me casser la tête en faisant un truc super classe alors que c'est pas l'essentiel... Donc je dépend de i mais bon c'est juste l'exemple d'utilisation... ;)

Dri

Commentaire de JCDjcd le 23/05/2004 12:06:38

Heu une petite question pour Dri :
dans ta structure bidon tu as different type; et donc dans le printf tu mets des "%d", cela marhce pour le int (taille 4 octets passes en pile), pour le char, je crois que par convention du C, il est convertie en int et passe a printf, dont jusqu'ici pas de probleme, mais pour l'histoire des short et des long, pk ca marche ?? coup de chance ?
car si un long represente plus de 32 bits, alors le printf va prendre les 7 premiers octets de la pile, qu'il comprendera comme etant un int.  C'est comme si je passait un __int64, ca ne devait pas marcher , non??

Commentaire de BruNews le 23/05/2004 12:18:19 administrateur CS

sur processeur 32 bits, int et long devraient avoir une representation sur 32 bits.
Pour les types plus petits, le compilo devrait egalement toujours PUSHer 4 octets sur la pile pour conserver l'alignement correct des donnees, le format passe a printf lui indique comment les interpreter.

Commentaire de djl le 23/05/2004 12:26:59

oui long = 32bits sur une architecture 32bits

JCDjcd &gt; en c, regarde du coté de la promotion de type losr du passage en parametre

char, short &gt; int
unsigned char, unsigned short &gt; unsigned
float &gt; double

Dri &gt; si tu compile avec un compilo c doit pas y avoir d'erreur ni warning

Commentaire de StanOfSky le 26/05/2004 23:24:13

en fait moi je vois pas trop pk tu fais ca :
int char_superieur_ou_egal(void *a, void *b)
{
    return *((char*)a)&gt;=*((char*)b);
}

void *a et void*b, pk tu mets pas des char* ??

tes fonctions de comparaisons doivent prendre en parametre des élts du meme type que ce que tu mets dans ton tableau...

si tu veux comparer des chaines de caracteres par exemple tu fais :
int char_superieur_ou_egal(char *a, char *b)
{
    return (strcmp(a, b) &gt;= 0);
}

Commentaire de Dri le 27/05/2004 14:36:16

void sort(void *buffer, size_t size, size_t count, int (*compare)(void*, void*))

La fonction trie une zone continue de mémoire de n'importe quel type
Le type à une taille
On trie un tableau de count éléments
On les trie selon une fonction de comparaison qui accepte donc forcément n'importe quel type.

J'ai voulu faire une simple fonction
int char_superieur_ou_egal(char*, char*);
mais le seul problème c'est qu'à la compilation c'était refusé...

Donc la fonction doit accepter un type void et pas char. Regarde l'exemple de swap sur la structure bidon que j'ai mis dans un de mes commentaires... Elle fonctionne aussi bien sur du char que sur la structure bidon... Bah pareil avec ma fonction de tri... Elle est suppossée pouvoir trier ce qu'on lui donne et pas spécialement du char... Donc les fonctions utilisées pour la comparaison doivent s'harmoniser avec... Et utiliser du void... Enfin c'est le problème que j'ai rencontré...

Dri

Commentaire de BruNews le 27/05/2004 14:45:00 administrateur CS

qsort de la CRT travaille de maniere identique. Les params void* permettent de trier de tout apres le cast.

Commentaire de Dri le 27/05/2004 15:39:21

Voila un exemple de tri de chaine de caractere... Je répete bien le but de la fonction... C'est de pas etre un simple sort... Mais bien de trier un peu n'importe quoi... Ca s'adresse en particulier aux types qui ne sont pas ceux de base mais pour l'exemple c'est eux que j'ai pris. BruNews l'a bien souligné ^^).
Je maitrise pas trop le C... Mais par exemple si on travaille avec un type comme :
structure
  chaine nom
  chaine prenom
finstructure
et qu'on désire trier un tableau de ces structures... Il faut bien soit se faire sa propre fonction de tri, soit uiliser une fonction qui en serait capable... C'est pour ca que j'ai codé cette fonction... Par exemple là on pourrai d'abord trier par nom, puis en cas de nom identique par prénom... Si ca intéresse je peux aussi coder un exemple d'utilisation avec cette structure...

Voila l'exemple pour les chaines :

#include &lt;conio.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;

void sort(void*, size_t, size_t, int (*)(void*, void*));

int string_inferieur_ou_egal(void *a, void *b)
{
  char *c, *d;
  memcpy(&c, a, sizeof(char*));
  memcpy(&d, b, sizeof(char*));
  return (strcmp(c, d)&lt;=0);
}

int string_superieur_ou_egal(void *a, void *b)
{
  char *c, *d;
  memcpy(&c, a, sizeof(char*));
  memcpy(&d, b, sizeof(char*));
  return (strcmp(c, d)&gt;=0);
}

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&lt;count; right++)
    {
    memcpy(temp, buffer+size*right, size);
    for(left=0; left&lt;right; left++)
        if(compare(buffer+size*right, buffer+size*left)==1) break;
    if(left&lt;right)
    {
        for(i=right; i&gt;left; i--)
          memcpy(buffer+size*i, buffer+size*(i-1), size);
        memcpy(buffer+size*left, temp, size);
    }
    }
    
    free(temp);
    
}

#define TAB_COUNT 5


main()
{
  char *str[TAB_COUNT] = {
                           "chaine",
                           "caractere",
                           "mot",
                           "phrase",
                           "comparaison"
                         };
  int i, (*compare)(void*, void*);;
  
  for(i=0; i&lt;TAB_COUNT; i++)
    printf("%s\n", str[i]);
  
  printf("\n");
  //on trie dans un ordre
  sort(str, sizeof(char*), TAB_COUNT, &string_superieur_ou_egal);
  for(i=0; i&lt;TAB_COUNT; i++)
    printf("%s\n", str[i]);
  
  printf("\n");
  //puis dans l'autre
  sort(str, sizeof(char*), TAB_COUNT, &string_inferieur_ou_egal);
  for(i=0; i&lt;TAB_COUNT; i++)
    printf("%s\n", str[i]);

  getch();
}

Dri

Commentaire de djl le 27/05/2004 19:55:34

mais pourquoi tu cast le malloc ??
temp = (void*) malloc(size);
je parle dans le vide ?

mais surtout, tu pourrais m'expliquer ca ?

int string_inferieur_ou_egal(void *a, void *b)
{
  char *c, *d;
  memcpy(&c, a, sizeof(char*));
  memcpy(&d, b, sizeof(char*));
  return (strcmp(c, d)&lt;=0);
}

int string_superieur_ou_egal(void *a, void *b)
{
  char *c, *d;
  memcpy(&c, a, sizeof(char*));
  memcpy(&d, b, sizeof(char*));
  return (strcmp(c, d)&gt;=0);
}

vois pas l'utilité et en plus c'est faut
tu aurais peu faire

c=a;
d=b;

au lieu de

memcpy(&c, a, sizeof(char*));
  memcpy(&d, b, sizeof(char*)); // surtout que l'utilisation de memcpy est incorrecte et inutile ???

Commentaire de StanOfSky le 27/05/2004 22:06:32

si tu veux faire une fonctions qui compares des chaines de caracteres suffit de faire ca :
int char_superieur_ou_egal(void *a, void *b)
{
    return (strcmp((char*)a, (char*)b) &gt;= 0);
}

ca sert a rien de recopier avant de faire le test....

j'avais bien compris que ta fonction de tri se voulait générique
d'ailleurs c pourquoi faut faire une fonction de comparaison que tu passes en parametre dans ta fonction de tri pour chaque type a trier : int (*compare)(void*, void*) qui perso j'aurai faire renvoyer un bool (meme si c pareil mais je prefere pour la compression)

mais c vrai que j'avais po fait gaffe a comment tu l'utilises dans ta fonction sort et c vrai qu'il faut que ce soit du int(*)(void*,void*) en parametre
c pour quoi vive les classes et les templates!!! ;)

sinon a part ca d'un point de vue algorithmique ta fonction sort n'est pas tres efficace puisqu'elle te fait faire n² comparaisons et dans le pire des cas n² swap...
mate des fonctions comme le tri fusion ou tri rapide qui sont des fonctions récursives faciles a comprendre et tres efficaces

Commentaire de djl le 27/05/2004 22:13:53

ou tous simplement

int char_superieur_ou_egal(char *a, char *b)
{
    return (strcmp(a, b) &gt;= 0);
} // mais ou est l'interet ?

et pas la peine de faire un cast void* -&gt; char*

malheuresement ya pas de type bool en c ansi

Commentaire de Dri le 28/05/2004 08:54:04

Dsl mais cette fois je l'ai codée à la volée au bureau... Et j'ai pas pris le temps de "bien" faire les choses... Et je l'ai dit... Je maitrise pas tout ca... C'est même le but de maitriser en m'exercant... Sinon désolé de donner l'impression de faire parler dans le vide...
Pour le temp, en fait je l'avais fait comme ca des le début et je ne l'ai jamais corrigé... Donc tant que je ne la voyais pas je pouvais pas la corriger...

Aussi je répete que quand je cast un malloc c'est que j'ai un message d'erreur dessus et que souvent l'erreur est aiilleurs mais que le compilo me sort celle là...

return (strcmp(a, b) &gt;= 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

En tout cas merci de vos remarques

Dri

Commentaire de djl le 28/05/2004 19:41:23

"return (strcmp(a, b) &gt;= 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"

tu fais bien d'avoir  dit le fond de tes pensée car c'est ce qui explique ce que tu avait ecris precedement
aparament tu n'a pas trop compris c'est histoire de pointeurs et de chaine de caracteres, je t'invite a voir ca dans un livre (k&r) ou un bon cour online
http://cowww.epfl.ch/infgmel/doc/coursCpp/book1.html

int char_superieur_ou_egal(char *a, char *b)
{
    return (strcmp(a, b) &gt;= 0);
} //

mis a part que ca n'a aucun interet, c'est tout ce qu'il y a de plus juste

et tu compile avec quoi pour avoir une erreur sur un mallloc sans cast ? car la on parle bien de C ?

Commentaire de Dri le 28/05/2004 22:28:15

J'utilise DevC++ donc mingw
Quand j'utilise cette fonction le tri est faussé

Dri

Commentaire de djl le 28/05/2004 22:34:58

devc++ donc la collection gcc, tu compile un .cpp ou un .c ?

Commentaire de Dri le 29/05/2004 17:41:11

Bah je l'ai dit je le fais en C... Donc forcément j'ai fait gaffe à l'enregistrer en C

Dri

Commentaire de djl le 29/05/2004 17:58:45

et si tu fais

temp = malloc(size);

il te balance une erreur?

Commentaire de Dri le 30/05/2004 11:17:28

Nan justement, je l'ai peut être mal expliqué, quand le compilo me balance cette erreur, c'est qu'il y en a une autre ailleurs (c'est ce que j'ai constaté) et du coup je réglai le problème de cette maniere alors qu'avant il l'acceptait... Et là bah ca génere aucune erreur... Parce qu'il n'y en a pas ailleurs.

Dri

Commentaire de StanOfSky le 04/06/2004 00:08:00

djl &gt;&gt; " int char_superieur_ou_egal(char *a, char *b)
{
    return (strcmp(a, b) &gt;= 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) &gt;= 0);
}

parce que son compilateur provoque une erreur de cast si c pas de format int(*)(void*,void*)

dri &gt;&gt; "return (strcmp(a, b) &gt;= 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...

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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,374 sec (4)

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