Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 20 lut 2025, o 01:37


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 29 wrz 2016, o 17:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

Nierozumiem dlaczego na zmienną lokalną mówi się "automatyczna" przecież to programista ją tworzy a nie kompilator.

Kod:

int main(void)
 {
        [b] uint8_t tog=5 ;[/b]

       led();
       
 }

uint8_t led (void)
{
         
       [b] uint8_t tog=5 ;[/b]

}



na górze przykład

-więc skąd to określenie automatycznie zaczyna swój żywot wraz z z pojawieniem się w funkcji i automatycznie kończy ?

-w funkcji main taka zmienna lokalna (automatyczna) zostaje raz zdefiniowana
Kod:
uint8_t tog=5;

zostaje zapisana wartością 5 , i nigdy jej komórka nie zostanie wymazana bo funkcja main nigdy nie skończy swojego życia , zgadza się dobrze to zrozumiałem ?

-inaczej zaś jest gdy zmienna tog jest zdefiniowana w funkcji ,która kończy swoje życie wraz z funkcją wtedy 5 znika zmienna zostanie wymazana , znów zostanie stworzona wraz z wywołaniem funkcji z main dobrze rozumuje to ?

-str 127 z BB 10 linijka od góry, nasuwa coś innego dlaczego trzeba zawsze zainicjować jakąś wartością zmienną bo nie ma się pewności że będzie wyzerowana po zdefiniowaniu jej na nowo , czy to oznacza że zmienna tog i jej wartość nie zniknie są jakieś sytuacje , w których podpunkt nie sprawdza się:
Cytuj:
-inaczej zaś jest gdy zmienna tog jest zdefiniowana w funkcji ,która kończy swoje życie wraz z funkcją wtedy 5 znika zmienna zostanie wymazana , znów zostanie stworzona wraz z wywołaniem funkcji z main dobrze rozumuje to ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 wrz 2016, o 18:41 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27359
Lokalizacja: Szczecin
Pomógł: 1042

spider12 napisał(a):
Nierozumiem dlaczego na zmienną lokalną mówi się "automatyczna" przecież to programista ją tworzy a nie kompilator.

Nie obraź się ale od razu na początku piszesz bzdurki, .... to tak pół żartem pół serio .... bo ty na pewno nie tworzysz tej zmiennej ;) tylko właśnie kompilator generuje kod, który ją tworzy podczas startu funkcji i tworzy ją na stosie

spider12 napisał(a):
-więc skąd to określenie automatycznie zaczyna swój żywot wraz z z pojawieniem się w funkcji i automatycznie kończy ?

Stąd panie kochany, że skoro zmienna zostaje utworzona na stosie ... to gdy funkcja się skończy to zwalnia stos i to miejsce będzie wykorzystane przez inne funkcje a więc koniec - amba zjada twoją zmienną ;)

spider12 napisał(a):
-w funkcji main taka zmienna lokalna (automatyczna) zostaje raz zdefiniowana

No pewnie - a co widziałeś gdzieś program gdy ktoś wychodzi z funkcji main ??? w procku ??? ;) ja nie widziałem. W programach na PC tak - tam gdy program kończy swój żywot to właśnie wychodzi z funkcji main i wtedy też takie zmienne automatyczne stworzone w jej wnętrzu giną - czy to jest zrozumiałe ?

spider12 napisał(a):
zostaje zapisana wartością 5 , i nigdy jej komórka nie zostanie wymazana bo funkcja main nigdy nie skończy swojego życia , zgadza się dobrze to zrozumiałem ?

No więc dobrze rozumiesz ;)

Cytuj:
-inaczej zaś jest gdy zmienna tog jest zdefiniowana w funkcji ,która kończy swoje życie wraz z funkcją wtedy 5 znika zmienna zostanie wymazana , znów zostanie stworzona wraz z wywołaniem funkcji z main dobrze rozumuje to ?

No bardzo dobrze - to skąd te dziwne określenia na początku postu ? ;)

Cytuj:
-str 127 z BB 10 linijka od góry, nasuwa coś innego dlaczego trzeba zawsze zainicjować jakąś wartością zmienną bo nie ma się pewności że będzie wyzerowana po zdefiniowaniu jej na nowo , czy to oznacza że zmienna tog i jej wartość nie zniknie są jakieś sytuacje , w których podpunkt nie sprawdza się:

Zrozum proszę - stworzenie zmiennej automatycznej na stosie to tylko zarezerwowanie miejsca na nią w pamięci RAM na tym stosie. Skąd wiesz co przed wywołaniem funkcji było na tym stosie zapisane ? Przeważnie jakieś inne dane i wartości innych zmiennych automatycznych - więc pojawić się w tej komórce może cokolwiek - dlatego trzeba ją inicjować konkretną wartością i sam kompilator się o to dopomina warningami - nie zauważyłeś tego? Te zmienne automatyczne w przeciwieństwie do zmiennych globalnych NIE SĄ ZEROWANE ! zapamiętaj to. Zaś zmienne globalne - kompilator generuje kod który odpalany jest jeszcze przed funkcją main i ten kod zeruje dla ciebie wszystkie zmienne globalne żeby po restarcie nie pozostały tam jakieś ew śmieci ... no tak założyli twórcy języka C a ty musisz to po prostu przyjąć do wiadomości i pamiętać o tym ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 wrz 2016, o 20:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2012
Posty: 114
Pomógł: 2

OK Mirku Dziękuje. będę pytać i czytać. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO