Файл координат X, Y, Z и нужно сортировать их по возрастанию.Я могу прочитать файл, выделить память и назначить их структуре, - PullRequest
0 голосов
/ 26 сентября 2019

Продолжайте получать нарушение доступа к памяти в первом операторе if.Я могу загрузить данные из файла и тег в структуру.

typedef struct
{
    int x;
    int y;
    int z;
} Coordinates;

typedef Coordinates * xyz;
int compare(const void *p1, const void *p2)
{
    const xyz point1 = *(const xyz *)p1;
    const xyz point2 = *(const xyz *)p2;
    if (point1->x < point2->x)  return -1;    //read access violation
    if (point1->x > point2->x)  return 1;
    if (point1->y < point2->y)  return -1;
    if (point1->y > point2->y)  return 1;
    if (point1->z < point2->z)  return -1;
    if (point1->z > point2->z)  return 1;
    else return 0;
 }

int main()
{
    int numberofpoints;
    //allocates memory
    Coordinates * xyz = (Coordinates *)malloc(sizeof(Coordinates)*numberofpoints);
    //call qsort
    qsort(xyz, numberofpoints, sizeof(xyz), compare);
}

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Ошибка здесь:

const xyz point1 = *(const xyz *)p1;
const xyz point2 = *(const xyz *)p2;
                   ^       ^^^
                   |       wrong type
                   |
                  wrong dereference

Просто сделайте

const  Coordinates * point1 = (const  Coordinates *)p1;
const  Coordinates * point2 = (const  Coordinates *)p2;

и избегайте typedef указателей.Это сбивает с толку и подвержено ошибкам.

Так что удалите это:

typedef Coordinates * xyz;

Если вы действительно, действительно хотите указатель typedef, вам следует, по крайней мере, использовать значимое имя, то есть

typedef Coordinates * CoordinatesPtr;

Далее вам нужно изменить sizeof(xyz) на sizeof *xyz

0 голосов
/ 26 сентября 2019

qsort требует размера элемента в третьем параметре.Вы указываете размер указателя.

Измените его на

 qsort(xyz, numberofpoints, sizeof(Coordinates), compare);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...