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!