Ошибка
Когда вы вызываете свою функцию в main()
:
AthleticContest(subject[2]);
вы передаете в качестве аргумента один person
, который является третьим элементом вашего массива (элемент с индексом 2). Таким образом, компилятор понимает, что вы пытаетесь передать этот объект типа person
.
Но параметр вашей функции объявлен как массив типов неопределенного размера (т.е. person[]
). C ++ обрабатывает такие аргументы массива, как если бы они были указателем (на их первый элемент), например person*
.
Вот почему вы получаете это сообщение об ошибке: эти типы несовместимы
Решение
Чтобы избавиться от этой ошибки, решением было бы передать указатель на subject
, например:
AthleticContest(&subject[2]); // passes the pointer to the third element
// or
AthleticContest(subject); // passes the pointer to the first element of the original array
Однако будьте очень осторожны, поскольку ваша функция имеет очень рискованный дизайн: вы ожидаете, что аргумент будет указателем на массив из как минимум 3 последовательных элементов. Поэтому, если вы вызовете его с помощью &subject[8]
, он попытается получить доступ к subject[10]
, что выходит за пределы. Если вы позвоните с &subject[2]
, это сработает с информацией о garbege, поскольку вы инициализировали только первые два элемента, а не 3-й, 4-й и 6-й.
Лучшее решение
Непонятно, почему вы проводите состязание только с 3 элементами. Лучшим вариантом было бы, чтобы вызывающая сторона указала, сколько участников должно использоваться (вызывающая сторона знает размер массива).
In main()
:
AthleticContest(subject, 2); // 2 is the number of contestants in array
Ваша функция будет определена как:
int AthleticContest(person subjects[], int participants)
{
cout << "Athletic Contest!!!" << endl << endl;
for (int hh = 0; hh < participants; hh++)
...
for (int hh = 0; hh < participants; hh++)
...
}
гораздо лучшее решение
Вам лучше пойти на std::vector
вместо массивов C ++. Они могут вести себя как массивы:
vector<person> subject(2); // create a vector of 2 items
subject[0].athletic = 5;
...
Но они намного удобнее, потому что они могут иметь динамический размер и расти по мере добавления новых участников:
person hbolt = {4, 2, 1, 0};
subject.emplace_back (hbolt); // one more participant
AthleticContest(subject);
Ваша функция может получить вектор по ссылке или по значению. Давайте возьмем ссылку, так как вы намереваетесь изменить его содержимое и, возможно, захотите изменить эти данные после возврата:
int AthleticContest(vector<person> &subjects)
{
...
}
Большим преимуществом является то, что вы всегда можете узнать размер вектора:
for (int hh = 0; hh < subjects.size(); hh++)
...
Вот демоверсия онлайн .
Конечно, если вы не хотите брать всех участников вектора, вам нужно подумать об аргументе (ах) вашей функции: вы бы предпочли второй аргумент n и всегда принимали n первых элементов вектор? Или вы предпочитаете n участников, но начинаете с произвольного смещения? В обоих случаях было бы разумно проверить, чтобы индексирование никогда не выходило за пределы.