Variables ve funkcích

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Variables ve funkcích

Příspěvek od gilhad » 19 zář 2019, 16:56

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)

Hafajs
Příspěvky: 151
Registrován: 10 bře 2019, 10:19
Reputation: 0

Re: Variables ve funkcích

Příspěvek od Hafajs » 19 zář 2019, 20:17

Moc hezky vysvetlene. ;)

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Variables ve funkcích

Příspěvek od KamilV » 19 zář 2019, 21:15

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 ;)

Uživatelský avatar
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

Příspěvek od pavel1tu » 20 zář 2019, 07:43

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.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Variables ve funkcích

Příspěvek od gilhad » 20 zář 2019, 11:12

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



Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Variables ve funkcích

Příspěvek od kiRRow » 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. 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á
}

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Variables ve funkcích

Příspěvek od gilhad » 20 zář 2019, 15:03

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)

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Variables ve funkcích

Příspěvek od KamilV » 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í...

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Variables ve funkcích

Příspěvek od kiRRow » 20 zář 2019, 17:50

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í.

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Variables ve funkcích

Příspěvek od KamilV » 20 zář 2019, 18:17

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á.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 22 hostů