0

わかりました。コースからかなり外れた回答が得られたので、この投稿を編集して、明確にするために教科書からメモを追加すると思いました。

配列内の要素の数が配列のサイズより少ない場合があります。たとえば、学生がコースを削除または追加すると、学生データを格納する配列内の要素の数が増減する場合があります。このような状況では、実際のデータを保持する配列のコンポーネントのみを処理する必要があります。このような配列を処理する関数を作成するには、配列を仮パラメーターとして宣言することに加えて、次の関数のように、配列内の要素の数を指定する別の仮パラメーターを宣言します。

void initialize(int list[], int listSize)
{
int count;
for (count = 0; count < listSize; count++)
list[count] = 0;
}

関数initializeの最初のパラメーターは、任意のサイズのint配列です。関数initializeが呼び出されると、実際の配列のサイズが関数initializeの2番目のパラメーターとして渡されます。

さて、教科書のメモを含む例全体を投稿したので、混乱して、配列がゼロに設定されたのです。メモは、サイズがゼロに設定されているため、この関数によってユーザーが任意のサイズの配列を使用できるようになっているという印象を与えます。これにより、ユーザーは任意のサイズの配列を選択できますか?毎回ゼロにリセットされるので、次回に必要なユニットが多かれ少なかれ、デフォルトでゼロになり、再び埋めることができますか?

4

5 に答える 5

2

あなたが言った:

関数initializeを使用して、配列の値をlistsizeに渡すことにより、配列リストの値を決定することを知っています。

番号。それは真実ではない。この関数は何かを決定するのではなく、すべての配列(listsizeインデックスまで、ところで:実際にはこのリストサイズより大きいlistsizeを渡すことができるので危険かもしれません)を0で初期化することです。

配列の値をlistsizeに渡すことによって

いいえ!ここでは、listsizeは要素の値ではなく、配列サイズです。「for」ループ@JasonxDを見てください。リストサイズのある配列でこの関数を呼び出そうとしましたか?

于 2013-03-15T01:51:34.040 に答える
1

コードが適切にフォーマットされていれば、ループlist[count] = 0;を通過するたびにステートメントが実行されることがより明確になる可能性があります。for

つまり、ループを通過するたびに要素をゼロに設定します。その結果、ループが完了した後、配列内のすべての要素がゼロに設定されます。

于 2013-03-15T01:52:20.013 に答える
0

「カウント=0」について話している場合は、次のようになります。

より一般的な構文は次のとおりです。for(int blah = 0; blah <max; blah ++)

しかし、for()ステートメント自体の中で'blah'を宣言しなければならない理由はありません。

int blah;
for(blah = 0; blah < max; blah++)

...も許容されます。

または:

int blah = 0;
for( ; blah < max; blah++)

for()ステートメントの範囲を超えて'blah'が存在することが望まれる場合があります(ただし、この例ではそうではありません)。そのため、後でそれを使用して何かを行うことができます。

int fileNum = 0;
for( ; fileNum < maxFiles && file_exists(fileNum); fileNum++)
{
    //...do something...
}

int lastFileWas = fileNum; //Either it's 'maxFile', or the first file that didn't exist.

for()ステートメントの外に変数を配置するもう1つの理由は、変数が実際に非常に大きい場合であり、ステートメントの外にあるとコードが読みやすくなります。

std::vector< std::pair<std::string, int> >::iterator myIterator = myVector.begin();
for( ; myIterator != myVector.end(); myIterator++)

これは、forステートメント自体の内部にある場合は非常に厄介です(std :: vector <std :: pair> :: iteratorは、書き出すのに非常に長い変数名であり、for()ステートメントに詰め込むのは厄介です) 。(ただし、これはC ++ 11の「auto」キーワードではそれほど問題にはなりません)。

「list[count]= 0;」について話している場合は、次のようになります。

配列では、値を割り当てるために、角かっこ(「添え字演算子」と呼ばれる)を使用して配列に「インデックスを付ける」ことができ、配列のメモリに保持されている個々の変数(「要素」と呼ばれる)にアクセスできます。

int myArray[10]; //10 integers in a block of memory.

myArray[0] = 5; //Accessing the first element in the block of memory.
myArray[3] = 17; //Accessing the fourth element in the block of memory.

一般に:

C ++を使用しているので、通常(90%の時間)std::vectorを使用する方が良いでしょう。配列は、メモリブロックへのポインタに非常に似ており、通常の変数のように扱うことができないため、かなり奇妙です。std :: vectorは、他の多くの利点とは別に、配列をラップして、通常の変数のように扱うことができるようにします(ベクトルは1つであるため)。

于 2013-03-15T01:50:20.737 に答える
0

それはそれが言うことをしている、それは初期化している。この場合、メソッドはのすべての要素をに設定するだけlistです0。中かっこを追加すると、おそらくより明確になります。

for (count = 0; count < listSize; count++)
{
  list[count] = 0;
}

So based on your updated post、本の説明には、1)配列の一部だけが有効なデータを持っている可能性があるため、配列全体を処理したくない場合があります2)このように動作する配列を処理する関数を作成するには、これらの配列を処理する関数だけでなく、配列をパラメーターとして受け取りますが、有効な要素の数も取ります。initialize3)テキストで何も説明しなかったルールに従って、BUT実際にの最終結果を表す関数の例を提供しますinitialize

私の上記の説明と他の投稿は、の正確な説明を提供しますinitialize

于 2013-03-15T01:45:45.413 に答える
0

同じことを達成する別の簡単な方法:

memset(list, 0, sizeof(int)*listSize);

listこれは、データ型のサイズに要素数を掛けて計算し、すべてを 0 に設定することによって、割り当てられたメモリのブロック全体を取得します。

于 2013-03-15T01:56:08.533 に答える