Функция, возвращающая неожиданные значения структуры


Я совершенно новичок в структурах и пользовательских типах данных, и я пытался создать функцию, которая возвращает структуру:

Проблема освещается комментарием:

#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 2

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) 

Должен решить вашу проблему