少なくともあなたの説明から、あなたは PRI 値の並べ替えだけに関心がありますが、正の値の後に負の値が来るようにします (ただし、正の値は順番に並べる必要があります)。
これを行う簡単な方法の 1 つは、比較を行う前に PRI 値を unsigned にキャストすることです。符号なしに変換すると、負の値は 2 N -1 を法として減らされるので、(たとえば) -1 は UINT_MAX に変換されます (さらに重要なことに、すべての負の数は、最初は正の数よりも大きい符号なしの数に変換されます)。署名された番号)。
typedef struct {
int PID;
int PRI;
} proc;
int cmp(void const *a, void const *b) {
proc const *aa = (proc const *)a;
proc const *bb = (proc const *)b;
if ((unsigned)(bb->PRI) < (unsigned)(aa->PRI))
return -1;
if ((unsigned)(aa->PRI) < (unsigned)(bb->PRI))
return 1;
return 0;
}
最後に、PRI 値の同等性のみに基づいて 0 を返す代わりに、PID の比較を追加することもできます。これにより、アイテムは PRI 値と等しくなり、PID でソートされます。あなたは本当にそれが必要/欲しいと言っていないので、今のところそれを省略しました(そして、コードが少し長くなり、特にそこにあるとは思わない場合は、理解するのが難しくなる可能性があります)。
編集:明確でない場合、この比較関数は で動作することを意図しておりqsort
、(比較を正しく行うと仮定して)安定した並べ替えは必要ありません。1 回の比較で関連するすべてのフィールドを比較するのではなく、最初に 1 つのフィールドでソートし、次に 2 番目のフィールドで 2 番目の (別の) ソートを行う (ほとんど常に遅い) ルートに進むことにした場合にのみ、安定したソートが必要です。