begin process at 2010 02 10 08:27:45
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

copier des données en memoire


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

copier des données en memoire

mardi 30 mai 2006 à 15:38:22 | copier des données en memoire

rudybaka

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é

mardi 30 mai 2006 à 17:18:26 | Re : copier des données en memoire

excrt

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 =-=-
mardi 30 mai 2006 à 17:59:55 | Re : copier des données en memoire

excrt

Réponse acceptée !
//-
//- 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 =-=-
mardi 30 mai 2006 à 18:15:14 | Re : copier des données en memoire

rudybaka

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
mardi 30 mai 2006 à 18:25:55 | Re : copier des données en memoire

excrt

de rien!

-=-= ExCRT =-=-


Cette discussion est classée dans : fonction, int, void, tab, tailleelem


Répondre à ce message

Sujets en rapport avec ce message

fonction d'alloaction dynamique [ par tomsawyerbelgique ] Pour une allocation dynamique d'un tableau à deux dimensions. Comme celle ci:cout // Initalisation int** tab = new int*[p_size1_tab]; for(in Pointeur vers une fonction dans une classe ... [ par MoDDiB ] Supposons que j'ai la fonctionvoid Fonction(int test,int t);appartenant a la classe Cclass.Quelle est la syntaxe pour creer un pointeur vers cette fon Tableau à 3 dimensions [ par VinceExtense ] Savez vous comment faire passer en paramètre un tableau à 3 dimensions ?void fonction1(int x,iny y,int z){int tab[x][y][z];}void fonction2(int ***tab, Allocation dynamique dans une fonction [ par Veovis ] Salut,Toujours dans mon projet de TP, j'ai un petit soucis avec l'allocation dynamique dans une fonction. Ce que je voudrais faire c'est quand le tabl Tableau en C [ par Mickylord ] Bonsoir a tous !Voici ma question :J'ai une fonction principale, main(), et une autre fonction tab(). Je voudrais déclarer un tableau dans la fonction tableau d'entier. [ par gdpasmini ] Hello !j'ai un petit soucis avec une fonction qui renvoi un tableau en parametre... voila les details :Dans mes fonctions : int * boutonDecodFlux(void recherche aide SVP [ par gelloula ] J 'ai un projet à faire en borlandc en mode BGI, Je suis encore une debutante et je bloque là dessus depuis une semaine. langage C [ par wafa_mef ] merci de me considerer un membre de ce club et j' ai le plaisir de participer avec vous .merci pour les codes sources envoyés. j'ai écrit un programme [C] incompatibilité dans une fonction [ par The_KniGhT_972 ] Bonjour, dans mon code C, j'ai un tableau de int a deux dimensions noté comme suit int tab[nbs][dmax]; et une fonction qui prend en paramètre un tab


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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 : 5,663 sec (4)

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