Helyi változók élettartama

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
sto
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2023. augusztus 21. hétfő, 18:34

Helyi változók élettartama

Hozzászólás Szerző: sto »

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?
Avatar
pipi
SzínkódFestő
Hozzászólások: 80
Csatlakozott: 2008. július 6. vasárnap, 6:00

Re: Helyi változók élettartama

Hozzászólás Szerző: pipi »

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ő
sto
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2023. augusztus 21. hétfő, 18:34

Re: Helyi változók élettartama

Hozzászólás Szerző: sto »

Ez nem csak a statikus változókra igaz?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Helyi változók élettartama

Hozzászólás Szerző: Robert »

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:

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
}
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....
http://www.tavir.hu - a gazda :)
Avatar
aaszabo
Tranzisztorgyógyász
Hozzászólások: 179
Csatlakozott: 2012. január 22. vasárnap, 7:00

Re: Helyi változók élettartama

Hozzászólás Szerző: aaszabo »

A C azért meg tudja kavarni a dolgokat.
Ha a loop-on belüli helyi változód átadod egy függvényben referencia szerint (nem érték szerint adsz át paramétert), akkor egy külső függvény felülírhatja a belső változód értékét.

De egyébként úgy működik, ahogy Róbert írta a medencékkel.
Annyi megjegyzés még, hogy belső medencében létrehozott változó a külsőben nem látszik.
Ez a lenti program hibás, mert a végén lévő i+=j utasításban a j változó már nem létezik. Az a változó csak a for cikluson belül létezik.
loop()
{
int i=0;
for(int j=0; j<10; j++)
{
i+=j;
}
i+=j;
}
Válasz küldése