peterple napísal:Úplne bežne sa to používa napríklad aj takto
Kód: Vybrať všetko
int i= 10;
for (int i=0; i<100; i++)
{
printf("%d\n", i);
}
Použít to takhle jde, ale běžně se to přímo takhle nepoužívá (tedy myslím definování stejných proměnných v rámci jedné funkce) - ztrácíš tak přehled.
Toto se skutečně používá :
Kód: Vybrať všetko
for (int i=0; i<100; i++)
{
printf("%d\n", i);
}
I když místo proměnné i se používá (třeba) Idx. Celé to pak vypadá takto :
Kód: Vybrať všetko
for (int Idx=0; Idx<100; Idx++)
{
printf("%d\n", Idx);
}
Použití jednopísmenných (nebo obecně krátkých) proměnných je dobré se vyhybat, stejně tak jako je dobré se vyhybat proměnným s nic neříkajícím názvem (pomocna1, pomocna2, ... pomocna9 atd.). Cčko rozlišuje malá a velká písmena, takže tahle_promenna není Tahle_promenna. Tohle je věc, kterou v žádném případě nedělej - používat dvě různé proměnné rozlišené jenom velikostí písmen.
Je rozdíl mít proměnné s názvem DP, PP nebo DelkaPulzu, PocetPulzu. Proměnné, konstanty atd. by měly dávat smysl. To jediné přispívá k přehlednosti kódu. A když pak dodržuješ formát názvů, tak na první pohled do programu vidíš, jestli jde o lokální/globální proměnnou, IO pin nebo konstantu.
Stejně tak je dobré vyhybat se psaní čísel, týkajících se třeba rozměrů polí (ale třeba i nějakých konstant apod.) přímo do kódu. Takže místo deklarace a použití pole takto :
Kód: Vybrať všetko
int PolePrvku[10];
void NastavPole( void )
{
for ( int Idx = 0 ; Idx < 10 ; Idx++ )
{
PolePrvku[Idx] = 10;
}
}
je mnohem lepší místo čísla 10 použít definovanou konstantu :
Kód: Vybrať všetko
#define POCET_PRVKU 10
int PolePrvku[POCET_PRVKU];
void NastavPole( void )
{
for ( int Idx = 0 ; Idx < POCET_PRVKU ; Idx++ )
{
PolePrvku[Idx] = 10;
}
}
ideálně pak :
Kód: Vybrať všetko
#define POCET_PRVKU 10
#define VYCHOZI_HODNOTA 10
int PolePrvku[POCET_PRVKU];
void NastavPole( void )
{
for ( int Idx = 0 ; Idx < POCET_PRVKU ; Idx++ )
{
PolePrvku[Idx] = VYCHOZI_HODNOTA;
}
}
Tím se pro změnu vyvaruješ chyb, když pak chceš změnit rozměr pole tím, že :
- Nespleteš si dvě stejná čísla, která v programu mají různý význam (která 10 je ta správná ?)
- Na žádné místo, které potřebuješ změnit nezapomeneš
Ale vraťme se k lokálním/globálním proměnným.
Lokální proměnná (obecně) je proměnná, která je nadefinovaná mezi složenými závorkami { } a je jedno, jestli unvnitř cyklu, funkce nebo bloku.
Pokud potřebuješ, aby lokální proměnná v nějaké funkci byla k dispozici pouze této funkci, ale neztrácela svou hodnotu, může tak být nadeklarována. Například použití jako čítače nebo pro rozfázování nějakého procesu.. Taková proměnná se pak deklaruje jako lokální (tedy uvnitř funkce), ale s příznakem "static" :
Kód: Vybrať všetko
void BlikejLedkou( void )
{
static int _Krok = 0;
switch ( _Krok )
{
case 1: LedZelenaOut = SVITI; // Rozsvítit LED
LedTimer = T_500MS; // Nastavit časovač na 500ms
_Krok++; // Do dalšího kroku
break;
case 2: if ( !LedTimer ) _Krok++; // Pokud časovač dopočítal, jdi do dalšího kroku
break;
case 3: LedZelenaOut = NESVITI; // Zhasnout LED
LedTimer = T_500MS; // Nastavit časovač na 500ms
_Krok++; // Do dalšího kroku
break;
case 4: if ( !LedTimer ) _Krok = 1; // Pokud časovač dopočítal, jdi do prvního kroku
break;
default: _Krok=1; // Tohle snad vysvětlovat nemusím ...
break;
}
}
Poznámka :
_Krok - lokální proměnná
LedZelenaOut - je to proměnná, která označuje IO pin, kde je zelená LEDka připojená (to znamená to Out na konci)
LedTimer - globální proměnná
SVITI, NESVITI, T_500MS - nadefinované konstanty
Lokální proměnná s příznakem "static" se chová jako lokální, ale má trvale přidělenou paměť stejně, jakoby to byla globální proměnná.