Copier des données en memoire

Résolu
rudybaka Messages postés 8 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 24 mai 2007 - 30 mai 2006 à 15:38
excrt Messages postés 75 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 3 juillet 2006 - 30 mai 2006 à 18:25
Bonjour je suis etudiant et j'aurai besoin d'aide pour une question de TP :
Ecrire une fonction qui trie les valeurs d'un tableau d'éléments de type quelconque. La fonction doit recevoir en paramètre un pointeur sur la fonction qui compare deux éléments e1 et e2 et retourne -1, 0 ou 1, selon que e1 est inferieur, égal ou supérieur à e2.

J'ai réussi a ecrire cette fonction :

void tri2(void *tab, int tailleTab, int tailleElem,
        int (*compare)(void *e1, void *e2) )
{
    int i = 0;
    while ( i <= tailleTab)
    {
        int k = (i - 2);        while (k >0 && ((*compare)(tab[k], tab[k+1]) 1))
        {
            void temp;
            copy(tab[k], &temp, tailleElem);
            copy(tab[k+1], tab[k], tailleElem);
            copy(&temp, tab[k], tailleElem);
            k--;
        }
        i++;
    }
}

Par contre j'ai un probleme pour la fonction copy, mon prof ma dit qu'elle devait etre de la forme :
void copy(void *source, void *destination, int tailleElem)

comment faire pour copier les données en memoire de source et de les mettres dans destination ?
merci d'avance pour l'aide ^^

PS : c'est mon premier post donc si quelque chose ne va pas dedans (ou que je ne respecte pas une règle ^^) n'hésité pas a me le signalé

4 réponses

excrt Messages postés 75 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 3 juillet 2006
30 mai 2006 à 17:59
//-
//- rectification
//-

void copy(void* source, void* destination, int tailleElem)
{
    char tmp;
    char* src = (char*)source;
    char* dst = (char*)destination;

    for (/**/; tailleElem > 0; --tailleElem)
    {
        tmp = *dst;
        *dst++ = *src;
        *src++ = tmp;
    }
}

void tri2(void* tab, int tailleTab, int tailleElem, int (*compare)(void*, void*))
{
    int i;
    int k;
    //- void* n'est rien, on ne peut pas manipuler un void*
    //- sans le « caster/transtyper » vers un autre type « manipulable »
    char* t = (char*)tab;
    //- on va se déplacer dans le tableau(tab) octet/octet
    //- nous allons donc utiliser deux variables pour « manipuler »
    //- chaque item(élément) du tableau(tab)
    char* elem1;
    char* elem2;

    for (i = 0; i <= tailleTab; ++i)
    {
        for (k = (i - 2); k >= 0; --k)
        {
            //- « elem1 » va pointer sur notre premier élément
            //- pour aller à l'item(élément) « k », nous devons multiplier
            //- « k » par la taille des items(éléments)
            //- note: nous manipulons le tableau(tab) octet/octet

            //- « t » pointe sur le début du tableau(tab)
            elem1 = (t + (k * tailleElem)); //- tab[k]

            //- un tableau est une suite d'éléments alignés les uns
            //- à la suite des autres
            //- int tab[5]; == item0|item1|item2|item3|item4(espace requis >> 5*sizeof(int) == 20octets >> alignés)
            //- la taille d'un « int » est de 4 octets
            //- donc, en manipulant le tableau octet/octet,
            //- pour passer d'un item à un autre, nous devons
            //- y aller 4octets à la fois(4octets == taille d'un « int »)

            //- (k * tailleElem) == position de l'item(élément) « k »
            //- dans le tableau(tab)

            //- puisque « elem2 » est l'item(élément) suivant « elem1 »
            //- on additionne(ajoute) seulement la taille d'un item(élément)
            //- pour, justement, passer au suivant dans le tableau(tab)
            elem2 = (elem1 + tailleElem); //- tab[k + 1]

            if (compare(elem1, elem2) != 1) {
                break; //- quitte ce « for() »
            }
            //- échange les valeurs de « elem1 » et « elem2 »
            copy(elem1, elem2, tailleElem);
        }
    }
}

-=-= ExCRT =-=-
3
excrt Messages postés 75 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 3 juillet 2006
30 mai 2006 à 17:18
tu copies octet/octet et rien de plus

//- le nom de la fonction est un peu douteuse, car ce n'est pas une copie mais plutôt un échange ...
void copy(void* source, void* destination, int tailleElem)
{
  //- sizeof(char) == 1 >> octet
  char tmp;
  char* src = (char*)source;
  char* dst = (char*)destination;

  while (tailleElem-- > 0)
  {
    tmp = *dst;
    *dst++ = *src;
    *src++ = tmp;
  }
}

et dans ta seconde boucle:

        //- la syntaxe « (*func_ptr)(...) » n'est plus obligatoire depuis longtemps ...        //-while (k >0 && ((*compare)(tab[k], tab[k+1]) 1))
        while (k >0 && compare(tab[k], tab[k+1]) 1)
        {
            //- tu échange simplement les valeur
            copy(&tab[k], &tab[k+1], tailleElem);
            k--;
        }

-=-= ExCRT =-=-
0
rudybaka Messages postés 8 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 24 mai 2007
30 mai 2006 à 18:15
Merci beaucoup, sa marche nickel ^^
Ce forum et les gens sont super  :
j'était en train de tester la premiere reponse, même pas le temps de poster pour signaler le nouveau problème qu'il y avait deja la reponse.^^ ^^
Un grand merci  a toi ExCRT. Tes explications sont super clair
0
excrt Messages postés 75 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 3 juillet 2006
30 mai 2006 à 18:25
de rien!

-=-= ExCRT =-=-
0
Rejoignez-nous