2012-04-24 12 views
1

を機能させる構造体のリストと構造を渡す:は、私がプロトタイプを持つ関数を持っている

void procedureForEachWave(struct barge *Barge, struct settings *Settings, struct wave *Wave) 

私は別の構造が、私はいくつかのスレッドで実行する機能に情報を送信するために使用threadDataと呼ばれている別の関数では、この構造の要素の一つはstruct waveのリストであるので、このコードの短いvesionが行く:

struct threadData data; 
data.waveList = (struct wave*) malloc(sizeof(struct wave)*nrOfWaves); 

私は基本的に第1の構造データへのポインタを送信する別の機能でこれを使用し、そしてこの関数の中で"procedureForEachWave"関数は次のようなループで呼び出されます。

procedureForEachWave(data->Barge, data->Settings, &data->waveList[i]); 

これは問題なく動作します。しかし、私は1つのウェーブだけを使うという分析もしたいのです。つまり、リストには1つの要素しか含まれていないので、最初の関数を呼び出す必要はありません。私はこれをしたいだけです:

procedureForEachWave(Barge, Settings, &data.waveList[0]); 

これは動作しません。どうして?どうすればそれを稼働させることができますか?明確にするため、データはポインタではなく変数として宣言され、割り込みと設定はすでにポインタになっています。 waveListは次のように宣言されています:

data.waveList = (struct wave*) malloc(sizeof(struct wave)); 
+1

「動作しない」とはどういう意味ですか?コンパイルエラーまたは実行時エラーが出ますか、それとも期待していないランタイム結果を出すのですか?コンパイラ/リンカが準拠している場合は、正確なエラーメッセージを投稿してください。 – Mahesh

+0

複数の読み込みの後でもこれを理解することはできません。 PlsはあなたのQnを簡単に言い換えることを検討します –

+0

実行されません - あなたは実行時にあなたが気に入っているようにコンパイルしないか、動作しません。 –

答えて

0

procedureForEachWaveの内部で何が起こっているかについては何も知らない、問題が何であるかを伝えることが難しい(不可能ではない)です。

しかし、dataは、動作する呼び出しと動作しない呼び出しの間で異なって使用されているように見えます。彼らが同じdataを使用している場合、コールは同じでなければなりません(iの場合は0を代入します)。それらが異なる場合は、dataの定義を入力してください。

0

は、コード断片を考えてみましょう。

extern void wave_function(struct wave *); 
struct wave value  = { ... }; 
struct wave array[10] = { { ... } }; 

wave_function(&value); 
wave_function(array); 
wave_function(&array[5]); 

呼び出された関数は、それが、それが単一の値または値の配列へのポインタへのポインタが渡されたかどうかを与えられたポインタから言うことができません。関数呼び出しと呼ばれる機能は、おそらく別の引数として配列の要素数を含むことで、ポインタを使用する方法に同意する必要があります。

extern void alt_wave_function(struct wave *, size_t); 

alt_wave_function(&value, 1); 
alt_wave_function(array, 10); 
alt_wave_function(&array[5], 3); 

注意をポインタ&valueで渡されたサイズであった場合、その1より大きい場合、未定義の動作になります。他の2つの呼び出しは、どちらも完全に正当です.3番目の呼び出しは、配列の3行のサブセットを効果的に関数に渡します。

関数内では、任意のポインタ引数は、単一の値へのポインタとして、または値の配列内の最初の項目へのポインタとして扱うことができます。どちらも正しいです。実際には、次のように書くこともできます。

void wave_function(struct wave *ptr) 
{ 
} 

void wave_function(struct wave ptr[]) 
{ 
} 

これらは同等の宣言です(ただし、引数リストのみ)。あなたはC99構文でそれをドレスアップしない限り、それは、機能に何の情報を伝えていないのにあなたも、配列表記でサイズを含めることができます。

void wave_function(struct wave array[static 4]) 
{ 
} 

この表記を、呼び出し元があることを保証しなければならないことを意味し、少なくとも4このバージョンのwave_functionに渡された配列の要素

関連する問題