Stránka 2 z 4

Re: Variables ve funkcích

Napsal: 19 zář 2019, 16:56
od gilhad
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

Napsal: 19 zář 2019, 20:17
od Hafajs
Moc hezky vysvetlene. ;)

Re: Variables ve funkcích

Napsal: 19 zář 2019, 21:15
od KamilV
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 ;)

Re: Variables ve funkcích

Napsal: 20 zář 2019, 07:43
od pavel1tu
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.

Re: Variables ve funkcích

Napsal: 20 zář 2019, 11:12
od gilhad
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

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

Napsal: 20 zář 2019, 11:32
od kiRRow
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

Napsal: 20 zář 2019, 15:03
od gilhad
kiRRow píše:
20 zář 2019, 11:32
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.
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]);
}
Nebo muzes mit Arduina, kazde ma sve cislo (node_id), a posilas jim vsem zpravy typu
"
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

Napsal: 20 zář 2019, 17:20
od KamilV
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 :geek: o tom jsem neměl ani tušení...

Re: Variables ve funkcích

Napsal: 20 zář 2019, 17:50
od kiRRow
KamilV píše:
20 zář 2019, 17:20
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 :geek: o tom jsem neměl ani tušení...
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í.

Re: Variables ve funkcích

Napsal: 20 zář 2019, 18:17
od KamilV
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á.