kclib1_0002
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* kclib1のページ#2
-(by [[K]], 2019.04.16)
** (4) kqsort
-void kqsort(void *base, int num, int size, int (*compare...
--標準関数qsort()に対して、末尾に引数optを追加しました。...
----
-[詳細説明]
--そもそもなんで比較関数を呼び出すときにoptを渡せるように...
--まずここに、学校で40人のクラスがあって、その成績がある...
struct Data_ {
int num[10];
char *nam;
} Data;
enum { NO, KOKU, SUU, EI, RI, SYA, ON, BI, GIKA, TAI }; ...
Data data[40] = { ... };
--これを国語の成績順に並べるとしたらどう書けばいいでしょ...
int comp1a(const void *a, const void *b)
{
const Data *da = a, *db = b;
return da->num[KOKU] - db->num[KOKU]; // この書き方...
}
qsort(data, 40, sizeof (Data), comp1);
--では、算数の成績順に並べるとしたら?・・・こうですよね。
int comp2a(const void *a, const void *b)
{
const Data *da = a, *db = b;
return da->num[SUU] - db->num[SUU]; // この書き方の...
}
qsort(data, 40, sizeof (Data), comp2);
--この調子で9教科+出席番号順のソートを実装すると、10個の...
--では、どうすればいいでしょうか?・・・そうです、比較関...
int compAsc(void *opt, const void *a, const void *b)
{
int i = (int) opt;
const Data *da = a, *db = b;
return da->num[i] - db->num[i];
}
int compDesc(void *opt, const void *a, const void *b)
{
int i = (int) opt;
const Data *da = a, *db = b;
return db->num[i] - da->num[i];
}
--これがあれば、国語の成績順に並べるときは、
kqsort(data, 40, sizeof (Data), compAsc, (void *) KOKU);
--とやれば済むのです。もう新しい比較関数を作る必要はあり...
--このように、コールバック関数を関数に渡すときは、追加の...
--だから、むしろけしからんのはqsortのほうなのです。という...
----
-[効果]この関数を使うことで、比較関数をたくさん書かなけれ...
----
-[内部実装]
#include <stdlib.h>
static void *opt_;
static int (*comp_)(void *, const void *, const void *);
static int comp(const void *a, const void *b)
{
return comp_(opt_, a, b);
}
void kqsort(void *base, size_t num, size_t size, int (*c...
{
opt_ = opt;
comp_ = compare;
qsort(base, num, size, comp);
}
* こめんと欄
#comment
終了行:
* kclib1のページ#2
-(by [[K]], 2019.04.16)
** (4) kqsort
-void kqsort(void *base, int num, int size, int (*compare...
--標準関数qsort()に対して、末尾に引数optを追加しました。...
----
-[詳細説明]
--そもそもなんで比較関数を呼び出すときにoptを渡せるように...
--まずここに、学校で40人のクラスがあって、その成績がある...
struct Data_ {
int num[10];
char *nam;
} Data;
enum { NO, KOKU, SUU, EI, RI, SYA, ON, BI, GIKA, TAI }; ...
Data data[40] = { ... };
--これを国語の成績順に並べるとしたらどう書けばいいでしょ...
int comp1a(const void *a, const void *b)
{
const Data *da = a, *db = b;
return da->num[KOKU] - db->num[KOKU]; // この書き方...
}
qsort(data, 40, sizeof (Data), comp1);
--では、算数の成績順に並べるとしたら?・・・こうですよね。
int comp2a(const void *a, const void *b)
{
const Data *da = a, *db = b;
return da->num[SUU] - db->num[SUU]; // この書き方の...
}
qsort(data, 40, sizeof (Data), comp2);
--この調子で9教科+出席番号順のソートを実装すると、10個の...
--では、どうすればいいでしょうか?・・・そうです、比較関...
int compAsc(void *opt, const void *a, const void *b)
{
int i = (int) opt;
const Data *da = a, *db = b;
return da->num[i] - db->num[i];
}
int compDesc(void *opt, const void *a, const void *b)
{
int i = (int) opt;
const Data *da = a, *db = b;
return db->num[i] - da->num[i];
}
--これがあれば、国語の成績順に並べるときは、
kqsort(data, 40, sizeof (Data), compAsc, (void *) KOKU);
--とやれば済むのです。もう新しい比較関数を作る必要はあり...
--このように、コールバック関数を関数に渡すときは、追加の...
--だから、むしろけしからんのはqsortのほうなのです。という...
----
-[効果]この関数を使うことで、比較関数をたくさん書かなけれ...
----
-[内部実装]
#include <stdlib.h>
static void *opt_;
static int (*comp_)(void *, const void *, const void *);
static int comp(const void *a, const void *b)
{
return comp_(opt_, a, b);
}
void kqsort(void *base, size_t num, size_t size, int (*c...
{
opt_ = opt;
comp_ = compare;
qsort(base, num, size, comp);
}
* こめんと欄
#comment
ページ名: