C SimGrid。如何编写比较器?

C SimGrid。如何编写比较器?,c,compare,simgrid,C,Compare,Simgrid,我有一个动态主机阵列: xbt_dynar_t dynar_host = xbt_dynar_new(sizeof(MSG_host_t), NULL); 每个主机都包含有关其速度的信息(以触发器为单位)。 我想按主人的速度来分类。在文档中我找到了函数。此函数接受两个参数:动态数组本身和比较器int\u f\u cpvoid\u cpvoid\u t compar\u fn 有任何建议或示例说明如何编写此比较器吗?此函数仅将标准的qsort函数应用于存储在dynar中的数据,因此您还应阅读或以

我有一个动态主机阵列:

xbt_dynar_t dynar_host = xbt_dynar_new(sizeof(MSG_host_t), NULL);
每个主机都包含有关其速度的信息(以触发器为单位)。 我想按主人的速度来分类。在文档中我找到了函数。此函数接受两个参数:动态数组本身和比较器
int\u f\u cpvoid\u cpvoid\u t compar\u fn


有任何建议或示例说明如何编写此比较器吗?

此函数仅将标准的
qsort
函数应用于存储在dynar中的数据,因此您还应阅读或以了解更多信息

因此,您应该编写一个类似于以下内容的函数:

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);
}
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\u host\u get\u speed(hostA);
double valB=消息主机获取速度(主机B)
返回(valA>valB)-(valA
然后,调用
xbt\u dynar\u sort(dynar,mycmp)
对dynar进行排序


请注意,函数返回行上的实际比较有点复杂。这是一种遵循函数语义的方法(如果aB,则返回1)。这是相关章节中的建议。

此功能仅将标准的
qsort
功能应用于dynar中存储的数据,因此您还应阅读、或以了解更多信息

因此,您应该编写一个类似于以下内容的函数:

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);
}
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\u host\u get\u speed(hostA);
double valB=消息主机获取速度(主机B)
返回(valA>valB)-(valA
然后,调用
xbt\u dynar\u sort(dynar,mycmp)
对dynar进行排序


请注意,函数返回行上的实际比较有点复杂。这是一种遵循函数语义的方法(如果aB,则返回1)。这是相关手册中建议的。

通过减法比较值从来都不是一个好主意。在这种情况下,结果可能是inf、NaN、超出范围或一个分数值,所有这些值都转换为int会产生无效结果或未定义的行为。好的,@2501。我更新了我的代码,并添加了一个小段落来解释复杂的结果语法。谢谢你的关注!用减法比较值从来都不是个好主意。在这种情况下,结果可能是inf、NaN、超出范围或一个分数值,所有这些值都转换为int会产生无效结果或未定义的行为。好的,@2501。我更新了我的代码,并添加了一个小段落来解释复杂的结果语法。谢谢你的关注!