Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - fortran1986

Stran: 1 ... 8 9 [10] 11 12 ... 18
136
Vývoj / Re:Kolko cyklov zbehne
« kdy: 13. 08. 2020, 14:35:59 »
Najprv 2 iterácie filter potom sa aplikuje map a potom znovu filter.

Oprava: tým filter som myslel filtered a map = transformed.

137
Vývoj / Re:Kolko cyklov zbehne
« kdy: 13. 08. 2020, 14:34:48 »
Je to stream api z C++.

Mohl byste jeste vyvsetlit, co znameta ten operator pipe "|". C++ syntaxi trochu znam, ale tohle si nepamatuju. V C++ bych cekal spis neco takovyhleho: boost::irange(1, 12).filtered().transformed()... Nebo je to nejak pretizenej operator?

Ďakujem za vysvetlenie. Vidím že ste moju otázku nakoniec pochopil.

Išlo mi o to či sa tam používa lazy evaluation a či sa tie operácie optimalizujú na čo najmenší počet cyklov. Takže to funguje podobne ako LINQ (alebo spomínané streamy z Java).

Ja som si to nakoniec aj prechádzal v debuggeri a vyzeralo to tak že obidve adaptéry sa aplikujú vrámci 1 cyklu postupne za sebou. Najprv 2 iterácie filter potom sa aplikuje map a potom znovu filter.

Je to stream api z C++.

Mohl byste jeste vyvsetlit, co znameta ten operator pipe "|". C++ syntaxi trochu znam, ale tohle si nepamatuju. V C++ bych cekal spis neco takovyhleho: boost::irange(1, 12).filtered().transformed()... Nebo je to nejak pretizenej operator?

C++ má operator overloading. A tú pipu si overloadol boost. Správa sa to podobne ako forward pipe z funkcionálnych jazykov.

138
Vývoj / Kolko cyklov zbehne
« kdy: 12. 08. 2020, 22:32:17 »
Dobrý deň, kolko cyklov zbehne počas vykonávania tohoto kódu?:

Kód: [Vybrat]
std::vector<int> result;
boost::copy(
        boost::irange(1, 12)
        | filtered([](const int n) { return n % 2 == 0; })
        | transformed([](const int n) { return n * n; }),
        std::back_inserter(result)
);

A poprosím aj vysvetliť prečo. Ďakujem.

139
Vývoj / Re:C++ typ interval
« kdy: 09. 08. 2020, 23:30:34 »
Jako cvičení to může být zajímavé, ale neřeší to nic.

Je to pomôcka. Pozrite si taký typescript, všetky types a interfaces  - všetko sa checkuje len v compile time, samotné behové prostredie javascriptu tie typy nepozná a v runtime sú tie typy teda úplne zbytočné. A ajtak ich používanie programátorom veľmi ulahčuje život a sú ochotní si tie classy a metódy otypovať aj keď je to práca navyše.

Kompilátor odhalí kopu chýb a editor ich používa ako metadáta aby vám zobrazil informáciu o tom parametre a nedovolí vám tam vložiť nesprávny literál. Už len to keď viete že môžete vložiť číslo od do je často veľká pomôcka. V dokumentácii sa také niečo stratí. Síce to neni 100ne nepriestrelné riešenie, ale je to riešenie v rámci možností.

Nevýhoda je, že to môže dať programátorovi pocit falošného bezpečia - všetko má svoje pre a proti.

140
Vývoj / Re:C++ stack vs heap.
« kdy: 09. 08. 2020, 23:07:26 »
Už som si niečo vygooglil:

Kód: [Vybrat]
auto chars = make_shared<vector<char>>(initializer_list<char>{'a', 'b', 'c'});

toto posledné sa mi až tak nepáči, neni nato ešte nejaká krajšia syntax?

Trochu odbočím. vector je jedna z tříd, které takřka nedává smysl alokovat na heapu tímhle způsobem. Za nějakých 15+ let programování v c++ jsem udělal "new std::vector..." asi tak jednou a to jsem dělal hodně velkou divočinu. "new vector", "new string" a podobně je celkem spolehlivý způsob jak identifikovat špatně přeučeného Javistu.

Ďakujem za vysvetlenie, teraz keď viem že buffer kontaineru sa alokuje v heape mi to už aj celé dáva zmysel (Nie som síce javista, ale používal som jazyky z podobného súdka ako Java)

A ďakujem Vám aj za ostatné odpovede, konečne v tom mám jasno. Toto presne som potreboval vedieť.

141
Vývoj / Re:C++ typ interval
« kdy: 09. 08. 2020, 22:22:59 »
...

Sorry, ale neni to to čo som hľadal. Včera o 3tej ráno som to už nepozeral, ale ja som hľadal compile-time kontrolu.

Kdybys napsal, že si jen tak hraješ, tak budiž, ale ty napíšeš takový nesmysl.

To je runtime test a měl bys to vidět na první pohled.

Možno by nezaškodilo pridať sem nejaké hodnotenie odpovedí ako na stackoverflow. Niektoré odpovede nemajú fakt žiadnu hodnotu. A potom tu vznikajú nekonečné flame wars o úplných malichernostiach.

Pozri na implementáciu std::array, tam by mala byť compile time kontrola na index do poľa pri operátore []

diky pozriem :)

142
Vývoj / Re:C++ typ interval
« kdy: 09. 08. 2020, 03:06:32 »
jednoduchy pokus:

#include <iostream>

template <typename T, int MIN, int MAX>
class Interval
{
public:
...

Wow, veľmi ti ďakujem :) ráno to vyskúšam.. Diky.

143
Vývoj / Re:C++ typ interval
« kdy: 08. 08. 2020, 20:37:43 »
A jak si představuješ, že by to mělo řešit ty skutečně zajímavé situace jako

Kód: [Vybrat]
hours foo = bar()

?

bar() je v jiném souboru. A výsledek závisí na I/O.

To by bola iba compile-time kontrola. Runtime checky tam nechcem tie si viem spraviť pomocou if-u a len tam kde ich naozaj potrebujem, keby boli runtime checky všade kde sa inicializuje, priraduje, alebo mení hodnota, tak by to zbytočne spomalovalo beh programu a to neni žiaduce.

Ale bolo by pekné aspoň to, keby ťa compiler, resp šikovné IDE v compile time upozornilo, že tam nemáš dávať nesprávny literál. Bola by to pomôcka pre programátorov. Kontextová nápoveda by ti tam zobrazila číslo od-do, aké tam môžeš priradiť. A ak by si tam priradil nesprávny literál, tak by ti to editor podčiarkol trebárs červenoou farbou, ako chybu, alebo by ti tú chybu vypísal kompilátor.

POZN: Vylepšená verzia by mohla robiť v debug móde aj runtime checking, ale release móde by sa takéto kontroly vypli kôli rýchlosti - ale to už by bolo pomocou šablón moc zložité.  Tak to fungovalo mimochodom aj v pascale a delphi pri type interval a tuším že ADA to tak má tiež.

V Pascale ak sa nezapli nejaké runtime checky to fungovalo nasledovne:

Kód: [Vybrat]
var
   a: 0..23;
begin
   a := 20; //ok
   a := 23; //ok
   a := a + 1; // ok aj keď číslo je mimo intervalu
   a := 24; // chyba

144
Vývoj / C++ typ interval
« kdy: 08. 08. 2020, 19:08:54 »
Dobrý deň, dala by sa v C++ napísať šablóna, ktorá by do základného typu povolila zádávať literály v intervale od do? Ide mi len o compile type kontrolu, runtime si spravím aj sám, ale bolo by pekné keby mi zadávanie (ne)správneho čísla odhalil už compiler / editor.

Typ interval mal aj pascal a delphi. Napr:

Kód: [Vybrat]
type
    SmallLatinLetters: 'a'..'z';
    Hours: 1..12;
    Minutes: 0..59;
    Byte: 0..255;

No a ja by som chcel template, ktorý by zabezpečil podobnú funkcionalitu aj v C++ a mohol by fungovať nejako takto:
Kód: [Vybrat]
typedef interval<int, 1, 12> hours;
hours a = 1; // ok
a = 5; // ok
a = 12; // ok
hours b = 13; // chyba
hours c = 0; //chyba
a = 15; //chyba

145
Vývoj / Re:C++ stack vs heap.
« kdy: 08. 08. 2020, 18:47:10 »
Se standardní knihovnou a initializer listem kratší syntax neuděláš, můžeš ale použít variadické šablony a udělat třeba tohle:
Kód: [Vybrat]
template <typename T, typename... Args>
std::shared_ptr<std::vector<T>> make_shared_vector(Args&&... args)
{
    auto vec = std::make_shared<std::vector<T>>();
    vec->reserve(sizeof...(Args));
    (vec->emplace_back(std::forward<Args>(args)), ...);
    return vec;
}

int main()
{
    auto vec = make_shared_vector<char>('a', 'b', 'c');
    return 0;
}
Tohle používá fold expression a potřebuje C++17, ale jsou možné i jiné varianty, tady najdeš víc možností, jak to udělat: https://tristanbrindle.com/posts/beware-copies-initializer-list

Diky. Tento adaptér vyzerá fajn.

Bude celý objekt vrátane toho memberu "objectMember" alokovaný na heape?
Ano, bude uvnitř toho objektu. Ta inicializace nemá na umístění vliv, je to jen syntax sugar, abys nemusel postaru psát inicializaci do konstruktoru.

Asi som sa nevyjadril jasne. Tým zápisom som nemyslel syntaktický cukor (inicializácia mimo konštruktoru), ale statickú vazbu. Member vytvorený bez operátoru new (make_shared, make_unique, alebo malloc) by mal vytvoriť objekt na stacku. Ale ak je celý objekt vytvorený na heape tak potom aj jeho member sa vytvorí na heape?

146
Vývoj / Re:C++ stack vs heap.
« kdy: 08. 08. 2020, 01:21:39 »
Už som si niečo vygooglil:

Kód: [Vybrat]
auto chars = make_shared<vector<char>>(initializer_list<char>{'a', 'b', 'c'});

toto posledné sa mi až tak nepáči, neni nato ešte nejaká krajšia syntax?

147
Vývoj / Re:C++ stack vs heap.
« kdy: 08. 08. 2020, 01:13:52 »
Ďakujem Vám za ozpovede, pomohlo mi to aby som sa v niektorých záležitostiach uistil a zorientoval. Ono teóriu okolo stacku a heapu relatívne dobre poznám, ale ajtak ma niektoré veci prekvapili.

Takže ešte raz by som sa chcel uistiť ak objekt alokujem na heape a jeho member "objectMember" som vytvoril takto:

Kód: [Vybrat]
class MyClass {
    vector<char> objectMember {'a', 'b', 'c'};
}

auto myObject = make_shared<MyClass>();

Bude celý objekt vrátane toho memberu "objectMember" alokovaný na heape?

Jo a pán Idris spomínal, že namiesto syntaxe:

Kód: [Vybrat]
shared_ptr<vector<char>> chars(new vector<char>());

je lepšie používať:

Kód: [Vybrat]
auto chars = make_shared<vector<char>>();

páči sa mi, že je to menej ukecané a že sa to dá použiť aj vo výraze, ale ako zapíšem napr toto:

Kód: [Vybrat]
shared_ptr<vector<char>> chars(new vector<char>{'a', 'b', 'c'});

148
Vývoj / C++ stack vs heap.
« kdy: 07. 08. 2020, 20:29:13 »
Dobrý deň. Keď vytvorím triedu / štruktúru na heape, ale jej členovia sú vytvorení statickým viazaním (mali by byť na stacku):

Kód: [Vybrat]
#include <memory>
#include <vector>
#include <string>

using namespace std;

struct BinData {
vector<char> content{'a', 'b', 'c'};  // statické viazanie
wstring contentType{ L"text/plain" };
};

class NejakaTrieda {
shared_ptr<BinData> binData; // binData je pointer teda ukazuje na heap ale kde je vytvorený jeho member content? na stacku či heape?
NejakaTrieda() : binData(new BinData()) {

}
};

shared_ptr<NejakaTrieda> nejakyPointerNaObjekt(new NejakaTrieda());


1. Kde sú teda dáta skutočne uložené?  Je celá trieda na jednom mieste?

Priznám sa že už som podobné fórum založil inde, ale ani tam som sa veľa nedozvedel.

Poradili mi aby som si to vyskúšal a odtestoval sám. Lenže po tých testoch mám viac otázok ako odpovedí. Napríklad som zistil že aj keď vector alokujem na stacku tak kontainer je síce na stacku ale buffer s položkami vyzerá byť na heape čo ma ešte viac matie.

2. načo sa teda vector vytvára na stacku? Keď jeho buffer je na heape? Je to kôli automatickému uvoľňovaniu pamate?

3. poradíte mi nejaký nástroj na prezeranie byteov pamate? Niečo ako keď si otvorím súbor len by som chcel aby to čítalo RAMku a mohol si zvoliť adresu v pamati atď.

149
Vývoj / Re:Windows API - typové aliasy
« kdy: 06. 08. 2020, 20:22:59 »
Win API metódy som obalil do tried a poriadne odtestoval a windows.h som presunul z hlavičkového súboru do implementačnej časti (*.cpp súbor).

Ďakujem za rady.

150
Vývoj / Windows API - typové aliasy
« kdy: 04. 08. 2020, 00:53:10 »
Ahojte pozerám dokumentáciu k windows API a všade sa používajú makrá a typové aliasy napr:

Kód: [Vybrat]
BOOL RegisterHotKey(
  HWND hWnd,
  int  id,
  UINT fsModifiers,
  UINT vk
);

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-registerhotkey

UINT = unsigned int - je to dlhší názov ale aspoň hneď na prvý pohľad viem o čo ide.
BOOL = int - nové C++ už má aj natívny bool takže ten budem preferovať
HWND = pointer asi na int? - handle window - ID okna keďže je to konzolová appka tak sem dám NULL alebo v modernom c++ nullptr - ktoré je bezpečnejšie

Otázka je mám používať natívne typy C++ alebo tieto neštastné aliasy od MS? Viem že to malo zmysel keď boli 16 a 32 bit windows tak jedným aliasom sa dalo stanoviť aký typ bude ten alias zastupovať ale dnes neviem či to ešte má zmysel? Ak áno tak aký?

Stran: 1 ... 8 9 [10] 11 12 ... 18