1

私はプロトタイプを持つ関数を持っています:

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

別の関数には という別の構造体がthreadDataあり、これを使用して複数のスレッドで実行される関数に情報を送信します。この構造体の要素の 1 つは のリストでstruct waveあるため、このコードの短いバージョンは次のようになります。

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

これを別の関数で使用します。基本的に最初に構造データへのポインタを送信し、次にこの関数内で「procedureForEachWave」関数を次のようなループで呼び出します。

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

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

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

しかし、これは機能しません。なんで?どうすればそれを機能させることができますか?明確にするために、データはポインターではなく変数として宣言されるようになり、Barge と Settings は既にポインターになっています。waveList は次のように宣言されます。

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

2 に答える 2

0

内部で何が起こっているかを何も知らなければ、procedureForEachWave何が問題なのかを特定するのは (不可能ではないにしても) 困難です。

dataただし、機能する呼び出しと機能しない呼び出しの間で使用方法が異なるようです。同じ を使用している場合data、呼び出しは同じである必要があります ( を 0 に置き換えますi)。それらが異なる場合、この other の定義を提供してくださいdata

于 2012-04-24T13:24:06.280 に答える
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);

ポインターで渡されたサイズが&value1 より大きい場合、未定義の動作になることに注意してください。他の 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ます。

于 2012-04-24T13:59:27.590 に答える