Как в функции передать ссылку на структуру, чтобы пользоваться всеми объектами структуры
struct description_of_figure {
int x_A;
int y_A;
int x_B;
int y_B;
int x_C;
int y_C;
};
int area_of_our_triangle(struct description_of_figure) {
int value = (x_B - x_A) * (y_C - y_A) - (x_C - x_A) * (y_B - y_A);
int area = fabs(value) / 2;
return area;
}
Как мне передать в функцию int area_of_our_triangle ссылку на структуру description_of_figure, чтобы не писать в параметрах функции - int x_A и т.д. И чтобы я мог пользоваться всеми объектами этой структуры(т.е. int x_A; int y_A; int x_B; int y_B; int x_C; int y_C). Если я так пишу, то он подчеркивает саму функцию и в int value все объекты структуры как ошибку
Ответы (2 шт):
Надо просто указать имя аргумента-структуры, например, foo:
int area_of_our_triangle(struct description_of_figure foo) {
int value = (foo.x_B - foo.x_A) * (foo.y_C - foo.y_A)
- (foo.x_C - foo.x_A) * (foo.y_B - foo.y_A);
// ...
}
Но тяжёлые структуры более эффективно будет передавать не по значению а через указатель:
int area_of_our_triangle(const struct description_of_figure *foo) {
int value = (foo->x_B - foo->x_A) * (foo->y_C - foo->y_A)
- (foo->x_C - foo->x_A) * (foo->y_B - foo->y_A);
// ...
}
// ...
struct description_of_figure foo;
// ...
area_of_our_triangle(&foo)
В параметрах вашей функции вы указали тип передаваемого параметра struct description_of_figure, но пропустили сам параметр - переменную, через которую можно обращаться к полям конкретной структуры. Доступ к полям структуры осуществляется посредством объявления имя_переменой.поле или указатель_на_переменную->поле.
Вы можете использовать несколько вариантов.
Передача непосредственно самой структуры в вашу функцию:
int area_of_our_triangle(struct description_of_figure desc) { int value = (desc.x_B - desc.x_A) * (desc.y_C - desc.y_A) - (desc.x_C - desc.x_A) * (desc.y_B - desc.y_A); int area = fabs(value) / 2; return area; }
Этот вариант наименее предпочтителен, т.к. функция получает копию структуры и, соответственно, всех её полей. А копирование требует дополнительных затрат, которые в данном случае не нужны. Вызвать функцию можно так:
struct description_of_figure my_desc= {/*тут инициализируем поля*/};
int area = area_of_our_triangle(my_desc);
Передача в функцию ссылки на структуру (работает в C++, в "сыром" C ссылок нет):
int area_of_our_triangle(struct description_of_figure& desc) { int value = (desc.x_B - desc.x_A) * (desc.y_C - desc.y_A) - (desc.x_C - desc.x_A) * (desc.y_B - desc.y_A); int area = fabs(value) / 2; return area; }
В этом случае desc - это ссылка на оригинальную структуру, а не её копия, как в предыдущем примере. Однако вызывается точно так же.
Передача указателя на структуру:
int area_of_our_triangle(struct description_of_figure* pdesc) { int value = (pdesc->x_B - pdesc->x_A) * (pdesc->y_C - pdesc->y_A) - (pdesc->x_C - pdesc->x_A) * (pdesc->y_B - pdesc->y_A); int area = fabs(value) / 2; return area; }
Пример полностью аналогичен предыдущему, только теперь pdesc - это указатель, а не ссылка, а значит для обращения к полям вместо . используется ->. Вызвать функцию можно так:
struct description_of_figure my_desc= {/*тут инициализируем поля*/};
int area = area_of_our_triangle(&my_desc); //передаём указатель на структуру
Объявление функции, как член самой структуры. Правда это тоже уже не C, а C++ (если требуется именно синтаксис C, то можете этот вариант проигнорировать, ровно как и вариант с ссылками):
struct description_of_figure { int x_A; int y_A; int x_B; int y_B; int x_C; int y_C; int area_of_our_triangle() { int value = (x_B - x_A) * (y_C - y_A) - (x_C - x_A) * (y_B - y_A); int area = fabs(value) / 2; return area; } };
В этом примере нам уже не нужно явно объявлять переменную-параметр для доступа к полям. Этот параметр компилятор создаёт неявно, а к полям мы обращаемся, как к обычным переменным. С точки зрения ООП, такая функция уже сама является "полем" и вызвать её можно, например, так:
description_of_figure my_desc = {/*тут инициализируем поля*/};
int area = my_desc.area_of_our_triangle();