IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

memcpy ne se comporte pas de la meme manière en 64 bits et 32 bits


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut memcpy ne se comporte pas de la meme manière en 64 bits et 32 bits
    Bonjour,

    J'essaye actuellement de coder la fonction qsort de manière générique (avec un void* pour tableau en paramètre) comme l'originale.

    Cependant quand je souhaite intervertir deux valeurs de mon tableau avec memcpy j'obtiens un résultat correct sur mon raspberry en 32 bits et erroné sur Mac OSx 64 bit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    #include <stdio.h>
    #include <stdlib.h>
     
    static size_t g_nb_elem;
    static size_t g_size_elem;
     
    static void quicksortRec(void *start_tab, int premier, int dernier)
    {
     
    }
     
    static int diff(void const *a, void const *b)
    {
        return (0);
    }
     
    static void swap(void *start_tab, int const a, int const b)
    {
        void    *a_add;
        void    *b_add;
        void    *temp;
        void    *see;
     
        a_add = (start_tab) + a * g_size_elem;
        b_add = (start_tab) + b * g_size_elem;
        see = start_tab + (b + 1) * g_size_elem;
     
     
        temp = malloc(g_size_elem);
     
        //printf("valeur start[%p]\n", temp);
        //printf("valeur de a [%i]\n", (*(int*)a_add));
        //printf("valeur de b [%i]\n", (*(int*)b_add));
        //printf("valeur de see [%i]\n", (*(int*)see));
     
        temp = memcpy(temp, a_add, sizeof(g_size_elem));
        a_add = memcpy(a_add, b_add, sizeof(g_size_elem));
        b_add = memcpy(b_add, temp, sizeof(g_size_elem));
     
        //printf("adresse start[%p]\n", temp);
        //printf("valuer de a [%i]\n", (*(int*)a_add));
        //printf("valeur de b [%i]\n", (*(int*)b_add));
        //printf("valeur de see [%i]\n", (*(int*)see));
        free(temp);
    }
     
    void        quicksort(void  *tab, size_t nb_elem, size_t size_elem,\
                         int(*diff)(void const *a, void const *b))
    {
        g_nb_elem = nb_elem;
        g_size_elem = size_elem;
        swap(tab, 1, 2);
    }
     
    int         main(void)
    {
        int i = 0;
        int *tab;
     
        tab = malloc(sizeof(int) * 10);
        tab[0] = 0;
        tab[1] = 1;
        tab[2] = 2;
        tab[3] = 3;
        tab[4] = 4;
        quicksort(tab, 5, sizeof(int), &diff);
        while (i != 5)
        {
            printf("[%i] ", tab[i]);
            i++;
        }
        free(tab);
        return (0);
    }
    En swappant les index 1 et 2 du tableau j'obtiens pour le tableau [0]:0 [1]:1 [2]:2 [3]:3 [4]:4 :
    _Sur Mac Os: [0]:0 [1]:2 [2]:1 [3]:2 [4]:4
    L'index 3 est modifie aussi
    _Sur mon raspberry c'est correct: [0]:0 [1]:2 [2]:1 [3]:3 [4]:4

    Si quelqu'un peut m'expliquer, merci!

  2. #2
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,

    Lignes 37 à 39, tu fournis la taille de la variable g_size_elem à memcpy au lieu de sa valeur qui représente la taille de l'élément à copier si je ne m'abuse.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Meci, c'est bien ça :-) je dois être fatigue, le code corrige:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    #include <stdio.h>
    #include <stdlib.h>
     
    static size_t g_nb_elem;
    static size_t g_size_elem;
     
    static void quicksortRec(void *start_tab, int premier, int dernier)
    {
     
    }
     
    static int diff(void const *a, void const *b)
    {
        return (0);
    }
     
    static void swap(void *start_tab, int const a, int const b)
    {
        void    *a_add;
        void    *b_add;
        void    *temp;
        void    *see;
     
        a_add = (start_tab) + a * g_size_elem;
        b_add = (start_tab) + b * g_size_elem;
        see = start_tab + (b + 1) * g_size_elem;
     
     
        temp = malloc(g_size_elem);
     
        printf("valeur start[%p]\n", temp);
        printf("valeur de a [%i]\n", (*(int*)a_add));
        printf("valeur de b [%i]\n", (*(int*)b_add));
        printf("valeur de see [%i]\n", (*(int*)see));
     
        temp = memcpy(temp, a_add, g_size_elem);
        a_add = memcpy(a_add, b_add, g_size_elem);
        b_add = memcpy(b_add, temp, g_size_elem);
     
        printf("adresse start[%p]\n", temp);
        printf("valuer de a [%i]\n", (*(int*)a_add));
        printf("valeur de b [%i]\n", (*(int*)b_add));
        printf("valeur de see [%i]\n", (*(int*)see));
        free(temp);
    }
     
    void        quicksort(void  *tab, size_t nb_elem, size_t size_elem,\
                         int(*diff)(void const *a, void const *b))
    {
        g_nb_elem = nb_elem;
        g_size_elem = size_elem;
        swap(tab, 1, 2);
    }
     
    int         main(void)
    {
        int i = 0;
        int *tab;
     
        tab = malloc(sizeof(int) * 10);
        tab[0] = 0;
        tab[1] = 1;
        tab[2] = 2;
        tab[3] = 3;
        tab[4] = 4;
        quicksort(tab, 5, sizeof(int), &diff);
        while (i != 5)
        {
            printf("[%i] ", tab[i]);
            i++;
        }
        free(tab);
        return (0);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/05/2009, 14h23
  2. Les donnees ne sont pas mises à jour meme avec un refresh
    Par aymen007 dans le forum Hibernate
    Réponses: 5
    Dernier message: 11/10/2007, 16h20
  3. Réponses: 6
    Dernier message: 29/06/2007, 10h38
  4. memcpy qui ne veut pas memcopier
    Par nexoo dans le forum C
    Réponses: 29
    Dernier message: 28/02/2007, 16h56
  5. Acceder a une base SQL qui n'est pas sur le meme serveur
    Par skyo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/01/2006, 10h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo