Сортировка массива с использованием qsort? - PullRequest
1 голос
/ 15 ноября 2011
main.c

#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "head.h"
int comp(const DATA * a, const DATA * b)
{
    return a->size - b->size;
}

int main (int argc, const char * argv[])
{

    // insert code here...
    printf("Hello, World!\n");
    lst = (DATA *) calloc(10,sizeof(DATA));
    lst[0].size = 5;
    lst[1].size = 9;
    lst[2].size = 2;

    qsort(lst,10,sizeof(int),comp);
    printf("this : %i\n ", lst[0]);
    printf("this : %i\n ", lst[9]);

    return 0;
}

head.h

#ifndef main_h
#define main_h
#define DATA struct data

DATA
{
    int size;
    char data;
};

DATA *lst;
int comp(const DATA * a, const DATA * b);
#endif

FAILS: /

1 Ответ

6 голосов
/ 15 ноября 2011

Таким образом, мой начальный массив должен выглядеть так: 5, 9, 1, 3, 0, 0, 0, 0, 0, 0.

Нет, нет, тысячу раз,нет: -)

Если вы хотите, чтобы там были нули, либо используйте calloc, чтобы обнулить все, либо вставьте их в себя.malloc даст вам (как в исходном коде) блок требуемого размера, который содержит неопределенный контент.Другими словами, он вполне может иметь любой мусор, который был в памяти заранее.

И, кроме того, a и b являются указателями в вашей функции comp,вы должны использовать ->, а не ., и это хороший способ использовать правильный прототип с приведением.

И последнее замечание: пожалуйста, не приводите возвращение из malloc - вы можете получитьв проблемы, если вы случайно забыли включить соответствующий заголовочный файл, а ваши целые числа не совместимы с вашими указателями.

Функция malloc возвращает void *, который вполне успешно неявно преобразуется в любой другой указатель.


Вот полная программа с этими исправлениями:

#include <stdio.h>
#include <stdlib.h>

typedef struct {int size; int id;} DATA;

int comp (const void *a, const void *b) {
    return ((DATA *)a)->size - ((DATA *)b)->size;
}

int main (void) {
    int i;
    DATA *myArray = malloc(10 * sizeof(DATA));
    myArray[0].size = 5;
    myArray[1].size = 9;
    myArray[2].size = 1;
    myArray[3].size = 3;
    for (i = 4; i < 10; i++)
        myArray[i].size = 0;

    qsort (myArray, 10, sizeof(DATA), comp);
    for (i = 0; i < 10; i++)
        printf ("%d ", myArray[i].size);
    putchar ('\n');

    return 0;
}

Вывод:

0 0 0 0 0 0 1 3 5 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...