私はCの初心者で、qsort関数に必要な比較関数を理解しようとしています。
パート1:構文
簡単な推奨される使用法は次のとおりです(結果を出力するためにいくつかのmain()コードも含めました):
#include <stdio.h>
#include <stdlib.h>
int values[] = { 40, 10, 100, 90, 20, 25, 12, 13, 10, 40 };
int compare(const void *a, const void *b)
{
const int *ia = (const int *)a; // casting pointer types
const int *ib = (const int *)b;
return *ia - *ib;
}
int main()
{
int n;
for (n=0; n<10; n++)
{
printf("%d ",values[n]);
}
printf("\n");
qsort(values, 10, sizeof(int), compare);
for (n=0; n<10; n++)
{
printf("%d ",values[n]);
}
printf("\n");
system("pause");
return 0;
}
比較関数に余分なものがすべて必要な理由がわからないので、次のように簡略化しました。
int compare (int *a, int *b)
{
return *a-*b;
}
これは引き続き機能し、同じ結果を生成します。誰かが私が削除したものと、なぜそれがまだ機能するのかを私に説明できますか?
パート2:なぜポインター?
さらに、本当にポインタを使用する必要がありますか?「a」と「b」を直接比較できないのはなぜですか(これは機能しません)。
int compare (int a, int b)
{
return a-b;
}
何らかの理由で、多次元配列を使用すると、ポインターを使用せずに回避することができ、何らかの理由で機能しました。何が起こっている?(各サブ配列の2番目の項目で多次元配列をソートするサンプルコード):
#include <stdio.h>
#include <stdlib.h>
int values[7][3] = { {40,55}, {10,52}, {100,8}, {90,90}, {20,91}, {25,24} };
int compare(int a[2], int b[2])
{
return a[1] - b[1];
}
int main()
{
int n;
for (n=0; n<6; n++)
{
printf("%d,",values[n][0]);
printf("%d ",values[n][1]);
}
printf("\n");
qsort(values, 6, sizeof(int)*3, compare);
for (n=0; n<6; n++)
{
printf("%d,",values[n][0]);
printf("%d ",values[n][1]);
}
printf("\n");
system("pause");
return 0;
}
とにかくそれが私の最終目標であるため、多次元配列の並べ替えが機能していることを本当に嬉しく思いますが、どうやってそれを機能させることができたのかわかりません(運が悪いとコードを切り刻む以外)ので、説明が大好きです私が提供した例のいくつかが機能する理由と、機能しない理由について説明します。