Diskuze: Vyhodnocení dvou hodnot

C++ C a C++ Vyhodnocení dvou hodnot

Avatar

Neregistrovaný
Avatar
:

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
Зайчик:

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 Зайчик
:

"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
Зайчик:

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
Зайчик:

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

Nahoru Odpovědět 2.2.2013 21:45
Коммунизм для нашего будущего!
Avatar
Odpovídá na
Lukáš Hruda (Luckin):

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:

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:

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
Redaktor
Avatar
Odpovídá na rkolacek
matesax:

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

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

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
Redaktor
Avatar
Odpovídá na rkolacek
matesax:

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

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
:)
Avatar
matesax
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
matesax:

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

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  +1 3.2.2013 15:44
:)
Avatar
matesax
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
matesax:

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

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
:)
Avatar
Odpovídá na matesax
Lukáš Hruda (Luckin):

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 (Luckin)
rkolacek:

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na rkolacek
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na rkolacek
Luboš Běhounek (Satik):

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
:)
Avatar
rkolacek
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
rkolacek:

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

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
:)
Avatar
rkolacek
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
rkolacek:

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

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
:)
Avatar
rkolacek
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
rkolacek:

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:

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
Redaktor
Avatar
Odpovídá na rkolacek
matesax:

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
Odpovídá na matesax
David Jančík [sczdavos]:

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
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

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:

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
Redaktor
Avatar
Odpovídá na rkolacek
matesax:

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

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  +1 5.2.2013 9:59
:)
Avatar
Odpovídá na David Jančík [sczdavos]
Lukáš Hruda (Luckin):

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

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
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
Lukáš Hruda (Luckin):

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
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

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
Odpovídá na Lukáš Hruda (Luckin)
David Jančík [sczdavos]:

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

Nahoru Odpovědět 5.2.2013 11:49
Čím více času dostaneš, tím méně ho máš.
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.