【问题标题】:Porting array sorting function from c++ to c on embedded system在嵌入式系统上将数组排序功能从 c++ 移植到 c
【发布时间】:2016-02-28 00:50:16
【问题描述】:

我尝试将以下 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 不同?

【问题讨论】:

  • 我们不是千里眼。 “我的代码不起作用”很难诊断。使用调试器。也许你遇到了堆栈溢出?
  • 我测试了堆栈溢出但我更改了堆栈大小并且它在同一点崩溃,所以我可以排除这种情况。我试图捕获异常,但不幸的是我的系统不支持异常处理程序。比较功能呢,对吗? qsort 参数也使用正确吗?我现在将尝试在桌面上运行相同的代码,以确认基本代码是否正常工作
  • trainData 是如何声明的?提交任何修复的完整代码。
  • 它的声明是这样的:featureData trainData[NO_OF_TRAINDATA];它充满了来自文本文件的数据,只有距离每次迭代都会改变,值总是保持不变。我不能全部复制,因为这个类总共有 2000 行代码。
  • 1.确保您的 trainData 数组对于您正在使用的处理器是字对齐的。您可能需要使用#pragma 来执行此操作。 2. 确保您的trainData 数组适合您为其分配的内存(堆栈或堆)。 3. 如果您的代码在第二次迭代时总是崩溃,请查看指向trainData 开头的指针在该次迭代中是否仍然有效。

标签: c++ c sorting embedded


【解决方案1】:

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

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

【讨论】:

  • 这些函数的主要问题是they are probably recursive 所以它们不会对堆栈友好。只是猜测,但我认为 std::sort 名称可能会导致库实现者跳出框框思考并就使用哪种排序算法做出一些明智的决定,而名称 qsort 确实暗示了 Quicksort,而只是 Quicksort,即使 C 标准实际上并没有说明该函数必须如何在内部实现。
猜你喜欢
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多