【问题标题】:SimGrid. How to write comparator?模拟网格。如何编写比较器?
【发布时间】:2016-05-29 22:34:50
【问题描述】:

我有一个动态的主机数组:

xbt_dynar_t dynar_host = xbt_dynar_new(sizeof(MSG_host_t), NULL);

每个主机都包含有关其触发器速度的信息。 我想按他们主机的速度对其进行排序。在文档中我找到了函数xbt_dynar_sort。该函数接受两个参数:动态数组本身和比较器int_f_cpvoid_cpvoid_t compar_fn

任何建议或示例如何编写此比较器?

【问题讨论】:

    标签: c compare simgrid


    【解决方案1】:

    此函数仅将标准qsort 函数应用于存储在dynar 中的数据,因此您还应该阅读libc documentationman pagethis tutorial 了解更多信息。

    所以你应该编写一个类似于以下的函数:

    int mycmp(void *a,void*b) 
    {
      MSG_host_t hostA = *(MSG_host_t*)a;
      MSG_host_t hostB = *(MSG_host_t*)b;
      double valA = MSG_host_get_speed(hostA);
      double valB = MSG_host_get_speed(hostB)
      return (valA > valB) - (valA < valB);
    }
    

    然后,致电 xbt_dynar_sort(dynar, mycmp) 对您的 dynar 进行排序。

    注意,函数返回行的实际比较有点复杂。这是一种以数值稳定的方式遵守函数语义的方法(如果 A B 则返回 1)。这在相关的documentation of libc 中有所建议。

    【讨论】:

    • 通过减法比较值绝不是一个好主意。在这种情况下,结果可能是 inf、NaN、超出范围或小数值,所有这些都转换为 int 会产生无效结果或未定义行为。
    • 好的,@2501。我更新了我的代码并添加了一小段来解释复杂的结果语法。感谢您的关注!
    猜你喜欢
    • 2016-01-27
    • 2023-03-30
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多