Zdravím všechny,
začínám se prokousávat Cečkem (spíše MQL4) a narazil jsem na
problém.Potřebuji vyhodnotit hodnoty dvou čísel A a B. Po spuštění kódu
může být A>B nebo A<B (tyto hodnoty neovlivním,ale jsou vždy obě
kladné).Jakmile nastane v průběhu spuštěného kódu změna - např.
počáteční stav je A>B a změní se na A<B chci tuto změnu
vyhodnotit.Snažím se napsat nějakou funkci: např. počáteční stav
(nenastala změna) by byl return false-po první změně return true. Chci
vyhodnotit pouze první změnu a pak bych potřeboval to true nějak "uložit".
V průběhu kódu budou probíhat další změny, ale ty již nechci
vyhodnocovat-stále bude return true.
Snad jsem se do toho nezamotal... Prosím poraďte
Jestli jsem to dobře pochopil... Co zkusit při "přepisování" hodnoty tam
šoupnout nějakou funkci typu bool, která ti bude vracet true/false? A tu
hodnotu si pak uložíš?
Ten můj "výtvor" vyhodnocuje co potřebuji, ale bohužel vyhodnocuje ihned
po spuštění kódu nepočká na první změnu. Ty podmínky jak jsem uvedl
mohou být součástí mého kódu nebo spíše samostatná funkce a pak budu
kontrolovat a vyhodnocovat dvě funkce.
int Crossed (double a, double b)
{
staticint lastDirection = 0;
staticint currentDirection = 0;
if (a > b)
currentDirection = 1;
if (a < b)
currentDirection = 2;
if (currentDirection != lastDirection)
{
lastDirection = currentDirection;
return (lastDirection);
}
else
{
return (0);
}
}
Myslím, že problém je v tom, že jsi špatně pochopil, jak C funguje.
To, jak si asi představuješ, že to funguje, by fungovalo v Prologu, že si
nadefinuješ určitý pravidla a program se pak podle nich chová.
Ale v Céčku se kód vykonává postupně řádek po řádku, když
zavoláš funkci, odskočí běh programu do ní a pak se zase vrátí zpátky,
ale neprovádí se nic, kudy zrovna běh programu neproteče, takže existence
funkce nemá žádný vliv na program, dokud ji ty sám nezavoláš.
Takže musíš po každý změně čísel A a B volat tu funkci znova.
No abych ještě trochu zamotal ty "Cečka" Jak jsem již v úvodu psal
píšu ten kód v MQL4 - je to prakticky C o něco ochuzený a o něco
rozšířený. Používá se pro automatické obchodování na devizové burze
Forex a je součásti obchodní platformy.
Ten kód co jsem uvedl pracuje správně-to jsem si již ověřil a pracuje tak
jak jsem si představoval jen s tím, že neumí počkat na první změnu a
vyhodnocuje hodnoty ihned po spuštění kódu. Neumím vložit obrázek, abych
mohl ukázat oč mi vlastně jde. Možná chci po C něco co vlastně
neumí.
Ano, chceš po C něco, co neumí.
Ta funkce nefunguje "sama od sebe" jen tím, že je napsaná - nehlídá
neustále ty dvě hodnoty.
Tu funkci je pro vyhodnocení těch dvou hodnot nutno z kódu zavolat (ona to
zkontroluje a nastaví) a pak běh programu z té funkce zase vyskočí a dokud
ji znova nezavoláš, tak se nijak neprovádí - "nefunguje".
Tak to zkusím ještě naposledy. Kód v MQL4 se spouští při každé
změně ceny (může to být několikrát za vteřinu nebo taky třeba jednou za
5 minut). Není problém kód napsat tak, aby při každé změně ceny
(spuštění kódu) zavolal funkci.
A teď potřebuji vyřešit. Spustí se kód - zjistí, že v tuto chvíli cena
A < cena B - nic nedělám . Při dalším spuštění kódu je stále cena A
< cena B - nic nedělám..... spustí se kód cena A > cena B NASTALA
ZMĚNA vyhodnotím a uložím (např. z počátečního false na true) Možná
se to nemusí řešit pomocí funkce stačilo by to pořešit jen s "ify" to
právě nevím jak na to.
Taky je problém v tom, že nikdy po spuštění kódu dopředu nevím jestli
bude A > B nebo A < B (kód se spouští sám na základě různých
podmínek např. rozpětí hodin od 9 - do 17 hod bude kód pracovat).
Tady si to nemůžeš zjednodušit až takhle. Maximálně: return (hodnota1 == 1 && hodnota2 == 1)
Všimni si, že se přiřazují hodnoty do statických proměnných, které by
imho měli být mimo metodu.
Tak ještě naposledy. Jak již jsem psal na v úvodu jsem s C (spíše s
MQL4) na úplném začátku. Možná se na to nedá koukat, ale funguje to
přesně tak jak jsem si přál a psal o tom pořád dookola. Místo toho abys
mi trochu poradil tak tady melěš něco o koukání. Mě z toho oči
nebolí.
Kdyby ty proměnný byly mimo funkci museli by buďto bejt globální, což
by byla prasárna, nebo by se musely předávat pointerem v parametrech,
protože ta funkce je potřebuje změnit, což je imho zbytečně složitý.
Návratová hodnota už je zabraná a cpát to do nějaký struktury i s ní,
aby se to mohlo všechno vrátit, by byla imho taky prasárna a ještě větší
složitost. Statická proměnná uvnitř funkce je v tomhle případě asi
nejlepší řešení, ještě to předání pointerem by tak nějak šlo, ale
já bych to udělal takhle.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.