2016-05-08 3 views
0

私はこのような関数で私のソート関数に応じて値を取得しようとしています。パラメータとして渡しvoidポインタ

void * getBest(void *t, unsigned int n, unsigned int bytes, int (*vrt)(void *, void *)) { 
    int i = 0; 
    int returnI = 0; 
    for(i = 0; i < n; i++) { 
    if(i != returnI) { 
    if(vrt(t[i], t[returnI]) == 1) 
    { 
     returnI = i; 
    } 
    } 
    } 
    return t[returnI]; 
} 

次のようにソート機能を使用する:

int pieni_dbl(void *a, void *b) 
{ 
    double *ad = a; 
    double *bd = b; 
    return *ad < *bd; 
} 

そしてこの

double *parasDbl = getBest(dt, 6, sizeof(double), pieni_dbl); 
    short int *parasShort = getBest(st, 10, sizeof(short int), iso_itseis_short); 

のようにそれを呼び出すが、それはエラーを与える:算術演算で使用される型 'ボイド*' のポインタ[-Wpedantic ] if(vrt(t [i]、t [paras] == 1)

なぜですか?何らかの理由でvoidポインターをANSI cで比較する関数のパラメーターとして渡すことは可能ですか?

+0

**正確に**エラーが表示されます。次に、コンパイラが 'void *'が参照する型を逆参照するときにコンパイラがどの型を知っているかを考えてください。 – Olaf

+0

新しいコードでC89やC90を使用しないでください!それは17年以上後に廃止されました。 – Olaf

+0

ええ、私はANSI cが今日では廃止されていることを知っていますが、今はそれを使用しなければならず、エラーが発生しています(vrt(t [i]、t [returnI])== 1)。 – Laltzi

答えて

1

tvoid *型を持つこと、それは...間違っtwice-(またはthrice-)関数呼び出しを実行する上で考えると

vrt(t[i], t[returnI]) 

...、あなたがそうであるように。

最初に、式t[i]を考えてみましょう。そのタイプは何ですか?そのタイプはもちろん、voidです。これは、対応する関数パラメーターの正しい型ではありません(関数パラメーターの型も許されません)。

コンパイラはそれについて不平を言うことさえ回避しませんが、その影響を考慮してください。 t[i]のタイプはvoidなので、プログラムはどのように計算しようとしていますか? voidの額はどれくらいですか?実際、それは未定義であり、Cはvoid *で算術演算を実行することを禁じています。

おそらくあなたは「いいですが算術はどこですか」と言っているのでしょうか?まあ、Cはポインタの算術の点で配列のインデックスを定義しています。あなたの式t[i]は、*(t + i)に相当します。浮気、禁止された算術はvoid *です。

+0

これは本当になぜ起こっているのか分かります。 – Laltzi

0

a[i]という形式は、*(a + i)の省略形です。したがって、あなたは

if(vrt(*(t + i), *(t + returnI)) == 1) 

を書いているしかし、それは禁止されてvoid *を、逆参照が含まれます。

+0

これ以上の点では、 'void * 'に' + 'をつけることになります。 –

関連する問題