Witam,
jaką strukturę ma mieć funkcja która zwracałaby 2 zmienne i jak te zmienne później wywołać w programie
Witam,
jaką strukturę ma mieć funkcja która zwracałaby 2 zmienne i jak te zmienne później wywołać w programie
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.
a za pomocą tablicy się nie da?
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.
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.
Zapewne sensowne IDE poprawi to samo. Za to jest to rozwiązanie najbardziej eleganckie z punktu widzenia czytelności kodu.
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.
Jeśli chodzi o dwie wartości to może się nadać std::pair
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;