• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak odebrać dwie zmienne z funkcji

Object Storage Arubacloud
0 głosów
1,122 wizyt
pytanie zadane 19 marca 2021 w C i C++ przez persikk Obywatel (1,140 p.)
int proba()
{
int x = 1;
int y = 2

return x,y;

}

x,y=proba(); //to jest błędne

Witam, jak mam odebrać od funkcji dwie zmienne ?

Funkcja zwraca mi dwie wrtości i nie mam kompletnie pojęcia jak mam je odebrać bez zmiennych globalnych.

2 odpowiedzi

+2 głosów
odpowiedź 19 marca 2021 przez tkz Nałogowiec (42,000 p.)
wybrane 19 marca 2021 przez persikk
 
Najlepsza
#include <utility>

std::pair<int, int> getCoordinates()
{
    int x{4};
    int y{3};
    return {x, y};
}

int main()
{
    auto [x,y] = getCoordinates();
    std::pair<int, int> coordinates = getCoordinates();
    auto oordinates2 = getCoordinates();
    return 0;
}

 

komentarz 19 marca 2021 przez persikk Obywatel (1,140 p.)

Nie ma jakiego innego sposobu żeby to rozdzielić od razu na dwie zmienne ?

Bo w moim przypadku funkcja dostaje argumenty żeby przeliczyć i zwrócić dwie całkiem inne wartości. 

 

int proba(int a, int b)
{
int x = a-b;
int y = a+b;

return x,y;

}

Gdyby wejściowe parametry zmieniało to zrobiłbym to przez referencję ale tutaj niestety tak nie mogę. 

 

Mam napiasć algorytm który zwróci właśnie dwie wartości które potem wykorzystam w innej funkcji.

1
komentarz 19 marca 2021 przez tkz Nałogowiec (42,000 p.)

Spojrzałeś na kod, który wkleiłem? Podałem trzy sposoby jak odebrać te zmienne. Pierwszy przykład odpowiada na Twoje pierwsze pytanie.

#include <iostream>
#include <utility>

std::pair<int, int> getCoordinates()
{
    int x{4};
    int y{3};
    return {x, y};
}

int main()
{
    auto [x,y] = getCoordinates();
    std::cout<<x<<' '<<y;
}

https://en.cppreference.com/w/cpp/language/structured_binding

https://en.cppreference.com/w/cpp/utility/pair

komentarz 19 marca 2021 przez persikk Obywatel (1,140 p.)
Dobra posiedziałem chwilę i działa, wielkie dzięki, nie chciałem zmieniać typu funkcji na te pair nie rozumiem tego do końca jeszcze ale wydaje się naprawdę spoko opcją.

Dopiero się uczę i to dla mnie kompletna nowość
komentarz 19 marca 2021 przez tkz Nałogowiec (42,000 p.)
Spójrz na linki, które wkleiłem masz przykłady użycia. Plus praktyka, bez tego będzie trudno ogarnąć.
+1 głos
odpowiedź 19 marca 2021 przez Great Stary wyjadacz (12,360 p.)

Możesz zwrócić std::pair, std::tuple, std::vector, albo jakąś własną strukturę. Każde z nich może zawierać w sobie co najmniej 2 wartości. Najsensowniejsza odpowiedź już padła. Nie musisz rozdzielać zmiennych w parze:

#include <iostream>
#include <utility>

auto addsubstract(int x, int y) {
    return std::pair(x - y, x + y);
}

void show(int a, int b) {
    std::cout << a << " " << b << '\n';
}

int main() {
    std::apply(show, addsubstract(5, 2));
}
komentarz 19 marca 2021 przez persikk Obywatel (1,140 p.)
edycja 19 marca 2021 przez persikk
Napisałeś że każdy może zwracać co najmniej 2 wartości, jak pair przebudować żeby zwracał 3?

Bo pair<int,int,int> pokazuje mi że jest błędne, a kiedyś może mi się to przydać jak będę musiał zwrócić kilka na raz

 

Oraz czy bilbioteka utility jest potrzebna do samego pair ?

Bo kompiluje mi się bez, czyli teorytycznie nie.
komentarz 19 marca 2021 przez persikk Obywatel (1,140 p.)
Kombinowałem też z

return {x,y,z}

I to do

auto[x,y,z] = ...

Ale to też nie przeszło
1
komentarz 19 marca 2021 przez Great Stary wyjadacz (12,360 p.)

Niestety para z definicji może przechowywać 2 elementy o różnych typach, lub tych samych typach. Dobór pojemnika będzie różny w zależności od przeznaczenia używania tych zmiennych. Jeżeli nie masz za dużo doświadczenia z C++ zacznij od nauki tablic (albo vectorów), podstaw programowania obiektowego. Będziesz miał większy pogląd jak zwrócić to co chcesz i jak tego użyć, lub jak zapytać żeby nie wejść w problem XY.

Klasa std::pair znajduje się w nagłówku <utility> (patrz dokumentacja) to znaczy, że powinniśmy go dołączyć. Jeżeli Twój kompilator nie wymaga żebyś go dołączył to nie znaczy, że inna wersja, lub inny kompilator nie będzie tego potrzebował. Może się to okazać nieprzyjemne gdy wysyłasz kod do wykładowcy, a on sprawdzi innym kompilatorem i okaże się, że nie możliwe skompilować kodu ;)

1
komentarz 19 marca 2021 przez tkz Nałogowiec (42,000 p.)

@persikk,

Napisałeś że każdy może zwracać co najmniej 2 wartości, jak pair przebudować żeby zwracał 3?

#include <iostream>
#include <utility>
#include <tuple>

std::tuple<int, int, int> getCoordinates()
{
    int x{1};
    int y{2};
    int z{3};
    return {x, y, z};
}

int main()
{
    auto [x, y, z] = getCoordinates();
    std::cout<<x<<' '<<y<<' '<<z;
    return 0;
}

https://en.cppreference.com/w/cpp/utility/tuple

Tablice w tym przypadku zdałyby egzamin, ale przy zwracaniu różnych typów, już nie. Dlatego masz tupla, czy pair. 

Podobne pytania

0 głosów
2 odpowiedzi 394 wizyt
pytanie zadane 13 sierpnia 2016 w Sprzęt komputerowy przez Karwolo Użytkownik (500 p.)
+1 głos
1 odpowiedź 161 wizyt
pytanie zadane 29 stycznia 2022 w Java przez Bakkit Dyskutant (7,600 p.)
0 głosów
1 odpowiedź 123 wizyt
pytanie zadane 23 maja 2019 w C i C++ przez Curiosis Użytkownik (540 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...