This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器:在ARM处理器上使用qsort()的问题

Guru**** 2595805 points
Other Parts Discussed in Thread: AWR1642, SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/625068/compiler-problem-of-using-qsort-on-the-arm-processer

“Thread:AWR1642SysBIOS”中讨论的其它部件

工具/软件:TI C/C++编译器

大家好

我在AWR1642上使用ARM内核,编译器版本是16.9 v.1.LTS。 我想按如下所示对数组结构进行排序,但是,当我运行代码时,它会显示错误。 似乎qsort要访问无效区域。 你能告诉我什么是错的吗?

谢谢

西宁

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


typedef struct {
浮动价格;
浮动测试;
int id;
} order;
order list[10];
int i = 0;

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

order *orderA =(order *) a;
order *orderB =(order *) b;

return (orderA-> price > orderB-> price)? 1:-1);
}

int main ()
{
srand((unsigned int)time(NULL));

printf ("排序前\n");
对于(i=0;i<10;i++){
list[i].price =(float) rand ()/(float)(RAND_MAX)* 10;
list[i].test = rand()%10;
list[I].id = i;
printf ("order id =%d price =%f Test =%f\n",list[i].id,list[i].price,list[i].test);
}
printf ("排序后\n");
int n;
qsort (列表,6,sizeof (顺序),比较);
对于(n=0;n<10;n++)
printf ("order id =%d price =%f Test =%f\n",list[n].id,list[n].price,list[n].test);
返回0;}

输出为:

排序之前
订单ID = 0价格= 6.34.7239万 测试= 8.0万
订单编号= 1价格= 1.64.7694万 测试= 3.0万
订单编号= 2价格= 5.4.9898万 测试= 5.0万
订单编号= 3价格= 8.67.4276万 测试= 4.0万
订单编号= 4价格= 4.47.0962万 测试= 0.0万
订单编号= 5价格= 6.62.5263万 测试= 6.0万
订单编号= 6价格= 3.48.2467万 测试= 9.0万
订单编号= 7价格= 6.93.0449万 测试= 9.0万
订单编号= 8价格= 5.34.1044万 测试= 6.0万
订单编号= 9价格= 5.46.556万 测试= 2.0万
排序后
ThreadType_Main中出现异常。
主手柄:0x0。
主堆栈底座:0x8019a40。
主堆栈大小:0x1000。
R0 = 0x804万 R8 = 0x8.0199万fc
R1 = 0x8.0199万e4 R9 = 0x804万
R2 = 0x0万c R10 = 0x0.871万
R3 = 0x0.871万 R11 = 0x0.0003万
R4 = 0x0.0005万 R12 = 0x804万
R5 = 0x0.333万 SP (R13)= 0x0801a9e8
R6 = 0x0万c LR (R14)= 0x0.0068万c3
R7 = 0x0.0006万 PC (R15)= 0x0.8738万
PSR = 0x000c01df
DFSR = 0x0万d IFSR = 0x0万
DFAR = 0x804万 IFAR = 0x0万
TI.SysBIOS.family.arm.exc.exception:line 205:e_dataAbort:PC = 0x0.8738万,LR = 0x0.0068万c3。
xdc.runtime.Error.raise:正在终止执行

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    放置printf()(或断点!) 在内部进行比较,以查看崩溃是在比较之前,期间还是之后发生,还是在其中几次比较之后发生。

    (只有6种原因?)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。

    在比较函数内部添加代码行<printf("\n比较成功.");>后,程序运行时不会崩溃。 但排序结果是错误的。 输出如下所示。

    [报价用户="Keith Barkley"](是否有理由只对其中的6个进行排序?)[/QUOT]

    在我的申请中,我不能决定每次登记多少个项目。 所以,这次有6个项目,下一次是7或5个。 (项目数取决于输入)。 我在这里粘贴的程序只是一个插图,用来显示我在实际应用程序中遇到的问题。

    排序之前
    订单ID = 0价格= 8.99.7162万 测试= 5.0万
    订单编号= 1价格= 1.83.5383万 测试= 7.0万
    订单编号= 2价格= 6.28.8339万 测试= 0.0万
    订单编号= 3价格= 8.46.1562万 测试= 0.0万
    订单编号= 4价格= 9.87.4569万 测试= 6.0万
    订单编号= 5价格= 4.93.3012万 测试= 9.0万
    订单编号= 6价格= 3.84.2585万 测试= 6.0万
    订单编号= 7价格= 0.87.1914万 测试= 2.0万
    订单编号= 8价格= 1.19.6631万 测试= 9.0万
    订单编号= 9价格= 0.25.5745万 测试= 2.0万
    排序后

    比较成功。
    比较成功。
    比较成功。

    <总计262>

    比较成功。
    比较成功。
    比较成功

    订单编号= 3.1725万价格= 0.0万 测试= 0.0万
    订单编号= 1.3432886亿价格= 0.0万 测试= 0.0万
    订单ID =-1价格= 0.0万 测试= 0.0万
    订单ID =-1价格= 0.0万 测试= 0.0万
    订单编号= 1.34323356亿价格= 0.0万 测试= 0.0万
    订单编号= 46价格= 0.0万 测试= 0.0万
    订单编号= 46价格= 0.0万 测试= nan
    订单ID = 0价格= 0.0万 测试= 0.0万
    订单ID = 0价格= 0.0万 测试= nan
    订单编号= 2.9463万价格= 0.0万 测试= 0.0万

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这听起来像是堆栈问题。 是否可以增加堆栈?

    打印尺寸(顺序)并查看是否有意义。

    也可以打印每个元素的地址,并确保在compare()中获得的指针正确。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将堆栈大小加倍(4K)。 这不有帮助。

    在我之前的测试中,有262次比较。 但是,只有6个元素需要排序。 您认为对比的数量对于这种大小的阵列来说是否太大?

    Xining Yu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    比较函数返回错误的值。  如果两个元素比较相等,则必须返回0:

    退货((ordera->价格> orderB->价格)? 1:
    (orderA->price < orderB->price)? -1:0);
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    首先,您的回答让我很喜欢我的问题。 感谢你的帮助。

    第二,正如您所看到的,在我的帖子中,没有任何元素具有相同的值。 为什么程序出错?

    第三,为什么qsort()函数在其他C编程软件上与我的“返回方法”运行良好?

    谢谢
    西宁

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,它应该是关于nlog2(n)的。 我在谷歌上搜索了一下,我不想把Sedgewick拖出来。 8^)。 在我看来,您好像在对内存进行重编,而且每次键盘都在变化,这会使快速排序发生混乱。 例如,如果为元素的大小提供了错误的值,这就是为什么我说要检查sizeof(order)的值。

    另一个可怕的事情是你正在努力超过6个元素. 谁知道qsort()有多少内存混乱?

    它看起来真的像qsort()错误,虽然这是很难相信的。 代码中的唯一错误是比较函数不能返回0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,您对TI员工提到的一个错误是正确的。 我检查元素的大小。 它给出了正确的值。 在本例中为12。 更正此错误后,代码有效。 我还向TI员工提出了其他问题,如您所见。

    感谢你的帮助。
    西宁

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不同的工具链实现了略有不同的qsort。 只要功能完成工作,这是可以的。 特别是,TI的实施似乎尝试将元素与自身进行比较。 我不想太仔细地看故障模式,但该功能似乎变得混淆了,进入了无限循环。 我怀疑这些值实际上并未损坏,但由于堆栈已用完,打印f正确显示这些值的能力已损坏。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,但正如我所指出的那样,您有错误,而不是TI。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没错。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    塞奇维克说,“为了打败死马,快速排序不是稳定的,也不是脆弱的。 我想你已经发现,不正确的比较功能可能会导致大问题。 我在第一次读取OP时发现了比较函数中的错误,但和您一样,我认为这不会使算法增加。