1

私の質問は、struct.variable (または構造体配列) を void 関数に渡す方法です。基本的に、コードは次のようになります。

構造体

struct Person{
    string surname;
    string BType;
    string organ;
    int age;
    int year, ID, IDp;
} Patient[50], Donor[50];

int i; // counter variables for the arrays such as Patient[i].BType... etc
int i1; 

次に、関数のコードは次のような行です。

void compare(int &i, int &i1, Person &Patient[50], Person &Donor[50]);

ii1Patientおよび構造体を渡そうとしましたDonor。なぜこれがうまくいかないのですか?これらの種類の構造体を関数に渡す特別な方法はありますか?

変数構造体への値もファイルから読み取られます (ここで何かが変わるとは思わないでください)。何か案は?

4

3 に答える 3

5

関数プロトタイプが正しくありません。固定配列型参照を渡すには、配列インデックス宣言の外でパラメーターの参照部分を修飾する必要があります。

void compare(int &i, int &i1, Person (&Patient)[50], Person (&Donor)[50])
//  note parens ----------------------^-------^-------------^------^

単純に呼び出す

compare(i, i1, Patient, Donor);

推論によって固定配列サイズを保証するテンプレートを使用してこれを行うことができることに注意してください。

template<size_t N>
void compare(int &i, int &i1, Person (&Patient)[N], Person (&Donor)[N])
{
    // N is guarenteed to be the size of your array. You can use it
    //  as you would 50 in your code.
    for (size_t i=0; i<N;++i)
    {
        // do something with Patient and Donor elements
    }
}

これには、異なる配列サイズでインスタンス化できるという追加の利点があります。つまり、これを行うこともできます:

Person Patient[50], Donor[50];
Person MorePatients[10], MoreDonors[10];

....

compare(i, i1, Patient, Donor);
compare(i, i1, MorePatients, MoreDonors)

正しくコンパイルされます。試してみることをお勧めします。役に立つかもしれません。

于 2013-10-11T03:51:26.903 に答える
1

WhozCraig が言ったことに加えて、看護師や助産師など、病院で見つけることができる任意の数の種類のものを渡すことができるように、そこに可変引数のテンプレート パラメーターを配置することもできます!

template <typename T1, size_t N1>
void compare(int &i, int &i1, T1 (&array)[N1]) {
    for (const auto& elem : array) {
        std::cout << elem.name << std::endl;   
    }
}

template <typename T1, size_t N1, typename... Ts, size_t... Ns>
void compare(int &i, int &i1, T1 (&array)[N1], Ts (&... arrays)[Ns]) {
    for (const auto& elem : array) {
        std::cout << elem.name << std::endl;   
    } 
    std::cout << std::endl;
    compare(i, i1, arrays...);
}

struct Nurse
{ std::string name; };

struct Midwife
{ std::string name; };


int main() {
    Nurse nurses[] = {{"Nina"}, {"Austin"}};
    Midwife midwives[] = {{"Matriona"}, {"Lizbeth"}, {"Jill"}};
    Nurse evenMoreNurses[] = {{"Maria"}, {"Nick"}, {"Martine"}, {"Ashley"}};

    int i{};
    int i1{};

    compare(i, i1, nurses, midwives, evenMoreNurses);
}

C++ がいかに楽しいものであるかを理解できましたか?

于 2013-10-11T04:24:26.760 に答える
0

次のように関数を宣言するだけです:

void compare(int i, int i1, Person *Patient, Person *Donor);

次のように呼び出すことができます:

比較(i, i1, 患者, ドナー)

于 2013-10-11T05:10:13.460 に答える