logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] Przepełnienie stosu w menu - jak uniknąć zapętlenia funkcji?

Bruum 28 Wrz 2010 08:00 975 9
REKLAMA
  • #1 8558953
    Bruum
    Poziom 23  
    Posty: 818
    Pomógł: 29
    Ocena: 54
    Witam! Krzaczy mi się menu po dłuższym używaniu. Podejrzewałem błędy w bibliotekach itd., ale w końcu myślę, że sam stworzyłem kłopot. Otóż okazuje się, że następuje przepełnienie stosu. Zlokalizowałem "w którym miejscu" mniej więcej to następuje i myślę, że wynika to z "zapętlenia"-funkcja wywołuje następną, a ta następna potrafi poprzednią. Czy trzeba to całkowicie przekonstruowywać, czy istnieje sposób na "czyszczenie" stosu z pozostałości po danej funkcji?
  • REKLAMA
  • #2 8558976
    zerpo
    Poziom 22  
    Posty: 463
    Pomógł: 50
    Ocena: 134
    Stos "czyści" się w pewnym sensie automatycznie, po wykonaniu funkcji ze stosu zdejmowane są adres powrotny i wartości kluczowych rejestrów (co uwalnia zajętą przez funkcję przestrzeń na stosie). Nie wiem na jak procesor piszesz program, ale zwykle do stosu jest dostęp, tzn. można przesunąć ręcznie wskaźnik góry stosu, ale obawiam się, że może to się zakończyć katastrofą.

    Może gdybyś wkleił ten program, to można byłoby coś doradzić, gdzie poprawić...
  • #3 8559034
    flapo213
    Poziom 21  
    Posty: 566
    Pomógł: 35
    Ocena: 10
    Witaj,

    a możesz podać więcej detali jaki kompilator jaka platforma sprzętowa.
  • REKLAMA
  • #4 8559057
    Bruum
    Poziom 23  
    Posty: 818
    Pomógł: 29
    Ocena: 54
    Chyba już załatwione, nie nyło takie ciężkie, dzięki za zainteresowanie.
  • Pomocny post
    #5 8559709
    flapo213
    Poziom 21  
    Posty: 566
    Pomógł: 35
    Ocena: 10
    O ile pamiętam istnieje możliwość w keilu ustawienia wierzchołka stosu. Spróbuj go poprostu zwiększyć, standardowo był ustawiany na 0x....200 zmień na przykład na 0x....1000.

    Moją odpowiedź oparłem o kompilator realview bo w uvisione możesz wybrać jeszcze 2 inne kompilatory keila oraz gcc.
  • #6 8559730
    Bruum
    Poziom 23  
    Posty: 818
    Pomógł: 29
    Ocena: 54
    Zwiększałem, ale to tylko odwlekało zgon. Zmiana sposobu sterowania przebiegiem programu jak na razie pomogła.
  • REKLAMA
  • #7 8560431
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Mógłbyś pokazać fragment programu ?
  • REKLAMA
  • #8 8560442
    Bruum
    Poziom 23  
    Posty: 818
    Pomógł: 29
    Ocena: 54
    No nie ma się czym chwalić. Chodzi Ci o ten stos killer czy o "dobry".
  • #9 8560763
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    o stos killera
  • #10 8561541
    Bruum
    Poziom 23  
    Posty: 818
    Pomógł: 29
    Ocena: 54
    Został uleczony, więc jest tylko wspomnieniem. Coś w stylu:
    
    funkcja1
    if
    else () funkcja2
    
    if()coś tam
    
    
    funkcja2
    
    if(..) funkcja1
    .
    .if()funkcja3
    

    Miewam dłuugie przerwy w tej zabawie niestety..

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem przepełnienia stosu w menu, który występuje po dłuższym użytkowaniu programu. Użytkownik zidentyfikował, że problem może wynikać z zapętlenia funkcji, gdzie jedna funkcja wywołuje drugą, co prowadzi do nadmiernego wykorzystania pamięci stosu. Odpowiedzi sugerują, że stos "czyści się" automatycznie po zakończeniu funkcji, ale ręczne przesuwanie wskaźnika stosu może być niebezpieczne. Użytkownik został również poinformowany o możliwości zwiększenia wierzchołka stosu w kompilatorze Keil, co może pomóc w uniknięciu problemu, chociaż ostatecznie zmiana sposobu sterowania programem przyniosła lepsze rezultaty. Użytkownik podzielił się fragmentem kodu, który ilustruje problem z zapętleniem.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA