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

Zmienna reagująca na zmianę dwóch pozostałych

VPS Starter Arubacloud
+1 głos
293 wizyt
pytanie zadane 30 lipca 2018 w C i C++ przez Kurczak Użytkownik (940 p.)
Cześć,
Pamiętam, że kiedyś, programując w C/C++ natrafiłem na sposób deklarowania zmiennej, dzięki któremu reagowała ona na zmiany dwóch pozostałych. Postaram się wyjaśnić lepiej przykładem:
Deklarowałem dwie zmienne np.
int x=1; int y=2;
Deklarowałem trzecią zmienną
int z=x+y;
Wypisywałem "z" i wychodziło "z=3"
Później mogłem wykonać dowolne operacje na "x" i "y" np. x++, y++, a przy wypisywaniu zmiennej "z", "aktualizowała" się ona sama, bez mojej ingerencji i przy wypisywaniu wychodziło "z=5". Kod wyglądał mniej więcej tak:
int x=1, y=2;
int z=x+y;
cout<<z<<endl; //z=3
x++; y++;
cout<<z<<endl; //z=5
Wiem, że mój zapis jest niepoprawny, i zmienna "z" nie będzie reagowała na zmiany "x" i "y", dopóki samodzielnie tego nie zrobię, ale pamiętam, że działając na wskaźnikach/referencjach udało mi się kiedyś uzyskać taki efekt. Mam nadzieję, że pamięć mnie nie myli zanadto i pomożecie mi w znalezieniu rozwiązania :)
komentarz 30 lipca 2018 przez Hiskiel Pasjonat (22,830 p.)
W sumie to teraz mindfucka dostałem, bo nic mi nie wiadomo, żeby wskaźnik mógł wskazywać na dwa adresy w pamięci, chyba, że jakiś offset czy coś. Swoją drogą ciekawy wątek.

5 odpowiedzi

+2 głosów
odpowiedź 30 lipca 2018 przez mokrowski Mędrzec (155,460 p.)
Oprócz proponowanych rozwiązań, zerknij jeszcze do wzorca projektowego Observer. Na gołych wskaźnikach czy referencjach nie uzyskasz takiego efektu.
+1 głos
odpowiedź 30 lipca 2018 przez monika90 Pasjonat (22,940 p.)
edycja 30 lipca 2018 przez monika90

Nie da się tak w C++ "działając na wskaźnikach/referencjach", choć można sobie zrobić klasę, której obiekty wywołują podaną funkcję przy dostępie, np.:

#include <iostream>

template<class Func>
struct Ref
{
    Func f;
    Ref(Func f) : f(f) { }
    operator auto () const { return f(); }
};

int main()
{
    int x = 1;
    int y = 2;
    Ref z{[&]{ return x + y; }};
    std::cout << z << '\n';
    ++x;
    ++y;
    std::cout << z << '\n';
}

Ale nie róbcie tak jeśli nie rozumiecie jak to działa.

Ewentualnie można by użyć tu expression templates, tylko po co?

komentarz 30 lipca 2018 przez mokrowski Mędrzec (155,460 p.)
Tylko jak zerwie referencję to będzie "jazda" :-/
komentarz 30 lipca 2018 przez monika90 Pasjonat (22,940 p.)
dopóki x i y istnieją można używać z
0 głosów
odpowiedź 30 lipca 2018 przez nikodemCuprys Początkujący (340 p.)
Spróbuj zapętlić aktualizowanie się zmiennej z np.

Int xNew,yNew;

xNew++;yNew++;

If(x!=xNew or y!=yNew)

{

x=xNew;

y=yNew;

z=x+y

}

ciut<<z<<endl;
0 głosów
odpowiedź 30 lipca 2018 przez Kurczak Użytkownik (940 p.)
To był o wiele prostszy zapis. Bez żadnych funkcji, tylko deklaracje zmiennych, być może poprzedzone jakimś słowem kluczowym. Dokładnie nie pamiętam, pamiętam jedynie, że byłem w szoku, że zmienna z reagowała na zmiany a i b.
–1 głos
odpowiedź 30 lipca 2018 przez profesorek96 Szeryf (91,420 p.)

Bardzo ciekawy wątek. Ja próbowałem dostać się do tego za pomocą wskaźników na funkcje niestety marny skutek. Może jestem bliżej rozwiązania:

#include <iostream>
#include <cstdio>
using namespace std;
volatile int a=5;
volatile int b=6;
int dodawanie();

typedef int( * dzialanieT )();

int oblicz(dzialanieT pDzialanie );

int main()
{
	auto z=oblicz(dodawanie );
	printf( "Wynik dodawania = %d\n", z);
	a=12;
	b++;
	cout<<a<<" "<<b<<endl;
	z=oblicz(dodawanie );
	printf( "Wynik dodawania = %d\n", z);
	
    return 0;
}
int dodawanie()
{
	return a+b;
}
int oblicz( dzialanieT pDzialanie )
{
    return pDzialanie();
}

 

Podobne pytania

0 głosów
1 odpowiedź 196 wizyt
pytanie zadane 10 lipca 2015 w C i C++ przez Mkanobi Nowicjusz (200 p.)
0 głosów
3 odpowiedzi 131 wizyt
pytanie zadane 8 maja 2020 w Java przez jasper93 Obywatel (1,310 p.)
0 głosów
1 odpowiedź 162 wizyt

92,453 zapytań

141,262 odpowiedzi

319,087 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...