Передача структур в пустую функцию

Мой вопрос заключается в том, как вы передаете struct.variable (или массив struct) в функцию 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]);

Я пытался передать i, i1, Patient а также Donor Структуры. Почему это не сработает? Есть ли особый способ передачи таких функций в функцию?

Значения в структурах переменных также считываются из файла (не думайте, что это что-то здесь меняет). Есть идеи?

3 ответа

Решение

Прототип вашей функции неверен. Чтобы передать фиксированную ссылку на тип массива, необходимо указать ссылочную часть параметра вне объявления индекса массива.

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)

и он будет правильно скомпилирован. Я предлагаю вам поэкспериментировать с этим, вы можете найти это полезным.

В дополнение к тому, что сказал 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++?

Просто объявите функцию так:

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

Вы можете вызвать как:

сравнить (я, i1, пациент, донор)

Другие вопросы по тегам