2017-09-19 3 views
0

Je dois écrire une fonction pour trier un tableau dans le tas. Cette fonction devrait faire une copie du tableau, trier la copie et retourner un pointeur vers la copie triée. J'ai essayé qsort() mais j'ai une sortie étrange. Je suis sûr que cela a quelque chose à voir avec le pointeur mais je n'arrive toujours pas à le comprendre.Tri du tableau dans le tas

Ceci est mon code à ce jour:

int cmpfunc(const void * a, const void * b) 
{ 
    return (*(int*)a - *(int*)b); 
} 

int sorted_copy(int* list[], size_t s) 
{ 
    int aList[s]; 
    memcpy(aList,list,s); 
    printf("Array was copied successfuly to aList[] array\n\n"); 
    printf("Before sorting the list is: \n"); 

    for(int i = 0; i < s; i++) 
     printf("%d\n", aList[i]); 

    qsort(aList, s, sizeof(int), cmpfunc); 
    printf("After sorting the list is: \n"); 
    for(int i = 0; i < s; i++) 
    { 
     printf("%d\n", aList[i]); 
    } 
    return *aList; 
} 

int main() 
{ 
    int list[10] = {4, 1, 2, 7, 3, 5, 6, 0, 8, 9}; 
    sorted_copy(list,sizeof(list)); 
    return 0; 
} 

Une ce la sortie que je reçois

Array was copied successfuly to aList[] array 

Before sorting the list is: 
4 
1 
2 
7 
3 
5 
6 
0 
8 
9 
0 
0 
0 
0 
3 
0 
0 
0 
268501009 
32762 
4199840 
0 
-1407817721 
32762 
12846904 
0 
1324151619 
0 
8 
0 
176 
0 
6487584 
0 
4199972 
0 
4200528 
0 
-1434081178 
32762 
After sorting the list is: 
-1434081178 
-1407817721 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
1 
2 
3 
3 
4 
5 
6 
7 
8 
8 
9 
176 
32762 
32762 
32762 
4199840 
4199972 
4200528 
6487584 
12846904 
268501009 
1324151619 

Process returned 0 (0x0) execution time : 0.281 s 
Press any key to continue. 
+1

Déposer un tableau de pointeur vers '' dans un tableau de 'int' n'est pas un bon début pour tout ce que vous essayez de faire. En outre, vous ne copiez pas réellement à la capacité de toute façon. Le troisième argument de 'memcpy' est une taille en * octets *; pas un nombre d'éléments. Et enfin, "renvoyer une copie triée" va impliquer soit un paramètre in/out supplémentaire, soit un tableau statique, soit une allocation dynamique. – WhozCraig

+0

corrige comme [this] (https://ideone.com/m9zdtF) – BLUEPIXY

+1

vous renvoyez une adresse d'une variable locale qui supprime après la fermeture de funcion – bobra

Répondre

0

Eh bien, le deuxième paramètre de sorted_copy() doit être le nombre d'éléments de tableau passé comme premier paramètre, et non son sizeof (la taille de l'objet dans la mémoire octets) Je suppose que vous utilisez une architecture 32 bits, où int est quatre octets de large, et vous passez 40 comme numéro de tableau de e lements, et non 10 qui est le nombre réel de cellules dans le tableau.

changement

int main() 
{ 
    /* you don't need to specify the number of elements to declare 
    * the array if you are using an initializer that fully populates 
    * the array elements */ 
    int list[10] = {4, 1, 2, 7, 3, 5, 6, 0, 8, 9}; 
    sorted_copy(list,sizeof(list)); /* sizeof gives you the array 
            * size in bytes, not in number 
            * of elements */ 
    return 0; 
} 

dans

int main() 
{ 
    int list[] = {4, 1, 2, 7, 3, 5, 6, 0, 8, 9}; 
    sorted_copy(list, sizeof list/sizeof list[0]); 
    return 0; 
} 

et vous obtiendrez le résultat correct.