2016-10-14 10 views
-1

私の関数f(void *data[])は、私が理解する限り、汎用ポインターの配列を引数として受け取ることになっています。私は特にグラムでvoid_t * arg []がvoidポインターの配列を必要とする関数に渡せません

size_t *cnt[8]; 
... // initialize pointers in cnt 
f(cnt); 

をしようとすると はいえ、私はコンパイルエラーを取得++自動的にそれはそれはそれはvoid**size_t**を変換することはできませんと言うよりも、cntsize_t**に変換し、かつ、f(void**)fのプロトタイプを変換し、 。

+3

「void *」の代わりにテンプレートと実際のタイプを使用してみませんか? – NathanOliver

+0

g ++ではありません。それはC++です。 'f(void * data [])'は 'f(void ** data)'と同じです – juanchopanza

+1

とにかく、予期した動作です。しかし、あなたの質問は何ですか? – juanchopanza

答えて

-1

Cはポインタ型ポインタからポインタ型ポインタへの暗黙的な変換を可能にしますが、C++ではこれを許可しません。 cntvoid **に明示的にキャストする必要があります。

+0

あなたが暗黙のうちに任意のポインタを' void ** 'に変換すると、まともなCコンパイラが少なくとも警告することに注意してください。 – user2079303

0

グラムが自動的にf(void**)

fのプロトタイプを変換++私は、正確な用語を使用して、より良いプログラミング言語を理解するのに役立ちますことを見つけます。 fであると考えるのは紛らわしいかもしれません。f(void**)に変換してください。それは賢明に事件を話していません。 f(void *data[])は、単にf(void** data)と書くもう1つの方法です。この別の構文は、構文砂糖の場合です。

通常、変換はあるタイプから別のタイプへの変更を意味します。関数の宣言には変換がありません。

また、この構文糖はコンパイラg ++に固有のものではありません。この動作はC++標準で指定されています。

f(cnt); 

それはcnt

size_t**この 実際の変換で変換されます。これは、 と呼ばれる特別なタイプの変換で、壊れるのはです。この暗黙的な変換も、構文上の砂糖です。これは、書き込みのように、意味的に同じである:

f(&cnt[0]); 

は*引数[]これが正しいのボイドポインタ

の配列を必要とする機能するようにsize_t型を渡すことはできません。

実際には、関数にはvoid**が必要ですが、関数にはsize_t**が渡されます。 size_t**は暗黙的にvoid**に変換されないので、プログラムは不正です。

1)の代わりにf(size_t**)を使用してください:

つの方法は、問題を修正します。

2)別の配列void *temp[8]に最初の場所

3)コピーsize_t *cnt[8]void*のアレイを使用して、関数にそれを渡します。

4)(推奨しません)cntvoid**をキャストし、機能が期待していることを期待してください。

+0

もっと類似した構文の唐辛子 –

+0

@LightnessRacesinOrbit私は「構文的なサッカリン」を使用していただろう:シンタクチック糖であることを試みるが、サッカリンがヒトの癌と関連しているという証拠の欠如によって類推だけが弱くならない。 – user2079303

+0

ねえ、そうするよ –

関連する問題