模拟网格。比较器怎么写?
SimGrid. How to write comparator?
我有一个主机的动态数组:
xbt_dynar_t dynar_host = xbt_dynar_new(sizeof(MSG_host_t), NULL);
每个主机都包含有关其速度的信息(以触发器为单位)。
我想按他们的主人的速度排序。在文档中我找到了函数 xbt_dynar_sort。这个函数接受两个参数:动态数组本身和比较器int_f_cpvoid_cpvoid_t compar_fn
。
任何建议或示例如何编写此比较器?
此函数仅将标准 qsort
函数应用于存储在 dynar 中的数据,因此您还应阅读 libc documentation, the man page or this 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 进行排序。
注意函数的return行实际比较有点复杂。这是一种以数值稳定的方式服从函数语义(return -1 如果 A < B,如果 A==B 则为 0,如果 A > B 则为 1)。这是相关 documentation of libc.
中的建议
我有一个主机的动态数组:
xbt_dynar_t dynar_host = xbt_dynar_new(sizeof(MSG_host_t), NULL);
每个主机都包含有关其速度的信息(以触发器为单位)。
我想按他们的主人的速度排序。在文档中我找到了函数 xbt_dynar_sort。这个函数接受两个参数:动态数组本身和比较器int_f_cpvoid_cpvoid_t compar_fn
。
任何建议或示例如何编写此比较器?
此函数仅将标准 qsort
函数应用于存储在 dynar 中的数据,因此您还应阅读 libc documentation, the man page or this 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 进行排序。
注意函数的return行实际比较有点复杂。这是一种以数值稳定的方式服从函数语义(return -1 如果 A < B,如果 A==B 则为 0,如果 A > B 则为 1)。这是相关 documentation of libc.
中的建议