-2

多くの値を持つ Pair という構造体の配列があります。この配列を渡して繰り返し処理し、すべての値を出力するにはどうすればよいですか?

bool reflexive(Pair* a, int sizeOfA)
struct Pair {
  int x,y;
}one[5];

int main()
{


    one[0].x = one[0].y = 1;
    one[1].x = one[1].y = 2;
    one[2].x = one[2].y = 3;
    one[3].x = one[3].y = 4;
    one[4].x = one[4].y = 5;
    reflexive(&one, 5);         // I may also need to change this line
}

bool reflexive(Pair* a, int sizeOfA){    // This is the line that i need to change
  cout << a[0].x;          // I need to iterate through array and print all values

}

私の質問: 関数を変更して機能させるにはどうすればよいですか? また、配列を反復処理するにはどうすればよいですか?

4

4 に答える 4

2

任意の型の配列を渡すように。ポインター表記がなくても:

bool reflexive(Pair a[], int sizeOfA)   // or Pair* a
{ 
  cout << a[0].x;         
}

電話:

reflexive(one, 5);         // or &one[0], address of first element (both equivalent)

反復するには:(関数内)

for(int i=0;i<sizeOfA;i++)
cout<<a[i].x;

配列は参照によって渡されることに注意してください。また、最初の行のプロトタイプにはセミコロンがないことに注意してください。

于 2013-10-20T21:06:39.180 に答える
0

関数呼び出しのみを変更する必要があります。

reflexive(&(one[0]), 5);
于 2013-10-20T20:59:01.033 に答える
0

最初の行の最後のセミコロンを忘れました。また、絶対に必要であることが確実でない限り、グローバル変数の使用は避けてください。

変化する

reflexive(&one, 5); 

reflexive(one, 5); 

そして、再帰メソッド内で for ループを使用します。さらに、再帰メソッドの署名を次のように変更します -

bool reflexive(Pair[]* a, int sizeOfA)
于 2013-10-20T20:59:35.557 に答える
0

ジェリーのソリューションは問題なく機能しますが、渡すハードコーディングされた 5 および/または任意の sizeof 型式を回避する代替手段を次に示します。この解決策は、配列が単なるポインターに崩壊するのを防ぎます。これは、配列の大きさに関する情報を失う方法です。ポインターではなく参照によって配列を渡すことで、減衰を防ぐことができます。

常にサイズ 5 の配列を渡す場合は、再帰関数を次のように変更できます。

bool reflexive(Pair (&a)[5])
{
    for (const auto& b : a)
        cout << b.x;
    return true;
}

ご覧のとおり、これはまだ関数宣言にハードコードされた 5 を保持しています。常に既知のサイズの配列を渡す場合、つまり実行時に動的にサイズ変更されない場合、テンプレートを使用してそれを取り除くことができます:

template<size_t size> bool reflexive(Pair (&a)[size])
{
    for (const auto& b : a)
        cout << b.x;
    return true;
}

これで、(元のコードを使用して) 次のように任意の固定サイズの配列で reflexive を呼び出すことができます。

struct Pair {
  int x,y;
}one[5];

int main()
{
    one[0].x = one[0].y = 1;
    one[1].x = one[1].y = 2;
    one[2].x = one[2].y = 3;
    one[3].x = one[3].y = 4;
    one[4].x = one[4].y = 5;
    reflexive(one);
    return 0;
}

配列内の要素数と配列自体のもつれを解くと、開発者が誤って間違った数の要素を渡すというエラーが簡単に発生する可能性があるため、これをお勧めします。

于 2013-10-21T02:51:36.900 に答える