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 ... 6 7 [8] 9 10 ... 18
106
Vývoj / Discriminated unions v C++
« kdy: 21. 10. 2020, 23:09:51 »
C++ obsahuje únie, ktoré umožňujú na jedno miesto v pamäti uložiť rozličné typy. Práca s úniami je však krkolomná a všetko si musí ošéfovať porogramátor.

STL obsahuje typ std::variant. Ten má nevýhodu zas v tom, že nerozlišuje hodnoty podľa názvov tagu, ale podľa číselného indexu alebo typu. Taktiež nemôže obsahovať rovnaký typ označený odlišným tagom

Niekto si možno položí otázku načo potrebujem mať v únii rovnaký typ viac krát. Tak uvediem príklad:

Kód: [Vybrat]
type Currency =
| USD of decimal
| EUR of decimal
| BTC of decimal
| Another of (currencyName : string) * decimal
| None

let toUSD (value : Currency) =
     match value with
     | USD val -> val
     | EUR val -> val * usdEurCourse
     | BTC val -> val * usdBtcCourse
     | _ -> failwith "Unsupported currency"

let comodityMarketsValues = Map [
      "Gold", USD(5.75M)
      "Platinium DAX", EUR(5.23M)
      "FSTE Oil", Another("GBP", 1023.22M)
]

let comodityMarketsValuesInUSD = comodityMarketsValues |> Map.map(fun key value -> value |> toUSD)

Neviete o niečom takom aj pre C++? Ideálne keby to bolo súčasťou STL alebo Boostu.

107
Vývoj / Re:Type trait na zistenie stringových typov
« kdy: 19. 10. 2020, 21:13:35 »
https://stackoverflow.com/questions/8097534/type-trait-for-strings

Ďakujem to je presne ono...  Len to musím použiť na všetky typy charov.

Pokud děláš logger ze studijních důvodů, tak nic proti tomu.

Pokud děláš logger, který máš v plánu použít v nějakém produkčním kódů, tak to silně nedoporučuju, je to obtížnější úloha, než jak na první pohled vypadá. V takovém případě bych doporučil použít nějaké hotové řešení, např. boost log nebo glog.


Ďakujem pozriem.

108
Vývoj / Type trait na zistenie stringových typov
« kdy: 18. 10. 2020, 23:22:48 »
Potreboval by som type trait, ktorý by dokázal detekovať akýkoľvek bežný stringový typ

Type trait na detegovanie potomkov std::basic_string<T> už mám.

ale k tomu musím pridať aj detekovanie char*, unsigned char*, wchar_t*, u8char_t* a potom aj varianty s arrayom wchar_t[], char[], ... a samozrejme a pre všetky typy aj varianty s const a bez const. Viete o niečom takom?

S pomocou googlenia by som si taký trait dokázal napísať aj sám. Ale budem preferovať hotové riešenie.

Robím si logger (do jedného projektu), takže na to to potrtebujem.

109
Studium a uplatnění / Re:Start Java programování
« kdy: 14. 10. 2020, 15:04:29 »
Síce Javu nenávidím, ale kvôli tomu že som na VŠ mal predmet kde bola Java, tak mám knihu Mistrovství Java od Herbert Schildt, a myslím že to sa celkom dá.

Osobne Javu (rovnako ako PHP) neodporúčam ani nepriateľovi.

Chápem keď niekto nemá rád PHP, ani ja ho nemám rád, aj keď som ho (nechtiac) používal niekoľko rokov, ten jazyk bol pôvodne navrhnutý ako template engine a preto je ukecaný a niektoré konštrukcie sú priam otrava, nehovoriac o nekonzistenciách v "ekosystéme"... ale čo je zlé na Jave?

Zaujímali by ma konkrétne výhrady voči jave alebo teda aspoň nejaké argumenty prečo je java podľa teba zlá

111
Vývoj / C++ STL/Boost špeciálny map
« kdy: 14. 10. 2020, 00:06:50 »
Ahojte STL a aj Boost má rôzne druhy kontainerov - fakt od výmyslu sveta. Ich používanie je vďaka iterátorom veľmi príjemné. Neviete mi poradiť či neexistuje niečo ako obojstranný map<K, V> pri, ktorom si ale viem prehodiť strany kľúč hodnota..? Obidve strany budú naindexované a ja si pri každej akcii vyberiem ktorú stranu chcem brať ako kľúče a ktorú ako hodnoty?

112
Vývoj / Re:Ako ukladáte binárne dáta a texty v C++?
« kdy: 04. 10. 2020, 00:21:43 »
pouzij klasicke C-like ukladanie:

char[] pole = {0x01, 0x02, 0x03}
char* string = "\x0A\x0D\0x61\x00";

Jo aj to je tiež jedna z možností (pohľadu pamate najšetrnejšia) a tiež ju z času na čas používam. Ale na niektoré use cases by som chcel niečo flexibilnejšie.

Na binární data bych použil délku+posloupnost bajtů. Pokud tě trápí 6 bajtů kvůli dvěma znakům, můžeš tu délku zakódovat třeba do UTF-8. Do 127 bajtů tak budeš mít režii pouze 1 bajt.

Pro praktické účely bych však sáhl po SQLite, které tohle vše má už v sobě a řeší i modifikace. Pokud to má být přenositelné, tak bych pro texty a čísla použil XML.

Asi sme si neporozumeli. Neviem či som otázku položil dostatočne zrozumiteľne, aj keď pripúšťam že slovo "ukladať" mohlo pôsobiť mätúco. Otázka sa týkala typu premennej pre ukladanie hodnôt v pamäti, náhrada za klasický C++ string, zaujímalo ma aké typy zvyknú C++ programátori používať pre ukladanie binárnych dát (v pamäti), nehľadal som databázu, persistentné úložisko ani formát serializácie či výmeny dát. Ono aj do toho SQL lite alebo XML musíte tie dáta nejakým spôsobom dostať a na to potrebujete premennú a o jej typ mi teraz ide.

Je to vpodste skôr taká všeobecná debata. Zaujíma ma aké sú bežne používané postupy v tomto jazyku.

113
Vývoj / Ako ukladáte binárne dáta a texty v C++?
« kdy: 03. 10. 2020, 21:34:20 »
Dobrý deň, C++ ukladá textové dáta v std::string-och čo je wrapper nad char*, no keďže tieto stringy sú null terminated, nie sú vhodné na ukladanie binárných dát (ale aj textov z iných vývojárskych platforiem), ktoré môžu obsahovať aj znak '\0'. Takže na bežné účely používam std::string a std::wstring, ale na špeciálne účely je potrebné použiť iný typ.

Aké úložisko sa teda podľa Vás hodí na ukladanie všetkých ASCII znakov?

Ja som používal:

Kód: [Vybrat]
typedef std::vector<char> bineries;

Čo je vlastne pascal-like spôsob. Lebo reťazec sa neukončujeme žiadnym znakom, ale si bokom uložíme jeho velkosť a podľa toho vieme kde končí buffer so znakmi. Nevýhoda je že na ukladanie veľkosti stringu spotrebujeme 4 znaky (typ int). A ak má string dajme tomu 2 znaky tak je to veľmi nešetrné. Teraz som si, ale uvedomil že možno skôr std::vector<unsigned char> zodpovedá tomu čo očakávame od takéhoto poľa znakov. Pretože keď si pozrieme ascii tabuľku, tak v nej nevidíme znaky s mínusovým poradovým číslom. Z pohľadu aplikácie je to síce jedno, ale ešte som nevidel ASCII tabuľku ktorá by nebola indexovaná od nuly.

A potom mám ešte:

Kód: [Vybrat]
typedef std::vector<wchar_t> wbinaries;

pre 16bit wide chars. Teda pre texty, ktoré sú multibyte, no zároveň nechceme aby boli ukončované znakom '\0'.

Okrem toho sa na binárne dáta hodia aj streamy.

Takže otázka... aký typ používate vy (v C++) na ukladanie binárnych, alebo textových dát, bez obmedzení klasického stringu?

114
Vývoj / Re:Nim
« kdy: 27. 09. 2020, 22:17:10 »
Zdravím. Vcelku nedávno jsem narazil na zajímavý programovací jazyk Nim. Syntax podobná Pythonu, rychlost se blíží k céčku (v porovnání s Pythonem rozhodně). Transpilace do C a JS, popřípadně C++ a ObjC (aby se daly pro ně psát knihovny/použít je?). Zajímavé syntaktické cukry. Problémem je že není moc rozšířený.

Co si o něm myslíte?

Neskúšal som ho ale vyzerázaujímavo. Po Boo ďalší jazyk inšpirovaný python syntaxou.

Btw ďalší jazyk z tohto súdka je crystal ten je pre zmenu inšpirovazný jazykom Ruby: https://crystal-lang.org/ a tiež sa kompiluje do C.

Tých jazykov je už naozaj veľa, ale vačšina z nich ide len cestou evolúcie. Ich autori sú málo odvážni na to aby priniesli niečo nové nejaké revolučné myšlienky úplne iný nový revolučný spôsob vývoja.
Zajímalo by mě, co si představujete pod Revolučním programovacím jazykem

Jazyk alebo technológia, ktoré prinášajú úplnú zmenu v myslení, alebo v prístupe k vývoju softwaru. Príklady:

- Smalltalk, alebo ešte revolučnejšiu Self (vývojové prostredie, image, posielanie správ, prototypové OOP, sloty a reflexia).

- Erlang ktorý priniesol actory

- Veľmi revolučná zmena bolo aj vizuálne a komponentové programovanie, ktoré v sebe skombinovalo Delphi. Delphi je už síce (polo)mŕtve, ale komponentové a aj vizuálne programovanie stále žije. Taký Unreal Engine 4 je celý postavený na jadnej strane na komponentách a na druhej strane na Actoroch a kód sa dá napísať buď v editore, alebo naklikať myškou (Blueprints) vo vizuálnom návrháre (ja som konzervatívny prefereujem to písanie kódu v C++). Rovnako tak aj JS frameworky ako React a VUE sa inšpirovali komponentovým prístupom, ale pridali k tomu ešte reaktivitu a objektovú paradigmu vymenili za funkcionálnu.

- A ďalšia veľká revolačná zmena v programovaní bude podľa mňa živé programovanie - live coding. Nedávno som videl demo video a bolo to úchvatné... Niečo na štýl HMR z webpacku, ale omnoho pokročilejšie. Na jednej obrazovke ste písali kód a na druhej ste pozorovali živé zmeny úpkne bez ukladania. Žiaľ názov tej technológie si už nepamatám.

115
...

Ďakujem za vysvetlenie. Aj som si aj intuitívne myslel, že je to kôli tomu.

Mrkni na SetWindowLongPtr() - pomocí této funkce si můžeš asociovat data s HWND, v callbacku si je vytáhnout, a pak je použít.

Hej našiel som to na tom odkaze zo stackoverflow, čo som sem včera linkoval,  už to mám aj naprogramované, ale ajtak dik.

Citace
Niečo tam mám evidentne zle ale ani za svet nedokážem prísť na to že čo.

nóó budu citovat mistra  ;D ;D ;D ;D ;) ;)
Citace: Jendа, https://www.abclinuxu.cz/poradna/programovani/show/459486#9
Doporučuju používat nějaký hustý kompilátor (třeba rozumně nové gcc) se zapnutými všemi warningy (tohle bylo -Wall -Wextra -Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wrestrict -Wnull-dereference -Wjump-misses-init -Wdouble-promotion -Wshadow -Wformat=2)
takže třeba s hustým g++ 10 to dopadne takle nějak a už je aspoň jakoby čeho se chytit ;) ;)
Kód: [Vybrat]
g++-10 -Wall -Wextra -Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wrestrict -Wnull-dereference -Wdouble-promotion -Wshadow -Wformat=2 fortranuvZdrojacek.cpp
In file included from /usr/include/c++/10/functional:59,
                 from fortranuvZdrojacek.cpp:3:
/usr/include/c++/10/bits/std_function.h: In instantiation of ‘_Functor* std::function<_Res(_ArgTypes ...)>::target() [with _Functor = int(int); _Res = int; _ArgTypes = {int}]’:
fortranuvZdrojacek.cpp:42:49:   required from here
/usr/include/c++/10/bits/std_function.h:649:9: error: invalid use of ‘const_cast’ with type ‘int (*)(int)’, which is a pointer or reference to a function type
  649 |  return const_cast<_Functor*>(__func);
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~

zkrátka žádej legální software kvalitní kompilátor misto tamtoho nějakýho divnýho microsoft visual studia. a to i na zdrojáčky který nepišeš pod linuxem ale pod win ;D ;)


Ďakujem za tip. G++ si chcem rozbehať priamo vo Visual Studiu 2019. Ale momentálne používam MSVC compiler a Clang, lebo tie má Visualko by default. MSVC má fakt strašne neadresné chybové hlásenia. Ale keď som použil CLang, tak na tom bol možno ešte horšie. GCC/G++ používam keď kompilujem nejakú statickú libku tretej strany, ktorá používa makefile, kompilujem to pod WSL(ubuntu) a potom si do MSVC projektu, len pridám cestu k includes. Takže vlastne používam všetky 3 compilery. Ale čo sa velkosti výstupu týka, tak naozaj to MSVC je katastrofa pred chvíľkou som kompiloval jednu libku - boost::di (IoC kontainer pre C++) a stačí porovnať rýchlosť kompilácie a veľkosť výstupu všetkých troch compilerov https://github.com/boost-ext/di#:~:text=Run%20this%20example%20on%20Wandbox. Microsoft svoj kompiler úplne odflákol.

Btw plánujem tú appku prepísať aj do linuxu, ale niektoré časti ktoré sú naviazané na OS bude treba prepísať úplne celé, ale celkom sa na to teším aspoň sa niečo nové naučím, preto som ani nepoužil Qt ktoré obsahovalo to čo vyvýjam.

Každopádne začal som Windowsom pretože s programovaním pre Windows mám najviac skúseností a potom prejdem na linux.

A keď už ste spoemnuli to GCC, ktoré IDEčko používate na C++ vývoj prod linuxom? Môže byť kludne aj komerčné. A neviete o nejakom IDE, ktoré zvýrazňuje korektne aj moduly z C++ 20?  Lebo MSVC compiler síce moduly podporuje a dokáže projekt obsahujúci moduly skompilovať (dnes som to skúšal). Ale editor IDEčka sa správa ako keby žiadne moduly v C++ neexistovali, pritom som ich zapol aj v konfigurácii projektu (Enable C++ Modules: Yes (/experimental:module)) ale na editor to nemalo absolútne žiaden vplyv.

116
Vývoj / Re:Nim
« kdy: 27. 09. 2020, 02:50:58 »
Zdravím. Vcelku nedávno jsem narazil na zajímavý programovací jazyk Nim. Syntax podobná Pythonu, rychlost se blíží k céčku (v porovnání s Pythonem rozhodně). Transpilace do C a JS, popřípadně C++ a ObjC (aby se daly pro ně psát knihovny/použít je?). Zajímavé syntaktické cukry. Problémem je že není moc rozšířený.

Co si o něm myslíte?

Neskúšal som ho ale vyzerázaujímavo. Po Boo ďalší jazyk inšpirovaný python syntaxou.

Btw ďalší jazyk z tohto súdka je crystal ten je pre zmenu inšpirovazný jazykom Ruby: https://crystal-lang.org/ a tiež sa kompiluje do C.

Tých jazykov je už naozaj veľa, ale vačšina z nich ide len cestou evolúcie. Ich autori sú málo odvážni na to aby priniesli niečo nové nejaké revolučné myšlienky úplne iný nový revolučný spôsob vývoja.

117
Jo a to pribalovanie dát som si práve vygooglil:

https://stackoverflow.com/questions/18161680/how-do-i-stdbind-a-non-static-class-member-to-a-win32-callback-function-wnd#18162974

Na tento konkrétny prípad sa to hodí.

Ale môžu nastať aj iné podobné situácie kde sa to už hodiť nemusí. (Napr pri hookoch LowLevelKeyboardProc) Preto som hľadal čo najvšeobecnejšie riešenie. Prvé ma napadlo použiť labdu s captures, lenže tá neni kompatibilná s pointerom na funkciu. ďalej som skúšal použiť std::bind (a tiež std::mem_fun), tie fungovali, ale tiež neboli kompatibilné s C-čkovým pointerom na funkciu ale len s C++osvým std::function.

Takže pre C-čkový pointer na funkciu všeobecné riešenie asi ani neexistuje (mimo použitia static). Ja sa snažím čo najviac využívať moderné konštrukcie z C++ ale pri RegisterClass to žiaľ nejde. Ale aspoň som sa dnes niečo nové naučil aj o C-čkových typoch.

118
Ano, target ti vrátí nullptr. Ze std::function se function-pointery nevyrábějí. Pokud ho potřebuješ, tak použij klasickou funkci.

Ahoj a nevedel by si mi prosím poradiť ako na miesto kde sa očakáva typ:

Kód: [Vybrat]
typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);

vložiť (bindnúť alebo také niečo) ešte jeden parameter? Potrebujem tam dostať inštanciu triedy ktorá WNDPROC obaluje.  Keďže sa tam vyžaduje Cčkový pointer na funkciu nemôžem tam použiť std::bind (resp ani boost::bind)

Momentálne to riešim cez static. Zatiaľ mi to stačí, ale chcel by som mať možnosť vytvoriť viac inštancíi a každú predať ako parameter do WNDPROC (WNDPROC musí byť static).

Žiaľ toto je asi prvý vážnejší zákys v C++ na, ktorý nie a nie nájsť riešenie. A možno je to riešenie aj veľmi jednoduché, len mi chýba nejaká podstatná znalosť. Preto sa to snažím vyriešiť štandartným spôsobom. Viem, že by sa dala vytvoriť std::map a v nej indexovať jednotlivé inštancie podľa HWND, ale ja sa chcem naučiť ako sa to robí normálnym spôsobom, nie cez nejaké obskurné hacky.
RegisterClass má parametr pro alokaci paměti navíc nad rámec windowsí struktury. Tam se dají předat uživatelská data. Spíše než přímo std::function bych tam dal ukazatel na funktor, ať se snáze spravuje paměť. Takový funktor pak může obsahovat std::function nebo mít kód přímo v přetíženém operátoru ().

Tak to sme sa asi nepochopili.

Keby sa dal do štruktúry určenej pre funckiu RegisterClassEx (WNDCLASSEXW) vložiť typ std::function tak mám po probléme, std::function je veľmi flexibilný a viem ho nabindovať, ale ten už potom neviem skonvertovať na typ WNDPROC. S C++ funckionálny typom nemám najemnší problém žiaľ tento typ neni kompatibilný s Cčkovým pointerom na funkciu. std::function sa tam vložiť žiaľ nedá (alebo rbím niečo zle???) ak by ste poznali spôsob ako do typu WNDPROC vložiť std::function alebo pointer na funktor tak sem s ním - budem len rád. Ja mám, ale pocit že ani jedno ani druhé nejde. Lebo googlil som o tom dnes niekoľko hodín skúšal som všetky možné spôsoby a nič relevantné som nenašiel. Práca s C typmi je značne obmedzená. C++ typy sú o dosť vpredu, ale keďže WinAPI je napísané v C a s konverziami sú problémy, tak si moc nepomôžem.

Ak by ste, ale vedeli ako tam dostať std::function alebo funkctor tak Vás poprosím o príklad. Možno že na to idem zle.

Kód: [Vybrat]
auto szWindowClass = L"ClipboardListener";
auto wndClass = WNDCLASSEXW{};
wndClass.cbSize = sizeof(WNDCLASSEX);
wndClass.lpfnWndProc = ClipboardListener::WndProc; //staticka metoda
wndClass.hInstance = GetModuleHandle(nullptr);
wndClass.lpszClassName = szWindowClass;
if (!RegisterClassExW(&wndClass))

 skúsim tam vložiť custom dáta. tak ako ste mi radili ale tiež si myslím že ten functor by bolo čistejšie riešenie (a viem si tam pribaliť hocičo) takže ak by to bolo predsa len možné tiež by som ho prefereoval.

POZN typ WNDPROC: typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);

119
Ano, target ti vrátí nullptr. Ze std::function se function-pointery nevyrábějí. Pokud ho potřebuješ, tak použij klasickou funkci.

Ahoj a nevedel by si mi prosím poradiť ako na miesto kde sa očakáva typ:

Kód: [Vybrat]
typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);

vložiť (bindnúť alebo také niečo) ešte jeden parameter? Potrebujem tam dostať inštanciu triedy ktorá WNDPROC obaluje.  Keďže sa tam vyžaduje Cčkový pointer na funkciu nemôžem tam použiť std::bind (resp ani boost::bind)

Momentálne to riešim cez static. Zatiaľ mi to stačí, ale chcel by som mať možnosť vytvoriť viac inštancíi a každú predať ako parameter do WNDPROC (WNDPROC musí byť static).

Žiaľ toto je asi prvý vážnejší zákys v C++ na, ktorý nie a nie nájsť riešenie. A možno je to riešenie aj veľmi jednoduché, len mi chýba nejaká podstatná znalosť. Preto sa to snažím vyriešiť štandartným spôsobom. Viem, že by sa dala vytvoriť std::map a v nej indexovať jednotlivé inštancie podľa HWND, ale ja sa chcem naučiť ako sa to robí normálnym spôsobom, nie cez nejaké obskurné hacky.

120
Ach jaj ten druhý odkaz je ten istý čo prvý... opravujem to... malo tam byť toto: https://pastebin.com/7FFks1y1

Kód: [Vybrat]
#include <iostream>
#include <vector>
#include <functional>
 
template<typename T>
void dump(std::vector<T> keys)
{
    std::wcout << L"Keys: [";
    auto isFirst = true;
    for (auto key : keys)
    {
        std::wcout << (isFirst ? L"" : L", ") << key;
        isFirst = false;
    }
    std::wcout << L"]" << std::endl;
}
 
template<typename T1, typename T2> using Mapper = T2(*)(T1 item);
 
template<typename T1, typename T2>
std::vector<T2> map(const Mapper<T1, T2> mapper, const std::vector<T1> vec)
{
    std::vector<T2> result;
    for (T1 x : vec)
    {
        result.push_back(mapper(x));
    }
    return result;
}
 
using namespace std::placeholders;
auto func = [](int n, int m)
{
    return n * m;
};
 
int main()
{
    auto multiplier = 5;
    std::function<int(int)> boundMapper = std::bind(func, _1, multiplier);
    auto mapper = *boundMapper.target<int(int)>();
    auto list = map<int, int>(
        mapper,
        { 1, 2, 3 }
    );
    dump<int>(list);
}

Stran: 1 ... 6 7 [8] 9 10 ... 18