2017-12-14 12 views
2

Cで関数シグネチャvoid qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))を使用したいが、私の比較関数のシグネチャはint (*compar)(const void *, const void*, const int)である。クイックソート。1つの引数が定数のときにC内の関数ポインタのシグネチャを変更する

例として、異なるノルム(L0、L1、L2、およびLinifinityノルムなど)に従ってベクトル配列をソートしたいとします。実際にどの基準が比較関数に3番目の引数として渡されますが、qsortの呼び出し中は一定のままです。

qsort(a, 100, sizeof(a), cmp2); 

ような何かを呼び出すことができるように

//Function declaration for parametric comparison 
int cmp3(int* a_vec, int* b_vec, int x); 

// Somewhere in main 
int (*cmp2)(int, int); 
cmp2 = cmp3(int*, int*, 2);//2 could mean L2 norm 

のような形で割り当てを行うことが可能である私は、これは動作しません知っているが、私はそれは私が何をしたいのアイデアを与える願っています達成する。また、異なる比較方法の数が大きすぎるため、異なる比較関数とqsortの呼び出しを行うことはできません。

+0

を答えている(私は、スレッドの安全性を必要とする) – njg

+0

@ForceBru私もグローバル変数について考えたが、それは醜いです、そして素晴らしいもの –

+0

複数の比較関数を持ち、必要なものを渡すことができますか? –

答えて

4

これはpartial function applicationと呼ばれ、あなただけCでラッパーで、このような何かを達成することができます

int cmp3(int *a, int *b) { 
    return cmp2(a, b, 2); 
} 

あなたは部分関数のアプリケーションまたは多分マッピングまたは純粋な機能に興味があれば、あなたに見てみたいことがありますHaskellのような関数型プログラミング言語。

+0

"Cでラッパーでしか実現できません"、これは決して部分的な関数アプリケーションではありません。 – Stargateur

+0

@Stargateur、それとも?部分的な適用とは、ある関数にいくつかの引数を固定して、より小さなアリティの別の関数を生成するプロセスです。したがって、これはまさに 'cmp3(int *、int *、int)'を持ち、 'cmp3(int *、int * b)== cmp2 (a、b、2); '。 – ForceBru

+0

あなたは関数のアリティを減らさず、より小さなアリティを持つ2番目の関数を作成します:/。 https://stackoverflow.com/a/5531152/7076153、答えはNOです。 Cでの関数はプライマリ値ではありません。部分的な申請はできません。 – Stargateur

-1

主要な問題は、関数シグネチャが呼び出される前にスタック内の3つの要素を必要とすることです。古いCコンパイラは "スマート"で、十分なパラメータを渡さないと、空の変数(ゼロ)でスタックを「完成」します。

最近では(コンパイラが受け入れたと仮定して)、期待通りの値ではなく、スタックに未定義の値を持つ3番目の変数があります。

以前のコメントが言ったようにあなたは、「プロキシ」機能を実行する必要があります。

int cmp3(int *a, int *b) { 
    return cmp2(a, b, 2); 
} 
+0

スタックに関する明確化のおかげで、これは私が上記の応答を読んだ後に考えていた1つのことでした – njg

+2

私はどのスマートなCコンパイラを考えているのか分かりませんが、私はそのようなものに遭遇しませんでした最後の30年以上。 –

+0

私は過去にこれをコンパイルすることができたDigital Unix Cコンパイラを使用しました: void function(int a、int b、int c); int main(int argc、char ** argv){ function(12,13); return 0; } 問題なし。最後の変数に0を渡します。そして、「スマート」は、そのようなコードを受け入れるという奇妙な動作によるものでした。 – gwerners

関連する問題