Variables ve funkcích
Napsal: 19 zář 2019, 11:28
Ahoj.
Jsem tu nový, tak na mě budtě hodní.
Mám dotaz, který jsem úplně nevygooglil.
Mám definované nějaké proměnné. Vše mám definované v hlavním programu. Proměnné ve funcích definované nemám, ale pro přehlednost funkce používám.
Jak se to má s přenosem proměnných mezi loopem a funkcí, funkcí a loopem a mezi funkcí a funkcí? Dočetl jsem se, že proměnná ve funkci se dá použít jen v dané funci, ale co když ve funkci používám proměnou definovanou globálně?
Narazil jsem totiž na to, že se některé globální promměné ve funci použít dají a jiné ne a nechápu proč jsou tam ty rodíly.
Například mám několik proměnných s hodnotou. Pak mám funkci "void writeSD()", kterou zavolám "writeSD();"
Uvnitř funkce zapisuji asi tak 10 proměnných na SD. 6 se mě jich zapíše a zbylé 4 mají hodotu 0, ačkoliv v hlavní smyčce loop hodnotu mají. Přitom všechny jsou definované globálně. Nevypozoroval jsem, že by to souviselo s typem té promměné, nebo s tím, zda proměnná dostala hodnotu v loopu, nebo v jiné funkci.
Když si to upravím a promměné vydefinuji při volání funkce např. "writeSD(alt, altKalman, mainFire);" a ve funkci např. "void writeSD(float alt, float altKalman, bool mainFire)" tak už se mě tam hodnota proměnné přenese. Nechápu ale, proč to u některých proměnných funguje i bez.
Principielně bych uvítal, kdyby ty globální proměnné byli vidět prostě všude skrze loop i všechny funkce, ale to nevím zda jde (ačkoliv bych řekl, že některé z těch proměných se tak chovají).
Dále jsem narazil na ještě jedno divné chování, které nevím zda souvisí.
Mám globální proměnnou float, která nabývá v loopu hodnotu příkazem z knihovny.
Konkrétně: float altKalman = pressureKalmanFilter.updateEstimate(alt);
Hned pod tím mám v loopu:
prevAltKalman = altKalman;
Když si následně vypíši obě promměné, tak altKalman má nějakou hodnotu a prevAltKalman má stále hodnotu 0. Nechápu kde je chyba. Obě jsou float, vše se odehrává v loopu.
Přitom hned pod tím mám toto a tam se mě hodota přenese.
if (altKalman > maxAltKalman) {
maxAltKalman = altKalman;
}
Díky.
Jsem tu nový, tak na mě budtě hodní.
Mám dotaz, který jsem úplně nevygooglil.
Mám definované nějaké proměnné. Vše mám definované v hlavním programu. Proměnné ve funcích definované nemám, ale pro přehlednost funkce používám.
Jak se to má s přenosem proměnných mezi loopem a funkcí, funkcí a loopem a mezi funkcí a funkcí? Dočetl jsem se, že proměnná ve funkci se dá použít jen v dané funci, ale co když ve funkci používám proměnou definovanou globálně?
Narazil jsem totiž na to, že se některé globální promměné ve funci použít dají a jiné ne a nechápu proč jsou tam ty rodíly.
Například mám několik proměnných s hodnotou. Pak mám funkci "void writeSD()", kterou zavolám "writeSD();"
Uvnitř funkce zapisuji asi tak 10 proměnných na SD. 6 se mě jich zapíše a zbylé 4 mají hodotu 0, ačkoliv v hlavní smyčce loop hodnotu mají. Přitom všechny jsou definované globálně. Nevypozoroval jsem, že by to souviselo s typem té promměné, nebo s tím, zda proměnná dostala hodnotu v loopu, nebo v jiné funkci.
Když si to upravím a promměné vydefinuji při volání funkce např. "writeSD(alt, altKalman, mainFire);" a ve funkci např. "void writeSD(float alt, float altKalman, bool mainFire)" tak už se mě tam hodnota proměnné přenese. Nechápu ale, proč to u některých proměnných funguje i bez.
Principielně bych uvítal, kdyby ty globální proměnné byli vidět prostě všude skrze loop i všechny funkce, ale to nevím zda jde (ačkoliv bych řekl, že některé z těch proměných se tak chovají).
Dále jsem narazil na ještě jedno divné chování, které nevím zda souvisí.
Mám globální proměnnou float, která nabývá v loopu hodnotu příkazem z knihovny.
Konkrétně: float altKalman = pressureKalmanFilter.updateEstimate(alt);
Hned pod tím mám v loopu:
prevAltKalman = altKalman;
Když si následně vypíši obě promměné, tak altKalman má nějakou hodnotu a prevAltKalman má stále hodnotu 0. Nechápu kde je chyba. Obě jsou float, vše se odehrává v loopu.
Přitom hned pod tím mám toto a tam se mě hodota přenese.
if (altKalman > maxAltKalman) {
maxAltKalman = altKalman;
}
Díky.