Функция, возвращающая неожиданные значения структуры
Я совершенно новичок в структурах и пользовательских типах данных, и я пытался создать функцию, которая возвращает структуру:
Проблема освещается комментарием:
#include <iostream>
using namespace std;
struct num {
int n[2];
};
num func( num x, int a, int b) {
x.n[0] = a+b;
x.n[1] = a*b;
return x;
}
int main() {
int x,y;
num s1;
cout << "enter: ";
cin >> x >> y;
func(s1,x,y);
cout << s1.n[0] << "n" << s1.n[1]; // THIS GIVES ERROR
cout << func(s1,x,y).n[0] << "n" << func(s1,x,y).n[1]; // THIS DOENST GIVE ERROR
return 0;
}
Я понимаю, что второй метод имеет смысл и возвращает переменную struct. затем точка обращается к внутренней переменной struct.
Но я не понимаю , Почему первый метод терпит неудачу, или дает нечетный выход. Функция выполнила свою работу, т. е. сделала s1.n[0] = x + y
и s1.n[1] = x*y
Сейчас, печать s1.n[0]
должна печатать только x + y
. Как мы можем проверить и исправить внутреннюю работу функции?
4 ответа:
Вы должны присвоить возвращаемое значение объекту структуры в main
Внутри тела функция имеет дело с копией исходного объекта. Он не изменяет исходный объект, потому что он передается по значению.s1 = func(s1,x,y);
Другой подход заключается в передаче структуры по ссылке
void func( num &x, int a, int b) { x.n[0] = a+b; x.n[1] = a*b; }
В этом случае в main можно просто написать
func(s1,x,y);
Или вы можете использовать даже так называемый C-подход передачи по ссылке
void func( num *x, int a, int b) { x->n[0] = a+b; x->n[1] = a*b; }
И назовем это как
func( &s1, x, y );
Что касается этого утверждения
cout << func(s1,x,y).n[0] << "\n" << func(s1,x,y).n[1];
Затем вы получаете доступ к элементам данных двух временных объектов, возвращаемых двумя вызовами функции. После выполнения этой инструкции эти временные объекты будут удалены.
Похоже, что вы никогда не присваиваете возвращаемое значение
func()
. Ваша функция возвращает структуру, но вы никогда не назначаете ее. Чтобы исправить это, вы должны быть в состоянии просто сказать:s1 = func(s1,x,y);
это назначит измененную версию структуры переменной s1.В качестве альтернативы, вы можете переписать
func()
, чтобы принять указатель на структуру. Это позволит вам модифицировать структуру без необходимости возвращать ее:void func( num *x, int a, int b) { x->n[0] = a+b; x->n[1] = a*b; }
Тогда вы просто измените свой вызов на
func()
, чтобы сказать:func(&s1, x, y);
Вы не передаете свою структуру по ссылке, отсюда и результат. Попробуйте следующее:
void func(num &x, int a, int b) { x.n[0] = a+b; x.n[1] = a*b; }
Нет необходимости в том, чтобы функция возвращала что-либо, так как ваша структура передается по ссылке, и она будет изменена в любом случае. Пустота подошла бы лучше.
Это происходит потому, что вы передали структуру по значению, в то время как ваши намерения выглядят так, как будто вы хотите передать по ссылке. Проверьте эту ссылку: http://courses.washington.edu/css342/zander/css332/passby.html
num func( num &x, int a, int b)
Должен решить вашу проблему