Variables ve funkcích
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Re: Variables ve funkcích
Ja to neprekladal, ale nerad bych naznacoval, ze nedeklarovane promenne si prekladac nejak vycuca z prstu, takze kdyz nadeklaruju PromennaSPriserneDlouhymJmenem a pak pouziju PromennaSRprSiserneDlouhym jmenem, tak ze si ji prekladac proste nejak domysli a prede mnou ten preklep zataji ... (asi mi tam taky nekde nejaky strednik chybi)
Re: Variables ve funkcích
Moc hezky vysvetlene.
Re: Variables ve funkcích
Myslím, že pro nejcelistvější obrázek je dobré googlit fráze "lexikální uzávěr" a "prostředí vzniku". Pak už nebudeš nikdy tápat, proč má co jakou hodnotu
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Variables ve funkcích
Aha,
takže pokud budu programovat dle standardních pravidel, tak se mi to nemůže stát.
Tedy mne by nikdy nenapadlo používat stejnou proměnnou v "globálu" a ve funkci.
Ve funkcích je používám, nejčastěji "chybaXY, stavXY, cyklus, x, y, z", a tyto nikdy nepoužívám v globálu.
takže pokud budu programovat dle standardních pravidel, tak se mi to nemůže stát.
Tedy mne by nikdy nenapadlo používat stejnou proměnnou v "globálu" a ve funkci.
Ve funkcích je používám, nejčastěji "chybaXY, stavXY, cyklus, x, y, z", a tyto nikdy nepoužívám v globálu.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Variables ve funkcích
Jak muj priklad ukazuje, tak k prekryvani dochazi nejen mezi globalem a funkci, ale i mezi vnorenymi bloky ve funkci.
A naopak samostatne funkce se navzajem neprekryvaji a nesdileji.
Kdyz se jmena neopakuji, je to jednoduche, kdyz zacne mit program mnoho radku a funkci a podobne, je nesikovne vymyslet nova jmena pro kazdy cyklus, ktery se kde vyskytne.
A pri refaktorovani se z casti kodu stavaji funkce a z funkci casti kodu a kdyz je to dobre psane, tak neni problem
A naopak samostatne funkce se navzajem neprekryvaji a nesdileji.
Kdyz se jmena neopakuji, je to jednoduche, kdyz zacne mit program mnoho radku a funkci a podobne, je nesikovne vymyslet nova jmena pro kazdy cyklus, ktery se kde vyskytne.
A pri refaktorovani se z casti kodu stavaji funkce a z funkci casti kodu a kdyz je to dobre psane, tak neni problem
Kód: Vybrat vše
for (int i=0;i<10;i++) {do_this();};
for (int i=0;i<10;i++) {do_that();};
for (int i=0;i<10;i++) {do_something_else();};
// tato tri i jsou naprosto nezavisla a ruzna
Re: Variables ve funkcích
Nenapadá mě případ, kdy by se lokální proměnná měla jmenovat stejně jako globální, ale určitě se to někomu někdy může hodit. Lze mít globální proměnou o stejném názvu jako lokální proměnnou. V rámci funkce ( jakéhokoliv scope, takže i cykly jak píše gilhad ) je pak globální proměnná překryta (zastíněna) proměnnou lokální. Rozlišit globální a lokální proměnou v rámci scope, kde je lokální proměnná defionována, lze pomocí čtyřtečky.
Kód: Vybrat vše
int a = 1; // tato proměnná je globální
void setup() {
Serial.begin(9600);
}
void loop() {
int a = 2; // tato proměnná je lokální a překryje globální proměnnou
Serial.println(a); // vypíše 2 - lokální proměnná
Serial.println(::a); // vypíše 1 - globální proměnná
}
Re: Variables ve funkcích
V podstate kdykoli funkce dela interne s necim podobnym, jako program globalne
Kód: Vybrat vše
int led=13;
int pasek[]={7,8,9,10,11};
setup(){
pinMode(led,OUTPUT);
for (int i=0;i<5;i++) pinMode((pasek[i],OUTPUT);
digitalWrite(led,LOW);
}
void blikni(int led) {
digitalWrite(led,LOW);
delay(100);
digitalWrite(led,HIGH);
delay(100);
digitalWrite(led,LOW);
}
void loop(){
blikni(led);
for (int i=0;i<5;i++) blikni(pasek[i]);
}
"
node_id:123;play:1;led:0;
node_id:124;play:0;led:0;
node_id:125;play:17;led:1;
node_id:126;play:0;led:1;
"
pak dava smysl, aby funkce, co to dekoduje, pouzivala promenne node_id,play,led ackoli stejne nazvane promenne mas globalni.
To same pri prohledavani databazi ruznych typu, kde jsou nazvy polozek dane jednotne zvenku a nektere se shoduji s tvymi globalnimi.
Pokud ma program par radku (nebo par stovek radku), tak se to da jeste zaonacit tak, ze globalni nejak prejmenujes a lokalni jinak, ale jakmile to zacne byt vetsi system, s knihovnama a podobnyma legracema, tak by funkce stejne nemely pouzivat globalni promenne, jinak vedlejsi efekty rozbijou kde co a casto se stane, ze napises funkci s logicky nazvanyma promennyma a pak najednou pozdeji se ti hodi takova jmena pouzit i jako globalni. Nebo naopak das si nejake globalni jmena a pak najednou zacnes podporovat databazi/protokol, ktery pouziva stejne nazvy pro polozky a je jednoduche a logicke, aby funkce, co s nim pracuji mely lokalni promenne nazvane podle polozek.
(A spousta dalsich pripadu se vyroji, kdyz programy zacnou rust nad trivialni velikost. Pak clovek oceni, ze kdyz si ve funkci nazve promennou logicky a deklaruje ji tam, ze mu to nezmrsi neco globalniho)
Re: Variables ve funkcích
V praxi ale (při pěkně napsaném kódu) je minimální potřeba nějakých globálních proměnných. U většího projektu jsou zlo nejen kvůli vedlejším efektům, ale i k orientaci kde vůbec vznikly a co jejich hodnotu ovlivnilo.
Pro úplnost bych jen upřesnil, že platnost proměnné není 100% vázána na scope, např. lambda výrazy a closury tohle "pravidlo" rozbijí. Ale zjednodušeně se to tak asi představit dá.
A fígl se čtyřtečkou je fajn o tom jsem neměl ani tušení...
Pro úplnost bych jen upřesnil, že platnost proměnné není 100% vázána na scope, např. lambda výrazy a closury tohle "pravidlo" rozbijí. Ale zjednodušeně se to tak asi představit dá.
A fígl se čtyřtečkou je fajn o tom jsem neměl ani tušení...
Re: Variables ve funkcích
Dovoluji si zde oponovat. Při psaní tetrisu jsem se bez globálních proměnných absolutně obejít nemohl. Potřeboval jsem uložit pozici bloku, který hráč ovládal, jeho typ, jeho rotaci. Všechny tyhle údaje měnilo několik funkcí a další si je vyžadovalo ... bez globálních proměnných by to fakt nešlo. Jakmile se sejde více funkcí, co potřebuje pracovat s jednou proměnnou, je lepší ji mít globální.KamilV píše: ↑20 zář 2019, 17:20V praxi ale (při pěkně napsaném kódu) je minimální potřeba nějakých globálních proměnných. U většího projektu jsou zlo nejen kvůli vedlejším efektům, ale i k orientaci kde vůbec vznikly a co jejich hodnotu ovlivnilo.
Pro úplnost bych jen upřesnil, že platnost proměnné není 100% vázána na scope, např. lambda výrazy a closury tohle "pravidlo" rozbijí. Ale zjednodušeně se to tak asi představit dá.
A fígl se čtyřtečkou je fajn o tom jsem neměl ani tušení...
Re: Variables ve funkcích
Ale jo, nechoďme z extrému do extrému Napsal jsem "je minimální potřeba", "pozice / typ / rotace" jsou 3 globaly, to se skousnout dá. Možná by je mohla nahradit jedna globální struktura
Chtěl jsem spíš poukázat na fakt, že mnoho lidí rve vše do globálního prostředí a ani neuvažuje, že funkce může brát nějaký argument, nebo něco vracet. Obecně je mi trochu líto, jak se mezi "bastlíři" vychovávají "neprogramátoři". A to i na úrovní "učebních článků", kde někdo někdy vymyslel termíny "hlavní program a podprogram" a mně se ježí vlasy, když sleduju, kolik lidí to používá. Pak to vytváří velká překvapení, že setup() a loop() jsou funkce jako každá jiná a - jako třeba zde - vytváří lexikální uzávěry jako každá jiná.
Chtěl jsem spíš poukázat na fakt, že mnoho lidí rve vše do globálního prostředí a ani neuvažuje, že funkce může brát nějaký argument, nebo něco vracet. Obecně je mi trochu líto, jak se mezi "bastlíři" vychovávají "neprogramátoři". A to i na úrovní "učebních článků", kde někdo někdy vymyslel termíny "hlavní program a podprogram" a mně se ježí vlasy, když sleduju, kolik lidí to používá. Pak to vytváří velká překvapení, že setup() a loop() jsou funkce jako každá jiná a - jako třeba zde - vytváří lexikální uzávěry jako každá jiná.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 41 hostů