2014-10-25 4 views
-2

Я работаю в Интернете и стараюсь делать это весь день, но без успеха. Есть и другая тема с подобными проблемами, но я не могу заставить ее работать.Динамическое распределение массива структурных указателей, их указаний и qsort-ing

Это код:

void sort_structs_example(Stock **head, int count) 
{ 
    Stock **toSort = NULL; 

    int i; 

    memLoc(&toSort, sizeof(toSort)*count); 

    for (i = 0; count > 0 && i < count && (head != NULL); i++) 
    { 
     if (i == 0) toSort[0] = *head; 
     else 
     { 
      toSort[i] = toSort[i - 1]->next; 
     } 
    } 

    qsort(toSort, count, sizeof(Stock), struct_cmp_by_product); 

    for (i = 0; count > 0 && i < count && (head != NULL); i++) 
    { 
     printColor(-1, i, toSort[i]->name, 'G', 'B'); 
    } 

    system("pause"); 
    free(toSort); 
} 

int struct_cmp_by_product(const void *Ap, const void *Bp) 
{ 
    Stock A = *(Stock *)Ap; 
    Stock B = *(Stock *)Bp; 
    return strcmp((&A)->name, (&B)->name); 
} 

Stock является структура с «именем» переменной и «рядом» в нем. Параметр «count» получает количество текущих структур запаса. Параметр ** head - это указатель на последний добавленный запас, и я получаю доступ к другим запасам путем перехода (* head) -> next, это связанная структура.

Это memLoc:

int memLoc(void **var, int size) 
{ 
    if (NULL == (*var = malloc(size))) 
    { 
     return 0; 
    } 
    else return 1; 
} 

Так что я думаю, что я amn't используя memLoc право и что-то в состоянии QSort перепутались, но я запутался во всех указателей. Помоги пожалуйста? Благодарю.

+1

Скомпилируйте все предупреждения и информацию об отладке ('gcc -Wall -Wextra -g'). Затем ** используйте отладчик ** ('gdb') –

+0

Разбейте это на отдельные вопросы. Использование отладчика поможет на этом этапе, потому что, как написано, предоставленные вами фрагменты не будут скомпилированы. Вы получите предупреждения и ошибки. – ryyker

ответ

1

Я не могу предложить решение, но я вижу, что вы запутались в своих указателях. В struct_cmp_by_product() вы скопировали значения struct в локальные переменные, а затем использовали их в качестве указателей.

return strcmp((&A)->name, (&B)->name); 

Было бы лучше, используя местные структуры непосредственно

return strcmp(A.name, B.name); 

Еще лучше было бы это, что переделывает типы указателей (не то, что они указывают на).

int struct_cmp_by_product(const void *Ap, const void *Bp) 
{ 
    return strcmp(((Stock *)Ap)->name, ((Stock *)Bp)->name); 
} 

Причина это лучше, потому что Stock может быть очень большая структура, и это не нужно создавать локальные копии.

Смежные вопросы