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

c++ przekazywanie zmiennych poprzez argumenty do funkcji

Object Storage Arubacloud
0 głosów
1,010 wizyt
pytanie zadane 26 sierpnia 2018 w C i C++ przez Hinzeq Użytkownik (860 p.)

Cześć,

problem polega na tym, że w momencie gdy przekazuję zmienne do funkcji, to wszystko jest w porządku. Wewnątrz funkcji też wszystko jest ok. Natomiast gdy funkcja zwraca wartości do funkcji main, to wtedy pojawia się problem (chodzi o boss,dmg w main || i t,z w funkcji), wartości są zupełnie inne. Niestety rozwiązania w internecie nie znalazłem. 

Wiem, że nie powinienem prosić o gotowe rozwiązanie, ale nie mam pojęcia co jest nie tak.

int f_poziom(int x, int y, int z){
    switch(x){
    case '1':
        y=750;
        z=9;
        break;
    case '2':
        y=1200;
        z=12;
        break;
    case '3':
        y=1750;
        z=15;
        break;
    default:
        cout<<"\nZly numer. Zamykam gre!";
        exit(0);
    }
    cout<<"boss: "<<y<<endl; // sprawdzenie poprawnosci
    cout<<"dmg: "<<z<<endl;
    return y, z;
}

int main()
{
    int poziom,boss,dmg;
    f_menu();
    poziom=getch();
    //system("cls");
    f_poziom(poziom,boss,dmg);
    cout<<"boss2: "<<boss<<endl; // 7012244     <---    i w tej zmiennej pojawiaja sie absurdalne wartosci
    cout<<"dmg2: "<<dmg<<endl;   // 4310032             -|-
    return 0;

Pozdrawiam,
Hinzeq.

1 odpowiedź

+3 głosów
odpowiedź 26 sierpnia 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)
edycja 26 sierpnia 2018 przez Eryk Andrzejewski
 
Najlepsza

Chyba trochę nie bardzo rozumiesz jak działa wartość zwracana funkcji.

Każda funkcja może przyjąć kilka argumentów, natomiast zwraca tylko jedną wartość (choć istnieje możliwość użycia czegoś w rodzaju std::pair lub std::tuple, by pod postacią jednego obiektu trzymać dwa lub więcej).

To, że zastosujesz instrukcję:

return y, z;

nie oznacza, że wartości argumentów odpowiadającym parametrom y i z ulegną zmianie.

Return działa na takiej zasadzie - pozwolę sobie zademonstrować przykład przy pomocy kodu.

int add(int a, int b)
{
    return a + b;
}

int main()
{
    int x, y;
    std::cin >> x >> y;
    int result = add(x, y);
    std::cout << result;
}

W funkcji main wywołujemy zdefiniowaną wcześniej funkcję add. Wartość, która zostanie zwrócona przez funkcję (jak wspomniałem wcześniej, tylko jedna wartość) zostanie wstawiona w miejsce wywołania tej funkcji. Czyli jeżeli mamy taki kod:

int result = add(3, 5);

to wiedząc, że funkcja add zwróci 8, możemy wywołanie tej funkcji zastąpić (w głowie, niekoniecznie w kodzie) jej wynikiem:

int result = 8;

W Twoim przypadku wygodniejsza mogłaby być bezpośrednia zmiana wartości argumentów przekazywanych do funkcji (boss, dmg i tak dalej). Domyślnie, funkcja nie pracuje na oryginalnych zmiennych, lecz na ich kopiach - po zakończeniu wywołania tej funkcji kopie te "są niszczone" (znajdują się na stosie). Jeżeli chciałbyś pracować na oryginałach, powinieneś skorzystać ze wskaźników lub referencji - wybór zależy od Ciebie, chociaż użycie referencji będzie chyba nieco łatwiejsze. Wystarczy w nagłówku funkcji, po typie parametru dodać znak ampersand (&).

#include <iostream>

void func(int& value)
{
    value += 10;
}

int main()
{
    int number = 5;

    for (unsigned i = 0; i < 3; ++i)
    {
        std::cout << number;
        func(number);
    }
}

W każdym razie, stosując referencje warto zauważyć, że jako argument takiej funkcji nie możesz przekazać rwartości, czyli na przykład zwykłej liczby.

//Tu wstaw: definicja funkcji func z poprzedniego przykładu

func(5); //Takie coś nie przejdzie

P.S.

Troszkę się rozpisałem, mam nadzieję, że dość późna pora nie odbiła się negatywnie na sensie i poprawności wypowiedzi. Pozdrawiam. laugh

komentarz 26 sierpnia 2018 przez Hinzeq Użytkownik (860 p.)
Ok, że funkcja może zwrócić 1 wartość (poza tą dodatkową możliwością którą opisałeś), tego nie wiedziałem.
W takim razie czas na przebudowę.

Dzięki za pomoc :)
komentarz 26 sierpnia 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Dopisałem jeszcze trochę, proszę, doczytaj. laugh

Podobne pytania

0 głosów
2 odpowiedzi 547 wizyt
0 głosów
1 odpowiedź 238 wizyt
pytanie zadane 1 grudnia 2018 w C i C++ przez Michał_Warmuz Mądrala (5,830 p.)
0 głosów
1 odpowiedź 147 wizyt
pytanie zadane 14 marca 2019 w C i C++ przez szynszyl97 Początkujący (410 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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!

...