Sziasztok! Nemrégiben egy projektemnél belefutottam egy olyan helyzetbe ahol sajnos elbizonytalanodtam hogy jól értem-e a változók működését. A problémám a következő:
void loop() {
int a = 0;
do {
a++;
search();
} while (a < 10);
}
void search() {
}
A loop ciklusban létrehoztam az "a" helyi változót, ami tudtommal csak a saját függvényében él, azon kívül nem elérhető, illetve a memóriában is felszabadul az általa lefoglalt terület. Namost mivel a program a változó deklarálása után azonnal egy while ciklusba lép, már nem fut le újra a változó értékadása, viszont közben egy másik függvényt is meghívok. Ekkor elvileg a változóm megsemmisül. Vagy mégse? Az search() függvény lefutása után ott folytatódik a while ciklusom ahol abbamaradt, de vajon megőrzi-e ilyenkor "a" változó az értékét? A gyakorlat azt mutatja hogy igen de nem értem miért. Én ezt azzal magyaráztam magamnak hogy a memória területen megmarad ugyan a változó értéke, de ha esetleg egy másik függvényben több helyi változót használok, az felül írhatja az eredeti "a" változó értékét. Tehát a memória terület felszabadul és írhatóvá válik, de nem feltétlenül íródik rá valami. Vagy valamit az alapoknál félre értelmezek?
Helyi változók élettartama
- pipi
- SzínkódFestő
- Hozzászólások: 80
- Csatlakozott: 2008. július 6. vasárnap, 6:00
- Tartózkodási hely: Budapest XIX.
- Kapcsolat:
Re: Helyi változók élettartama
A függvényen belül deklarált változó ugyanazon a függvényen belül a deklaráció utántól kezdődően bárhol megvan, nem veszik el, bármit hívsz, megmarad az értéke, persze a "bármiben" nem elérhető
Re: Helyi változók élettartama
Ez nem csak a statikus változókra igaz?
- Robert
- Elektronbűvölő
- Hozzászólások: 10185
- Csatlakozott: 2005. december 9. péntek, 7:00
- Tartózkodási hely: Budapest
- Kapcsolat:
Re: Helyi változók élettartama
Tipp, ahogy én szoktam megközelíteni és magyarázni:
A változó abban a "mederben" él, létezik, ami a { és } közt van. Ezen belül újabb {} hozhatok létre - itt az egy "belső medence", onnan is elérhető. Akkor tűnik el, ha a fő ] is bezárul.
Az hogy belül hívok egy alprogramot/függvényt, bármit - azzal nem zártam be az előző programot, azaz nem jutottam el a záró }-ig.
Tipp:
Itt a legbelső search() önmagát hívja meg, és a belül lefoglalt "b" integer, minden egyes meghíváskor lefoglal 2-2 byte-t! Végül a SRAM fogy el és memóriahiba, regiszterfelülírás lesz...
Elvileg belül a freemem() függvénnyel soros vonalra is kiírható. hogy a szabad memória hogyan alakul belül....
A változó abban a "mederben" él, létezik, ami a { és } közt van. Ezen belül újabb {} hozhatok létre - itt az egy "belső medence", onnan is elérhető. Akkor tűnik el, ha a fő ] is bezárul.
Az hogy belül hívok egy alprogramot/függvényt, bármit - azzal nem zártam be az előző programot, azaz nem jutottam el a záró }-ig.
Tipp:
Kód: Egész kijelölése
void loop() {
int a = 0;
do {
a++;
search();
}
while (a < 10);
}
void search()
{ int b = 1;
search (); / saját magába farkába harapó gömböc
}
Elvileg belül a freemem() függvénnyel soros vonalra is kiírható. hogy a szabad memória hogyan alakul belül....
http://www.tavir.hu - a gazda 
