2016-05-29 9 views
1

私はホストの動的配列を持っている:SimGrid。コンパレータの書き方は?

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

各ホストはフロップでその速度に関する情報が含まれています。 ホストの速度でソートしたい。ドキュメントでは、関数xbt_dynar_sortが見つかりました。この関数は、動的配列自体とコンパレータint_f_cpvoid_cpvoid_t compar_fnの2つのパラメータを受け入れます。

このコンパレータはどのように記述できますか?

答えて

3

この機能は、dynarに格納されたデータへの標準qsort関数を適用するので、あなたはまた、より多くの情報のためlibc documentationman pageまたはthis tutorialをお読みください。あなたのdynarをソートするxbt_dynar_sort(dynar, mycmp)を呼び出し、その後、

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); 
} 

そして:

ですから、次のよう何とか同様の機能を記述する必要があります。

実際の関数の返り値の比較は少し複雑です。これは、数値的に安定した方法で関数の意味論(関数A == Bの場合は-1、A> Bの場合は-1を返します)を従う方法です。これは関連するdocumentation of libcに記載されているとおりです。

+1

減算による値の比較は決して良い考えではありません。この場合、結果はinf、NaN、範囲外または小数値であり、それらのすべてがintに変換されると、無効な結果または未定義の結果が返されます。 – 2501

+1

Ok、@ 2501。私は自分のコードを更新し、複雑な結果の構文を説明する少しの段落を追加しました。気づいてくれてありがとう! –

関連する問題