2013-05-05 2 views
0

У меня есть структуры в C так:Сортировка Структуры в С QSort

typedef struct proces { 
    char ime[60]; 
    char pid[60]; 
    char ppid[60]; 
    char stanje; 
    int stdat; 
    char niti[60]; 
    char poraba[60]; 
} proces ; 

я создаю около 100 из них и поместить их в массив

proces** procesi = malloc(sizeof(proces)); 
int x; 
for(x=0; x<st; x++){ 
    procesi[x] = (struct proces*)malloc(sizeof(proces)); 
} 

Теперь я хотел бы разобраться их с qsort. Но qsort не подходит. функция выглядит следующим образом:

int compar_ppid(const void *v1, const void *v2){ 
    const proces *p1 = (proces*)v1; 
    const proces *p2 = (proces*)v2; 
    return(strcmp(p1->ppid, p2->ppid)); 
} 

Я проверил значения, что compar_ppid сравниваемые и они, кажется, что-то вроде #d, когда они должны быть числами.

Я думаю, что я обращаюсь к указателю, а не к значению, но я не могу понять, что нужно изменить, чтобы получить правильные значения.

QSort вызов:

qsort(procesi, st, sizeof(proces*), compar_name); 
+2

'proces ** procesi = malloc (sizeof (proces));' ---> 'proces ** procesi = malloc (st * sizeof (proces *));' – BLUEPIXY

ответ

1

Массив сортировке содержит указатели на process, поэтому ваша функция сравнения должна выглядеть следующим образом:

int compar_ppid(const void * v1, const void * v2) 
{ 
    process *const*p1 = v1, *const*p2 = v2; 
    return strcmp((*p1)->ppid, (*p2)->ppid); 
} 

и, как BLUEPIXY указывает на выделение из массива не используя размер указателя, но размер структуры.

+0

Теперь он работает, но я получаю предупреждение: предупреждение: инициализация отбрасывает квалификатор 'const' из целевого типа указателя [включен по умолчанию] – Pero44

+0

Мой плохой. Исправлен пример. Я почти никогда не использовал 'const' сам, сильно переоцененный. –