Diskuze: Vyhodnocení dvou hodnot
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Neregistrovaný

Zobrazeno 37 zpráv z 37.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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žíš?
"vytvořil" jsem si mini funkci na vyhodnocení čísel A a B, ale má dva zásadní nedostatky:
Zkus mě prosím více nakopnout...:)
no když neumí počkat co třeba udělat podmínku něco na způsob:
if(a == true)
// ulozim
else
return NekamKamChci();
Co udělat uvnitř funkce statickou proměnnou? Ta se inicializuje už při kompilaci a když ji změníš, zůstane tak.
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.
Tak jsem zaslal obrázek (pdf) toho kódu, ale nikde ho nevidím.... asi dělám něco špatně
Tak další pokus - snad to vyjde
int Crossed (double a, double b)
{
static int lastDirection = 0;
static int currentDirection = 0;
if (a > b)
currentDirection = 1;
if (a < b)
currentDirection = 2;
if (currentDirection != lastDirection)
{
lastDirection = currentDirection;
return (lastDirection);
}
else
{
return (0);
}
}
Kód nechápu - absolutně...
Možná:
int Crossed (int a, int b)
{
if (a == b)
return 0;
else if (a > b)
return 1;
retrun 2;
}
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.
Pravidla by se dala zařídit pomocí objektů. Například změna proměnné může automaticky volat přepočet...
Dobre, dej mi vedet, az bude Cecko umet objekty
A sice se to pak (u jinych jazyku) "tvari" jako pravidlo, ale taky je to vlastne jen kod, ktery se spousti pri pouziti toho setteru.
Vycházel jsem z toho, co psal tazatel, ten se ptal na Céčko, o objective C nebo C++ se nikde nezmiňoval.
C a Objective-C jsou dva dost rozdílný jazyky. Objective-C je záležitost Applu.
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í.
Pokud místo obrázku vkládáš PDF, tak se nemůžeš divit, že se
nenahraje Navíc na vložení
kódu je tu tag code, je k tomu tlačítko nad formulářem.
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).
Pořád si nejsem jistý, jestli to chápu dobře, jde tedy jen o to uložení výsledku -, jestli se hodnoty protly (což se zjišťuje voláním té funkce)?
Ano přesně tak - potřebuji jen vyhodnotit, že nastala první
změna-hodnoty se protly.. .
Ostatní změny mě již nezajímají.
Při každé změně hodnot a nebo b zavoláte:
bool protlySe = Crossed(a, b)!=0;
Potom máte v proměnné protlySe uloženo true nebo false podle toho, jestli se protly.
Zatím děkuji - jak se zítra rozjede Forex tak to vyzkouším. Možná se ještě ozvu....:)
Tak jsem na to hošani přišel sám. Tady je řešení
bool prvniZmena (double cenaA, double cenaB)
{
static int hodnota1 = 0;
static int hodnota2 = 0;
if (cenaA > cenaB)
hodnota1 = 1;
if (cenaA < cenaB)
hodnota2 = 1;
if (hodnota1 == 1 && hodnota2 == 1)
{
return (true)
}
else
}
return (false)
}
}
Na to se nedá koukat.
bool prvniZmena(double cenaA, double cenaB)
{
return (cenaA > cenaB && cenaA < cenaB); // nějak mi to nedává smysl
}
Proč musíte všichni za každou cenu větvit?
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.
Já to nepochopil celé... Ale větvit tu 100% není třeba.
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í.
Prober se:
bool prvniZmena (double cenaA, double cenaB)
{
static int hodnota1 = 0;
static int hodnota2 = 0;
if (cenaA > cenaB)
hodnota1 = 1;
if (cenaA < cenaB)
hodnota2 = 1;
if (hodnota1 == 1 && hodnota2 == 1)
{
return (true)
}
else
}
return (false)
}
}
vs
bool prvniZmena(double cenaA, double cenaB)
{
return (hodnota1 == 1 && hodnota2 == 1); // zde si dělej co chceš...
}
Tu část
if (hodnota1 == 1 && hodnota2 == 1)
{
return (true)
}
else
}
return (false)
}
můžeš nahradit kódem, ale zbytek samozřejmě musí zůstat.
return (hodnota1 == 1 && hodnota2 == 1);
matesax : Přečti si něco o tom, jak fungují statické proměnné ve funkcích v Céčku.
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.
Statické proměnné uvnitř funkcí mi občas v C# docela chybí, škoda,
že je C# neumí
Já osobně jsem toho názoru že třeba konstanty uvnitř funkcí (i uvnitř tříd) by měly bejt statický vždycky.
K čemu jsou dobré statické proměnné? Je lepší se jim vyhnout.
Aha, jasné, já jsem zvyklej na C#, tam si statiku do metody nedám.
Zobrazeno 37 zpráv z 37.