Mistake 1
printf("size=%d",sizeof(access_data*));
prints 4, expected: 16. This was the biggest problem: sorting 8 times 4 bytes, not 8 times 16.
Weirdness 2
qsort() expects a pointer-to-data but scan() receives a pointer-to-pointer-to data. Recommended fix:
void scan(access_data data[], int len, int sec_to_sec_seek){
qsort(data, len, sizeof(access_data), &compare_data);
show_data(data, len);
}
Optimization 3
Your compare_data()
is equal to
int compare_data(const void* a, const void* b){
return ((access_data*)b)->sector - ((access_data*)a)->sector;
}
My full working program:
#include <stdio.h>
#include <stdlib.h>
struct access_data {
int sector;
int arrival_time;
int checked;
int processed;
};
typedef struct access_data access_data;
void show_data(access_data*data, int len) {
printf("Showing size = %d", sizeof(access_data*));
for (int i = 0;i < len; i++) {
printf("data[%d]: arrival_time: %d, sector: %d\n",i,data[i].arrival_time,data[i].sector);
}
}
int compare_data(const void* a, const void* b){
return ((access_data*)b)->sector - ((access_data*)a)->sector;
}
int compare_data1(const void* a, const void* b){
if (((access_data*)a)->sector < ((access_data*)b)->sector)
return 1;
else if (((access_data*)a)->sector > ((access_data*)b)->sector)
return -1;
else
return 0;
}
void scan(access_data data[], int len, int sec_to_sec_seek){
qsort(data, len, sizeof(access_data), &compare_data);
show_data(data, len);
}
int main() {
printf("START\n");
access_data data[8] = {
{ 3, 4, 5, 6 },
{ 2, 1, 5, 5 },
{ 1, 1, 3, 6 },
{ 4, 4, 5, 4 },
{ 5, 4, 3, 4 },
{ 6, 2, 5, 6 },
{ 7, 2, 5, 4 },
{ 0, 4, 5, 6 }
};
scan(data, 8, 0);
}