在嵌入式系统上将数组排序功能从c ++移植到c

时间:2015-11-25 09:37:50

标签: c++ c sorting embedded

我尝试将以下C ++排序函数移植到C,但现在我的嵌入式系统在尝试使用新的C函数进行排序时遇到了硬错误错误。 该函数大约每秒调用一次,有趣的是第一个循环排序工作,它总是在第二次迭代期间崩溃。

C ++代码:

   typedef struct featureData {
        float Value[NO_OF_ATT];
        float Distance;
        bool operator < (const featureData& rhs) const {
            return Distance < rhs.Distance;
        }
    } featureData;



std::sort(trainData, trainData+NO_OF_TRAINDATA);

C代码:

int compare_function(const void *a,const void *b) 
{
featureData *x = (featureData *) a;
featureData *y = (featureData *) b;

if ( x->Distance > y->Distance ) return 1;
if ( x->Distance < y->Distance ) return -1;
return 0;
}




 qsort(trainData, NO_OF_TRAINDATA, sizeof(*trainData), compare_function);

更多信息:

NO_OF_TRAINDATA = 609

NO_OF_ATT = 22

如果我将NO_OF_TRAINDATA设置为小于50,则C函数运行没有任何问题。这让我相信它存在一些内存大小问题,因为我经常在嵌入式系统上遇到内存问题。 但是,就内存分配而言,C快速排序(或者调用qsort使用的是什么)与std :: sort的工作方式不同?

1 个答案:

答案 0 :(得分:2)

我发现了问题: 我正在运行FreeRTOS并错误地认为freeRTOS中的任务正在系统堆栈上分配它的堆栈内存。 我的意思是FreeRTOS内部堆栈实际上是在我的设备堆上分配的。 显着增加设备堆后,它运行没有任何问题。

但是我想知道std :: sort和qsort()之间的区别,一个是使用较小的FreeRTOS堆栈而另一个不是。我假设qsort()具有更高的内存占用,导致堆栈/堆溢出。