Stránka 1 z 5
ARDUINO mega - opakovani funkce - VYŘEŠENO
Napsal: 07 říj 2015, 18:21
od jiri255
Zdravím,
trochu jsem se zasekl u opakovani funkce přesněji mám hlavní funkci,
která při splnění podmínky zavolá další funkci, která se opakuje neustále dokola což je skvělé, ale už se to nedokáže vrátit zpět na tu hlavní funkci,
aby ji to znovu vyhodnotilo, tedy jde mi o to jak se dostat s té volané funkce getTest(); zpět k té hlavní.
Nevíte někdo, jak se dá vracet zpět do loop() co bych tam měl přidat,
aby mě to vrátilo do hlavní funkce?
Kód: Vybrat vše
void loop() {
//hlavni funkce ke ktere se potrebuju vracet
if (teplomer1() >=50) {
Serial.print("nebezi");
} else {
Serial.print("bezi");
getTest();
}
}
void getTest() {
if (teplomer2() <= 30) {
digitalWrite(2,HIGH);
//a tady muzou byt dalsi podminky
//else if a podobne
//sem nekam potrbuju vlozit neco
//co rekne, aby se to zase vratilo
//do loop
}
Předem děkuji za pomoc
Napsal: 07 říj 2015, 18:43
od frpr666
Podle mě ten program je nepřehledný.
Problém rozdělte na dvě části. V první řešte detekci teploty a ve druhé řešte reakci na událost.
Kód: Vybrat vše
#define CEKAT 0
#define TOPIT 1
#define CHLADIT 2
loop()
{
x = getTemperature();
if (x > 60)
{
action = CHLADIT;
}
else if (x > 30)
{
action = CEKAT;
}
else
{
action = TOPIT;
}
getTest(action);
}
void getTest( uint8_t action)
{
if (action == CHLADIT)
{
PORTB = 0x01;
}
else if (action == TOPIT)
{
PORTB = 0x02;
}
else
{
}
}
Napsal: 07 říj 2015, 18:49
od jiri255
to jsem tam mozna nenapsal uplne spravne o ty teploty az tak moc nejde
to je tam, aby v te podmince neco bylo me jde spis o to, jak se vratit s toho getTest do toho loop, tedy nejaky navratovy kod nebo neco takoveho co bych vepsal na konec toho getTest... tohle jsem nejak nepochopil co to presne dela

Napsal: 07 říj 2015, 19:06
od frpr666
V čem je problém? Volaná funkce se jaksi ze své podstaty ukončí a vrátí se běh programu do nadřazené... Tak už to funguje nějakých pár let, co se nepoužívá "goto"
Kód: Vybrat vše
void loop()
{
print("A");
getTest();
print("C");
}
void getTest()
{
print("B-jsem uvnitř funkce");
}
//-----
bude výstup:
A
B-jsem uvnitř funkce
C
A
B-jsem uvnitř funkce
C
A
B-jsem uvnitř funkce
C
Napsal: 07 říj 2015, 20:01
od Zmije
Goto je k vidění například ve zdrojových kódech Linuxu, používá se tam převážně na obsluhu chyb, kdy je potřeba odskočit na konec a uvolnit prostředky.
Napsal: 07 říj 2015, 20:04
od mtajovsky
No, a ve většině jazyků bývá k dispozici klíčové slovo return, které funkci ukončí na libovolném místě.
Zmije píše:Goto je k vidění například ve zdrojových kódech Linuxu, používá se tam převážně na obsluhu chyb, kdy je potřeba odskočit na konec a uvolnit prostředky.
Dá se to i strukturovaně pomocí do-while a break.
Napsal: 07 říj 2015, 20:20
od ZdenekHQ
Ve starým Basicu na CPC-6128 byla funkce gosub+return. Taky mě byla nějak z principu milejší, než goto, a ani jsem nevěděl proč. Tenkrát jsem měl ještě dost času, než se programování vůbec začalo učit...
Napsal: 07 říj 2015, 20:38
od mtajovsky
gosub - return je na něco trochu speciálnějšího než goto; nicméně hlavní potíž s goto je ta, že svádí k lidové tvořivosti. To je pak kód ve stylu hop sem - hop tam, a za chvíli se v tom nevyzná nejen že prase, ale ani sám autor.
Napsal: 07 říj 2015, 20:46
od ZdenekHQ
Jasně, ale dnes to znám v asm (JSA) jako instrukci JUMP - jenže ta je třeba pro větvení nutná. Na volání podprocesů je samozřejmě CALL (ekvivalent GOSUB).
Skákat chaoticky přes JMP někam do prostředku procedury si v asm ani nemůžu dovolit....

Napsal: 07 říj 2015, 20:48
od jiri255
hmm no já zkoušel to goto, ale moc se to nepovedlo hlásí mi to chybu,
že nemám definováno OPAK zde je kod s tim goto
Kód: Vybrat vše
void loop() {
OPAK;
//hlavni funkce ke ktere se potrebuju vracet
if (teplomer1() >=50) {
Serial.print("nebezi");
} else {
Serial.print("bezi");
getTest();
}
}
void getTest() {
if (teplomer2() <= 30) {
digitalWrite(2,HIGH);
//a tady muzou byt dalsi podminky
//else if a podobne
//sem nekam potrbuju vlozit neco
//co rekne, aby se to zase vratilo
//do loop
goto OPAK;
}
a zkousel jsem i return, ale to se take nevraci

Kód: Vybrat vše
void loop() {
//hlavni funkce ke ktere se potrebuju vracet
if (teplomer1() >=50) {
Serial.print("nebezi");
} else {
Serial.print("bezi");
getTest();
}
}
void getTest() {
if (teplomer2() <= 30) {
digitalWrite(2,HIGH);
//a tady muzou byt dalsi podminky
//else if a podobne
//sem nekam potrbuju vlozit neco
//co rekne, aby se to zase vratilo
//do loop
return;
}
Napsal: 07 říj 2015, 20:54
od mtajovsky
To je nepochopení. Opak není zevnitř funkce vidět. Ale hlavně tam žádné got není třeba. Ani toho return.
Není důvodu, proč by se po ukončení funkce nemělo řízení vrátiti do hlavní smačky. Vždyť je to stejné jako třeba u toho print.
Napsal: 07 říj 2015, 20:54
od jiri255
hlavní je vždycky ta funkce v loop ta se skládá z
Kód: Vybrat vše
void loop() {
if (pokud je splnena podminka) {
Serial.print("nebezi");
getZkouska; //vykonej podprogram zkouska
} else {
Serial.print("bezi");
getTest(); //jinak vykonej test
}
//a melo by se to vzdycky vratit zpet nad tohle
//a znovu provest kontrolu na ty dve podminky
}
Napsal: 07 říj 2015, 20:55
od lesana87
Ten OPAK samozřejmě není z jedné funkce do druhé vidět, proto to nefunguje. Ale podle čeho soudíš, že se nevrací ten return (nebo i bez returnu)?
Napsal: 07 říj 2015, 20:55
od jiri255
a jak to udělám, aby ten OPAK; byl vidět a nemuselo se nebo se mohlo použít to goto?
Napsal: 07 říj 2015, 20:56
od ZdenekHQ
Asi se budu muset naučit další programovací jazyk, ale hlavní smyčka snad nezačíná "void" ?