Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar

Neregistrovaný
Avatar
:2.2.2013 17:47

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

 
Odpovědět
2.2.2013 17:47
Avatar
Зайчик
Člen
Avatar
Odpovídá na
Зайчик:2.2.2013 18:02

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žíš?

Nahoru Odpovědět
2.2.2013 18:02
Коммунизм для нашего будущего!
Avatar

Neregistrovaný
Avatar
Odpovídá na Зайчик
:2.2.2013 19:36

"vytvořil" jsem si mini funkci na vyhodnocení čísel A a B, ale má dva zásadní nedostatky:

  1. vyhodnocuje hodnoty A a B ihned po spuštění kódu a neumí počkat na první změnu (nastala první změna = true; jinak před změnou = false)
  2. nevím jak právě uložit to true. I když budou probíhat další změny v průběhu kódu-ty již nechci vyhodnocovat stále pak již bude true

Zkus mě prosím více nakopnout...:)

 
Nahoru Odpovědět
2.2.2013 19:36
Avatar
Зайчик
Člen
Avatar
Odpovídá na
Зайчик:2.2.2013 21:42

no když neumí počkat co třeba udělat podmínku něco na způsob:

if(a == true)
    // ulozim
else
    return NekamKamChci();
Nahoru Odpovědět
2.2.2013 21:42
Коммунизм для нашего будущего!
Avatar
Зайчик
Člen
Avatar
Odpovídá na
Зайчик:2.2.2013 21:45

Super by bylo sem dát kousek toho kódu :)

Nahoru Odpovědět
2.2.2013 21:45
Коммунизм для нашего будущего!
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na
Lukáš Hruda:3.2.2013 4:57

Co udělat uvnitř funkce statickou proměnnou? Ta se inicializuje už při kompilaci a když ji změníš, zůstane tak.

 
Nahoru Odpovědět
3.2.2013 4:57
Avatar
rkolacek
Člen
Avatar
rkolacek:3.2.2013 6:19

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.

 
Nahoru Odpovědět
3.2.2013 6:19
Avatar
rkolacek
Člen
Avatar
Odpovídá na Зайчик
rkolacek:3.2.2013 6:27

Tak jsem zaslal obrázek (pdf) toho kódu, ale nikde ho nevidím.... asi dělám něco špatně

 
Nahoru Odpovědět
3.2.2013 6:27
Avatar
matesax
Tvůrce
Avatar
Odpovídá na rkolacek
matesax:3.2.2013 7:05

Dej ho sem - do tagů "code"...

 
Nahoru Odpovědět
3.2.2013 7:05
Avatar
rkolacek
Člen
Avatar
Odpovídá na matesax
rkolacek:3.2.2013 15:26

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);
    }
  }
 
Nahoru Odpovědět
3.2.2013 15:26
Avatar
matesax
Tvůrce
Avatar
Odpovídá na rkolacek
matesax:3.2.2013 15:34

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;
}
Editováno 3.2.2013 15:37
 
Nahoru Odpovědět
3.2.2013 15:34
Avatar
Luboš Běhounek Satik:3.2.2013 15:38

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.

Nahoru Odpovědět
3.2.2013 15:38
https://www.facebook.com/peasantsandcastles/
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
matesax:3.2.2013 15:40

Pravidla by se dala zařídit pomocí objektů. Například změna proměnné může automaticky volat přepočet...

 
Nahoru Odpovědět
3.2.2013 15:40
Avatar
Odpovídá na matesax
Luboš Běhounek Satik:3.2.2013 15:44

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.

Nahoru Odpovědět
3.2.2013 15:44
https://www.facebook.com/peasantsandcastles/
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
matesax:3.2.2013 15:47

Ano - má - objektové C. (Sice nečisté...)

 
Nahoru Odpovědět
3.2.2013 15:47
Avatar
Odpovídá na matesax
Luboš Běhounek Satik:3.2.2013 15:58

Vycházel jsem z toho, co psal tazatel, ten se ptal na Céčko, o objective C nebo C++ se nikde nezmiňoval.

Nahoru Odpovědět
3.2.2013 15:58
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na matesax
Lukáš Hruda:3.2.2013 16:01

C a Objective-C jsou dva dost rozdílný jazyky. Objective-C je záležitost Applu.

 
Nahoru Odpovědět
3.2.2013 16:01
Avatar
rkolacek
Člen
Avatar
Odpovídá na Lukáš Hruda
rkolacek:3.2.2013 16:31

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í.

 
Nahoru Odpovědět
3.2.2013 16:31
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na rkolacek
David Hartinger:3.2.2013 16:35

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.

Nahoru Odpovědět
3.2.2013 16:35
You are the greatest project you will ever work on.
Avatar
Odpovídá na rkolacek
Luboš Běhounek Satik:3.2.2013 16:38

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".

Nahoru Odpovědět
3.2.2013 16:38
https://www.facebook.com/peasantsandcastles/
Avatar
rkolacek
Člen
Avatar
Odpovídá na Luboš Běhounek Satik
rkolacek:3.2.2013 18:45

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).

 
Nahoru Odpovědět
3.2.2013 18:45
Avatar
Odpovídá na rkolacek
Luboš Běhounek Satik:3.2.2013 19:05

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)?

Nahoru Odpovědět
3.2.2013 19:05
https://www.facebook.com/peasantsandcastles/
Avatar
rkolacek
Člen
Avatar
Odpovídá na Luboš Běhounek Satik
rkolacek:3.2.2013 20:30

Ano přesně tak - potřebuji jen vyhodnotit, že nastala první změna-hodnoty se protly.. :). Ostatní změny mě již nezajímají.

 
Nahoru Odpovědět
3.2.2013 20:30
Avatar
Odpovídá na rkolacek
Luboš Běhounek Satik:3.2.2013 20:35

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.

Nahoru Odpovědět
3.2.2013 20:35
https://www.facebook.com/peasantsandcastles/
Avatar
rkolacek
Člen
Avatar
Odpovídá na Luboš Běhounek Satik
rkolacek:3.2.2013 20:45

Zatím děkuji - jak se zítra rozjede Forex tak to vyzkouším. Možná se ještě ozvu....:)

 
Nahoru Odpovědět
3.2.2013 20:45
Avatar
rkolacek
Člen
Avatar
Odpovídá na Luboš Běhounek Satik
rkolacek:5.2.2013 5:45

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)
     }
  }
 
Nahoru Odpovědět
5.2.2013 5:45
Avatar
matesax
Tvůrce
Avatar
Odpovídá na rkolacek
matesax:5.2.2013 5:53

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?

Editováno 5.2.2013 5:54
 
Nahoru Odpovědět
5.2.2013 5:53
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:5.2.2013 6:09

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.

Nahoru Odpovědět
5.2.2013 6:09
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:5.2.2013 6:17

Já to nepochopil celé... Ale větvit tu 100% není třeba.

 
Nahoru Odpovědět
5.2.2013 6:17
Avatar
rkolacek
Člen
Avatar
Odpovídá na matesax
rkolacek:5.2.2013 7:47

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í.

 
Nahoru Odpovědět
5.2.2013 7:47
Avatar
matesax
Tvůrce
Avatar
Odpovídá na rkolacek
matesax:5.2.2013 8:24

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š...
}
 
Nahoru Odpovědět
5.2.2013 8:24
Avatar
Odpovídá na matesax
Luboš Běhounek Satik:5.2.2013 9:59

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.

Nahoru Odpovědět
5.2.2013 9:59
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na David Jančík
Lukáš Hruda:5.2.2013 10:10

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.

 
Nahoru Odpovědět
5.2.2013 10:10
Avatar
Luboš Běhounek Satik:5.2.2013 10:48

Statické proměnné uvnitř funkcí mi občas v C# docela chybí, škoda, že je C# neumí :)

Nahoru Odpovědět
5.2.2013 10:48
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:5.2.2013 11:01

Já osobně jsem toho názoru že třeba konstanty uvnitř funkcí (i uvnitř tříd) by měly bejt statický vždycky.

 
Nahoru Odpovědět
5.2.2013 11:01
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:5.2.2013 11:13

K čemu jsou dobré statické proměnné? Je lepší se jim vyhnout.

Nahoru Odpovědět
5.2.2013 11:13
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na Lukáš Hruda
David Jančík:5.2.2013 11:49

Aha, jasné, já jsem zvyklej na C#, tam si statiku do metody nedám.

Nahoru Odpovědět
5.2.2013 11:49
Zapomeň, že je to nemožné a udělej to ;)
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.

Zobrazeno 37 zpráv z 37.