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

Jak stworzyć stos funkcji w C/C++

Object Storage Arubacloud
+1 głos
1,155 wizyt
pytanie zadane 25 sierpnia 2017 w C i C++ przez Adam Olesiak Gaduła (3,290 p.)
void a()
{
	b();
}

void b()
{

}

int main()
{
	a();

    return 0;
}

W tym prostym programie, jak dobrze rozumiem zachodzi coś takiego:

1) start programu, dodanie funkcji main do stosu

2) wywołanie a() -> dodanie a do stosu

3) wywołanie b() z wewnątrz a -> dodanie b do stosu

4) zakończenie b -> usunięcie b ze stosu, kontynuujemy najwyższą funkcję na stosie czyli a

5) zakończenie a -> usunięcie a ze stosu, kontynuujemy najwyższą funkcję na stosie czyli main

6) zakończenie main -> usunięcie main ze stosu. Jako że stos jest pusty, kończymy program.

 

Moje pytanie: W jaki sposób można zaimplementować to tak, aby w momencie wykonywania punktu 5, po powrocie do funkcji main nie wywoływała się ona od początku, tylko od momentu w którym zakończyła, kiedy program z niej wychodził?

Przykładowe rozwiązanie, choć nie wiem jak je wykonać:

W momencie wyjścia z funkcji, zastąp funkcję do której wchodzisz jakimś GOTO: statement, potem trzymaj w stosie wskaźniki do funkcji & wskaźniki do tych GOTO.

Nie wiem czy tak można, w C++ jestem dość nowy.

 

Głównie pytam z ciekawości: jak to działa i czy da się takie coś zaimplementować samemu w C/C++, np aby przedefiniować przez co rozumiem zakończenie funkcji

1 odpowiedź

0 głosów
odpowiedź 25 sierpnia 2017 przez TenGumis Gaduła (3,440 p.)

"po powrocie do funkcji main nie wywoływała się ona od początku, tylko od momentu w którym zakończyła"

Ale tak się właśnie dzieje.

main()
{
   cout<<"a";
   a();
   cout<<"a";
}

wyjście to będzie "aa" a nie "aaa".

komentarz 25 sierpnia 2017 przez Adam Olesiak Gaduła (3,290 p.)
Wiem, chciałbym taki mechanizm stworzyć samemu/jestem ciekaw jak to jest zrobionę, bo sam nie mogę wymyślić działającego rozwiązania z moimi umiejętnościami w C++

Btw jakby main zaczynał od zera, to byłaby nieskończona pętla ;)
komentarz 25 sierpnia 2017 przez TenGumis Gaduła (3,440 p.)
Okej, teraz rozumiem o co chodzi. Warto się tutaj zainteresować tym jak realizowane jest wywołanie funkcji w assemblerze. Nie wiem czy jest jakaś prosta metoda na zrobienie tego bez assemblerowych wstawek bo to tak naprawdę opiera się na jakiś niskopoziomowych operacjach.
komentarz 25 sierpnia 2017 przez unknown Nałogowiec (39,560 p.)

Wiem, chciałbym taki mechanizm stworzyć samemu/jestem ciekaw jak to jest zrobionę,

W chwili wywołania funkcji na stos jest wrzucany adres powrotu (czyli adres następnej instrukcji). Potem w chwili zakończenia działania funkcji ten adres jest wykorzystywany.

komentarz 25 sierpnia 2017 przez Adam Olesiak Gaduła (3,290 p.)
Czy da się jakoś manipulować adresem instrukcji? np Trzymać go jako zmienną w programie/idź_do_instrukcji_o_adresie(adres)

 Troszkę nie ogarniam, mógłbyś może podać co wpisać w googla żeby się więcej dowiedzieć na ten temat?
1
komentarz 25 sierpnia 2017 przez unknown Nałogowiec (39,560 p.)

Czy da się jakoś manipulować adresem instrukcji?

Tak, tylko po co? Zły adres spowoduje wywalenie się programu.

Trzymać go jako zmienną w programie/idź_do_instrukcji_o_adresie(adres)

Można wszystko, ale trzeba znać assembly.

Troszkę nie ogarniam, mógłbyś może podać co wpisać w googla żeby się więcej dowiedzieć na ten temat?

Poucz się trochę assembly a temat sam się rozjaśni.

komentarz 26 sierpnia 2017 przez Buby Pasjonat (19,590 p.)

Ja jeszcze tylko podrzucę coś, co może się przydać - tutaj troszkę na temat konwencji wywołania funkcji w C++.

Podobne pytania

0 głosów
0 odpowiedzi 318 wizyt
pytanie zadane 6 kwietnia 2022 w C i C++ przez trampek Nowicjusz (120 p.)
0 głosów
1 odpowiedź 281 wizyt
pytanie zadane 17 czerwca 2019 w C i C++ przez Giero112 Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 348 wizyt
pytanie zadane 24 maja 2019 w C i C++ przez Kaper99 Użytkownik (660 p.)

92,555 zapytań

141,403 odpowiedzi

319,559 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!

...