Ciao,
ho provato a fare come mi ha suggerito Marco in quell´altro forum ma deve esserci un problema nella comparison function del qsort.
Potresti dare un occhi a questo semplice programma per favore?
Voglio ordinare un array di t_amplitude_index, un nuovo tipo che ha un float (l'elemento che voglio ordinare) e un int (l' indice che va preservato).
Non capisco cosa sbaglio ;-(
Help!
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _amplitude_index{ // Struct to store and order the values of the amplitudes preserving the index in the original array
float amplitude;
int index;
} t_amplitude_index;
int compare_structs (const void *a, const void *b);
int main (int argc, const char * argv[]) {
int length_array_range = 10;
t_amplitude_index *array_amplitudes;
array_amplitudes = (t_amplitude_index *) malloc(sizeof(t_amplitude_index) * length_array_range);
int i;
for(i = 0; i< length_array_range;i++){
array_amplitudes[i].amplitude = (float)i;
array_amplitudes[i].index = i;
}
for(i = 0; i< length_array_range;i++){
printf("array_amplitudes[i].amplitude = %f, array_amplitudes[i].index = %d\n",array_amplitudes[i].amplitude,array_amplitudes[i].index);
}
qsort(array_amplitudes, length_array_range, sizeof(t_amplitude_index *), (void *)compare_structs);
printf("\n\n");
for(i = 0; i< length_array_range;i++){
printf("array_amplitudes[i].amplitude = %f, array_amplitudes[i].index = %d\n",array_amplitudes[i].amplitude,array_amplitudes[i].index);
}
free(array_amplitudes);
return 0;
}
int compare_structs (const void *a, const void *b){
t_amplitude_index *struct_a = (t_amplitude_index *) a;
t_amplitude_index *struct_b = (t_amplitude_index *) b;
//return (int)(struct_a->amplitude > struct_b->amplitude) - (struct_a->amplitude < struct_b->amplitude);// ascending order
//return (int)(struct_a->amplitude < struct_b->amplitude) - (struct_a->amplitude > struct_b->amplitude);// descending order
if(struct_a->amplitude < struct_b->amplitude) return 1;
if(struct_a->amplitude == struct_b->amplitude) return 0;
if(struct_a->amplitude > struct_b->amplitude) return -1;
}