Je možné měnit globální proměnné po zavolání funkce?

Potřeboval bych poradit jestli, když programuji ATmegu v C a zavolám funkci . Může měnit globální proměnný nebo to musím dělat ukazatelem?

:arrow_right: administrator: přejmenováno z "Funkce a globální proměný"

Muže. Stačí je přidat do #include blabla.h jako external typ promena;

A ten pointer by jsi zjistil jak, pokud by nebyla globalni ? hmm…

Tady platí to co říká učebnice C.

  1. Argument funkce můžeme předat buď hodnotou, nebo odkazem (tj. adresou).

  2. Pokud předáme hodnotou, funkce původní proměnnou nezmění.

  3. Pokud předáme odkazem, funkce původní proměnnou změní.

Příklad:

[code]uint8_t num, y;

// předání hodnotou
uint8_t inc(uint8_t x)
{
x++;
return x;
}

// předání odkazem
uint8_t incr(uint8_t* x)
{
(*x)++;
return *x;
}

int main(void)
{
num = 7;

  // předáme argument hodnotou, funkce proměnnou "num" nezmění
  y = inc(num); // y=8  num=7

  // předáme argument odkazem, funkce proměnnou "num" změní
  y = incr(&num); // y=8  num=8

[/code]

Teď mě napadlo, že možná myslíš něco jiného.
To je nevýhoda takto příliš stručných dotazů.
Jistě, ve funkci můžeš změnit hodnotu globální proměnné.
Žádné pointery k tomu nepotřebuješ.

[code]//declare global variables
uint8_t a, b, c, d;

void myfunc(void)
{
a = 2;
b = 3;
c = 4;
d = 5;
}
[/code]

Dík. A promiňte že se neumím vyjadřovat :smiley:

Velice jednoducho. Modul C ktorý má napríklad svoju static premennu CISLO zavolanim funkcie ktorej parameter je pointer na hodnotu ako tento parameter posle adresu tejto svojej premennej CISLO napriklad v tvare &CISLO. Naco by este k tomu tato premenna mala byt aj globalna? To som nejako nepochopil, ale rad sa necham poucit.

To Martin> Takže drbání se levou nohou za pravým uchem. Místo proměné zveřejníš funkci, nebo ukazatel… Přínos tohodle postupu si dokážu přestavit jen ve velice specifických situacích.

Otazka zněla jasně, odpově’d taky. Netahejte sem pointery - tazatel se v tom topí, jinak by se neptal na takovou trivialitu !

Vrelo odporucam najst si na webe alebo v inej literature co to znamena zapuzdrenie premennej a preco je to velmi odporucana technika. Urcite sa nejedna o srabanie sa okolo hlavy aj ked samemu mi tak zo zaciatku trochu pripadala. Nazory sa vsak menia s rozsiahlostou a strukturovanostou projektov.

Moja odpoved sa týkala tvrdenia

" A ten pointer by jsi zjistil jak, pokud by nebyla globalni ? hmm… "

pointer v programe tam kde je ho je treba vediet sa da zistit bez ohladu na to ci je premenna globalna alebo nie.

Zveřejnění ukazatele nedává moc smyls zatímco funkce smysl dává. Ovšem né takové, která vrací pointer, ale takové která vrací hodnotu, nebo ji modifikuje.
Jednoduchý příklad:
Nechť je proměnná BaudRate, která určuje rychlost USARTu. Pokud je zveřejněna (jakýmkoli způsobem), přepis její hodnoty neznamená automaticky změnu rychlosti USARTu. Když vytvoříme proceduru např.
void ChangeBaudRate(int NewBaudRate) ,
kterou zveřejníme, může obsahovat kromě změny proměnné BaudRate také změnu nastavení USATRu. Tím je zajištěno, že hodnota v BaudRate odpovídá skutečné rychlosti USARTu.

“zapuzdrenie premennej” - jasně, když k tomu ještě přidáš metodu jak píše Technik a je pravda že dost často není dobrý aby si moduly měnily proměnné jinak něž přes funkce ale to jsme u objektů…

Jestli jde jen o slovíčkaření nad slovem “globální” tak uznávám že být globální nemusí (ta proměná).

Mozete aj uviest priklad, napr medzi dvoma modulmi a main, vcelku by ma to zaujimalo.

Diky