Iterowanie funkcji, która przyjmuje kilka argumentów, a powinna zwracać jeden

0

Mam funkcję:

uint64_t next(uint64_t a, uint64_t b,  uint64_t c)
{
    a = a + b;
    b = b*b;
    c = c+a+b;
    uint64_t result = a*b*c;
    return result;
}

Chcę ją iterować w main(), ale najlepiej bez zwracania za każdym razem 3 zmiennych + result i przypisywania ich na nowo (chyba musiałbym zwrócić wtedy jakąś tablicę). Najlepiej gdyby dało się to zrobić poprzez wywołanie next() albo next(a,b,c).

Czy można to jakoś (sensownie i zgrabnie) zrobić bez definiowania globalnych zmiennych, czy powinienem zwracać tam faktycznie tablicę 3 zmiennych a później 3 razy je przypisywać jakoś tak:


int main()
{
tablica = next(a,b,c);
a = tablica[0];
b = tablica[1];
c = tablica[2];
}
 

Chcę, żeby to było jak najszybsze. Jeżeli zrobię globalne zmienne, to mogę wywołać next(a,b,c) tylko raz. A, jeżeli nie zrobię, to muszę wywoływać to jak powyżej.

1
#include <iostream>
using namespace std;

struct NextValues { uint64_t a,b,c,r; };

NextValues next(uint64_t a, uint64_t b,  uint64_t c)
{
    a = a + b;
    b = b*b;
    c = c+a+b;
    return NextValues { a, b, c, a*b*c };
}

int main()
{
  NextValues nv=next(1,2,3);
  cout<<nv.a<<endl;
  cout<<nv.b<<endl;
  cout<<nv.c<<endl;
  cout<<nv.r<<endl;
  return 0;
}

lub:

#include <iostream>
using namespace std;

uint64_t next(uint64_t &a, uint64_t &b,  uint64_t &c)
{
    a = a + b;
    b = b*b;
    c = c+a+b;
    return a*b*c;
}

int main()
{
  uint64_t a=1,b=2,c=3;
  cout<<next(a,b,c)<<endl;
  cout<<a<<endl;
  cout<<b<<endl;
  cout<<c<<endl;
  return 0;
}
0

No właśnie, nie dotarłem jeszcze do tego co to jest struct, ale gdzieś to zauważyłem i podejrzewałem, że można tego podobnie używać. Wieczorem na to spojrzę jak będę miał więcej czasu. — Tomasz_D 47 minut temu

Tzw "praktyk" ? Podręczniki i dokumentacja to zło

1

można jeszcze tak ale wszystko zależy od kontekstu.

#include <iostream>
#include <tuple>
using namespace std;


tuple<uint64_t,uint64_t,uint64_t> next(uint64_t a, uint64_t b,  uint64_t c)
{
    a = a + b;
    b = b*b;
    c = c+a+b;
    return make_tuple(a,b,c);
}

int main()
{
  auto nv=next(1,2,3);
  cout<<get<0>(nv)<<endl;
  cout<<get<1>(nv)<<endl;
  cout<<get<2>(nv)<<endl;
  auto [x,y,z] = next(1,2,3); // Alternatywnie std:tie
  cout<<x<<endl;
  cout<<y<<endl;
  cout<<z<<endl;
  return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1