如何修复我的 qsort() 算法?每次都会给出不同的结果

问题描述 投票:0回答:1

我目前正在尝试创建一个最小的“3D”引擎来渲染体素和平面,但我遇到了一些问题。现在,我正在尝试制定一种算法,根据物体在相机中的位置对物体进行排序。后面的东西总是先被绘制,如果它们的 Z 轴(直接在相机前面的距离)相同,它会绘制离屏幕中心更远的那个。

我有一个我知道可以在我的电脑上运行的版本,同时使用

gcc
clang
,但是一旦我使用我正在开发的设备的工具链编译它,它就会开始出现故障并且不会做我想做的事。输出每隔一段时间就会改变一次。我可以告诉我如何修复它或实现与我正在使用的工具链分开的
qsort
功能吗?

// includes

int8_t player_x = 0;
int8_t player_y = 0;
int8_t player_z = 0;


int compareCoordinates(const void *a, const void *b) {

    int8_t *coord1 = (int8_t *)a;
    int8_t *coord2 = (int8_t *)b;
    
    
    if ((coord2[2] - coord1[2]) != 0) {
        return (coord2[2] - coord1[2]);
    }
    
    int value = (abs(coord2[0] - player_x) + abs(coord2[1] - player_y)) - (abs(coord1[0] - player_y) + abs(coord1[1] - player_y));

    if (value == 0){
        return 1;
    }
    
    return value;
}




void sortCoordinateList(int8_t coordinates[][3], int numCoordinates) {

    qsort(coordinates, numCoordinates, sizeof(coordinates[0]), compareCoordinates);
}

int8_t coordinates[][3] = {
        {1, 2, 5},
        {-1, 2, 5},
        {-3, 2, 5},
};

int main(void)
{

    sortCoordinateList(coordinates, LEN(coordinates));
    for (int i = 0; i < LEN(coordinates); i++) {
        dbg_printf("(%d, %d, %d)\n", coordinates[i][0], coordinates[i][1], coordinates[i][2]);
    }
    dbg_printf("\n\n");
}

这是代码片段,删除了移动功能,但这是主要内容。我对 C 编程相当陌生,但我知道

qsort
随机处理具有相同值的项目或类似的东西,称为
stable sorting
,但我非常有信心事实并非如此。

我尝试了多种不同的调试和测试方法,但我完全被难住了。通常当我遇到错误时,我会自己解决,但我不得不屈服并提出我的第一个 StackOverflow 问题。顺便说一句,从今天到昨天,我已经为此工作了至少 13-15 个小时,所以是的,我已经尽了一切努力。

c sorting qsort
1个回答
0
投票

这是一个类型问题,你没有得到你认为作为比较函数的参数得到的东西。

qsort
将使用指针运算符将指针传递给数组的元素。如果您有一个由三个
int8_t
元素组成的数组的数组,则比较函数将获得一个指向由三个
int8_t
元素组成的数组的指针。

正确的类型是

int8_t (*)[3]
,而不是
int8_t *

int compareCoordinates(const void *a, const void *b) {

    int8_t (*coord1)[3] = (int8_t (*)[3])a;
    int8_t (*coord2)[3] = (int8_t (*)[3])b;

    // ...
© www.soinside.com 2019 - 2024. All rights reserved.