Funkcja w C++ zwracająca dwie zmienne


(Derekdx) #1

Witam,

jaką strukturę ma mieć funkcja która zwracałaby 2 zmienne i jak te zmienne później wywołać w programie


(Mk Md) #2

W C++ nie ma takiej możliwości. O ile mi wiadomo można tkie funkcje tworzyć w LUA. Ale możesz przekazać obiekt przez referencje i w funkcji dokonać w nim odpowiednich zmian.


(Derekdx) #3

a za pomocą tablicy się nie da?


(Mk Md) #4

Nie bardzo rozumiem o co chodzi. Tablice są przekazywane do funkcji przez referencje. Ale raczej nie opłaca się robić tablicy, jeżeli masz tylko jeden element dodatkowy. No i zawsze możesz go zrobić argumentem domniemanym, i wtedy mógłbyś go używać tylko wtedy kiedy potrzebujesz.


(Martini M) #5

Witam,

To zależy co masz na myśli DerekDX. Postaram się to wyjaśnić. W c++ funkcja przez swoją nazwę może zwrócić tylko jedną wartość.

Np.

double suma (double a, double b)

{

  double c = a + b; //c jest na chwile zeby sprawdzic czy sie dobrze wykonala operacja

  return c;

  //zamiast 2 powyzszych linijek mozesz zrobic:

  //return a+b;

}


//wywolanie funkcji wyglada tak:


double wynik = suma (5.2, 1.4); //w zmiennej wynik bedzie wynik operacji wykonanych przez funkcje suma

Teraz jeżeli chcesz zwrócić 2 wartości to masz kilka możliwości. a) to o czym wspominał marcin_k - referencje; wyglądałoby to tak mniej więcej:

void sum_mul(double a, double b, double &suma, double &iloczyn)

{

  //zmienne a i b są zmiennymi wejściowymi, zmienne suma i iloczyn są wyjściowymi

  suma = a+b;

  iloczyn = a*b;

  //funkcja przez nazwe nic nie zwraca dlatego nie ma na koncu return

}


//wywolanie wyglada tak:

double s1 = 5.2;

double s2 = 3.0;

double sum=0, ilo=0;

//w tym miejscu przed wejsciem do funkcji s1 = 5.2, s2 = 3.0, sum = 0.0, ilo = 0.0

sum_mul (s1, s2, sum, ilo);

// w tym miejscu po wyjsciu z funkcji s1 = 5.2, s2 = 3.0, sum = 8.2, ilo = 15.6

b) struktura z 2 polami (jest to o tyle niebezpieczne ze w razie zmiany struktury wymagana będzie poprawka we wszystkich miejscach gdzie ona występuje.

//najpierw definiujemy strukture - ta nazywa sie dwa_pola

struct dwa_pola

{

  double a;

  double b;

};


//teraz funkcja ktora zwraca taka strukture

dwa_pola sum_mul_2(double s1, double s2)

{

  dwa_pola tmp;

  tmp.a = s1 + s2;

  tmp.b = s1 * s2;

  //zapis tmp.b oznacza ze odnosimy sie do konkretnego pola w danej strukturze, najpierw nazwa struktury a po kropce nazwa pola

 return tmp; //zwracamy cala strukture, kompilator juz zadba (najlepiej jak potrafi nie zawsze zgodnie z naszymi oczekiwaniami!!) zeby sie to zwrocilo

}


//i na koniec wywolanie funkcji

double x = 2.2;

double y = 2.0;

dwa_pola zwrot = sum_mul_2(x ,y);

//teraz w zmiennej zwrot mamy dostep do 2 pol

cout<
[/code]

c) napisać funkcję podobną do tej z podpunktu a) tylko wersję na wskaźnikach.

Proponuję zapoznać się takimi zagadnieniami jak konstruktor kopiujący, automatyczny operator przypisania, przekazywanie wartości przez referencję i wskaźnik.

Pozdrawiam i powodzenia.


(somekind) #6

Zapewne sensowne IDE poprawi to samo. Za to jest to rozwiązanie najbardziej eleganckie z punktu widzenia czytelności kodu.


(Martini M) #7

Jeżeli chodzi o zmianę nazwy pola w strukturze to a i owszem dobre IDE poprawi, ale jeżeli chodzi o dodanie pola (pól) to IDE nie będzie się domyślało i będzie wymagana poprawka (w sensie dopisania kodu) operującego na kolejnym polu (polach). O taką poprawkę mi chodziło.


(Sawyer47) #8

Jeśli chodzi o dwie wartości to może się nadać std::pair


([alex]) #9

Za pomocą std::pair to można mieć nawet trzy lub więcej wartości, oczywiście kosztem czytelności.

typedef pair,char*> trzy_wartosci;

typedef pair,pair > cztery_wartosci;