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] 2 3 ... 12
1
Software / Re:RIM OS 10
« kdy: 29. 11. 2020, 22:58:39 »
Ahá tak pozerám že nie som prvý koho to napadlo https://forums.crackberry.com/general-blackberry-news-discussion-rumors-f2/make-bb-os-os-10-open-source-1168675/  :D
 
Problém je s tým že OS QNX je stále používaný :/ takže môj nápad bol veľmi naivný.

2
Software / Re:RIM OS 10
« kdy: 29. 11. 2020, 22:46:12 »
K 31.12.2019 OS 10 asi definitivně zařízli. Poslední telefon na tom OS uvedli na jaře 2015 (BB Leap) a další už jsou na Androidu. Škoda, také mi OS10 vyhovuje a řeším kam se hnout z dodělávajícího BB Classic.

Ďakujem za odpoveď. Škoda mohli ten OS dať k dispozícii aspoň, pre arm dosky, idem napísať do Blackberry že či ten OS nechú dať k dispozícii aspoň pre komunitu nadšencov. Aj keď pochybujem že mi odpíšu :D Lebo je to naozaj pekný moderný OS s designovo pekným rozhraním.

3
Software / RIM OS 10
« kdy: 29. 11. 2020, 21:53:34 »
Ahojte chcem sa opýtať ako dopadol vývoj RIM OS 10. Ešte sa niekde používa, alebo jeho vývoj BB úplne zastavil? Kedysi som mal jedno zariadenie s týmto OS od Blackberry vlastne ho ešte mám niekde odložené aj keď baterka je už asi pokazená, resp polofunkčná. Ten OS mi prišiel ako zaujímavá alternatíva k Androidu. Užívateľské rozhranie bolo veľmi pekné prívetivé dotykové. A pod kapotou to malo zaujímavý podvozok: Unixový OS QNX mikrojadrom a s rôznymi vymoženosťami, ktoré nemá Linux ani Windows a konkurovať mu z časti môže len Mac OS. Dá sa tento OS niekde stiahnuť. V poslednej dobe sa hrám s rôznymi ARM boardmi dalo by sa niečo také na nich rozbehnúť? Napríklad teraz mám v pláne urobiť jeden audiosystém s elaktrónkovým zosilovačom chcem tomu spraviť dotykový display a tam by sadol takýto systém s dotykovým ovládaním ako riť na šerbel. Prípadne poradte ešte nejaký iný zaujímavý OS alebo dotykové rozhranie na linux. Linux je síce fajn ale taký Raspbian alebo Armbian sa na ovládanie prstami moc nehodí.

4
Vývoj / Re:Pár otázok na C++
« kdy: 21. 11. 2020, 14:56:04 »
Teda mě přijde, že když vkládáš \n, tak bych očekával platformově závislé chování. A když chci platformově nezávislé, tak budu dávat \x0D, \x0D\x0A, \x0A. A ano, jsem si vědom toho, že to není úplně übr logické, ale skutečně to tak vnímám.

\r = \x0D
\n = \x0A

Či do texťáku vložíš \n alebo \x0A je úplne jedno (je to to isté) STL ti tam (na platforme windows) namiesto \x0A práskne \x0D\x0A (skúšal som to pre istotu). Ono v retazci máš uložené naozaj len \n (resp \x0A) ale wofstream ti pri ukladaní do súboru pridá pred \n aj \r.

Citace: Jenda
...

Ďakujem vyskúšam. Porovnám s mojim riešením. :)

Citace: registrovany_ava
...

jo tiež sa snažím predalokovať velkosť (ak sa to dá), ale nie vždy sa to dá.

Citace: Wrána
prej to funguje i vobráceně :o :o jakože když soubory pak bude ifstream číst v textovým režimu tak zase ty platform specific zakončovadla bude nahrazovat jenom vobyč '\n' :o ;)

nóó takže jestli jako nějak nestěhuješ ty vyrobený soubory mezi různejma platformama tak by to jako nemuselo vadit moc že si tam ve win bude připisovat ty '\r' :) ;)

Ale môžu nastať aj situácie kedy chceš mať možnosť voľby medzi \n a \r\n napríklad ak by si programoval editor, alebo konvertor. Preto ma zaujíma či má tento problém nejaké jednoduché riešenie. Neni to pre mňa teraz otázka života a smrti :D, ale raz možno bude. Robím si totiž takú sadu helperov nad STL a tie chcem mať podľa možnosti čo najuniverzálnejšie.

5
Vývoj / Pár otázok na C++
« kdy: 20. 11. 2020, 23:30:05 »
Ahojte mám pár otázok na STL. Ako donútiť ofstream aby namiesto \n nevkladal platformovo špecifické konce riadkov?

Keď do textového súboru (na platforme windows) ukladám \n, vloží sa automaticky \r\n teda namiesto 1 znaku vloží 2 ASCII znaky (0x0D 0x0A) niekto si povie, že riešim hovadiny, ale ja chcem mať kontrolu nad tým čo ukladám a u tak low level jazyka ako C++ človek očakáva že v základnej knižinici nebude podobná mágia (volitelne nech tam kludne je, ale rád by som mal možnosť to ovplyvniť, chcem aby keď aplikáciu preportujem na linux tak bude mať jednotné na vlas rovnaké chovanie s windows verziou). Viete mi poradiť ako by sa to dalo ovplyvniť? viem že v režime binary to bude ukladať korektne (znak \n ako \n) akurát neviem či mi pri binárnom móde bude fungovať aj ofstream.imbue(znaková sada).

Vopred ďakujem za tipy.

A keď už som založil toto fórum tak sa opýtam aj ďalšiu vec. V C# a Jave existuje trieda StringBuilder určená na spájanie veľkých reťazcov. Mala by ušetriť performance keďže v .NETe sú reťazce immutable a string builder je mutable.

Čo sa používa na spájanie reťazcov v C++? Bude std::string.append dostatočne efektívne aj keď budem spájať dajme tomu 100000 reťazco? Keďže v C++ sú reťazce mutable asi by to nemal byť problém nie? Na stackoverflow programátori odporúčajú na spájanie reťazcov std::stringstream čo je fajn objekt (aj ho občas použijem) ale niekde som čítal že má horší performance. Viem že najlepšie bude alokovať pamať a do pointeru pridať znaky priamo. Ale to je náchylné na chyby hlavne keď sa pracuje s wchar_t alebo inými charmi tak treba prerátavať velkosť a myslieť na znak \0 atď. Takže priamej práci s pamaťou sa chcem podľa možnosti vyhnúť (ak to neni nevyhnutné) a použiť ho len vo výnimočných prípadoch tam kde sa naozaj šetrí každá pikosekunda.

A keď už sme pri tom meraní efektivity čo používate na jej meranie?

1. Používate nejaký vlastný benchmark postavený na std::high_resolution_clock pustené v cykle?

2. alebo profiler?

3. Alebo nejaký špeciálny benchmark?  Ja som našiel toto: https://github.com/chronoxor/CppBenchmark a toto https://github.com/google/benchmark má to cenu kompilovať?

6
Vývoj / Re:Discriminated unions v C++
« kdy: 25. 10. 2020, 15:20:40 »
Konečne som sa zase dostal k C++ idem si teda prejsť aj Vaše odpovede a vyskúšam príklady čo ste sem poslali. Minule tu niekto písal že typ variant môže uložiť aj hodnoty rovnakého typu a mal pravdu (takže to čo som napísal v prvom poste že variant nemôže obsahovať rovnaký typ bol omyl spôsobený mojou nepozornosťou). Takže pomocou typu variant sa dajú nasimulovať aj discriminated unions. Včera v noci som to skúšal. Ako ste tu spomínali pattern matching síce C++ nemá, ale nahradil som ho obyčajným switchom a ten prvý príklad som prepísal takto: https://pastebin.com/CFykWbWQ resp aj nižšie, ale na pastebin je syntax highlighter, takže sa to lepšie číta.

Kód: [Vybrat]
#include <iostream>
#include <variant>
#include <vector>
#include <map>
#include <algorithm>
#include <iterator>

// operator pre vypisani mapy
template <typename K, typename V>
std::ostream& operator<<(std::ostream& out, const std::map<K, V>& vec)
{
out << "vector<T>[";
auto delimiter = false;
for (const auto& item : vec)
{
if (delimiter = true)
{
out << ", ";
}
out << item.first << ": " << item.second;
}
out << "]";
return out;
}

const auto usdEurCourse = 1.19;
const auto usdBtcCourse = 0.000076;

typedef std::tuple<std::string, double> AnotherTuple;

typedef std::variant<
/*USD*/ double,
/*EUR*/ double,
/*BTC*/ double,
/*Another*/ AnotherTuple
> currency;

enum
{
USD,
EUR,
BTC,
Another
};

auto comodityMarketsValues = std::map<std::string, currency>{
{ "Gold", currency{ std::in_place_index<USD>, 5.75 } },
{ "Platinium DAX", currency{ std::in_place_index<EUR>, 5.23 } },
//{ "FSTE Oil", currency{ std::in_place_index<Another>, AnotherTuple{ "GBP", 1023.22 } } },
};

double toUSD(currency curr)
{
switch (curr.index())
{
case USD: return std::get<USD>(curr);
case EUR: return std::get<EUR>(curr) * usdEurCourse;
case BTC: return std::get<BTC>(curr) * usdBtcCourse;
default: throw std::runtime_error("Unsupported currency");
}
}

int main()
{
std::map<std::string, currency> comodityMarketsValuesInUSD;

std::transform(
comodityMarketsValues.begin(),
comodityMarketsValues.end(),
std::inserter(comodityMarketsValuesInUSD, comodityMarketsValuesInUSD.begin()),
[](std::pair<std::string, currency> nameCurrPair) -> std::pair<std::string, currency>
{
return std::pair<std::string, currency>(
nameCurrPair.first,
currency{ std::in_place_index<USD>, toUSD(nameCurrPair.second) }
);
}
);
}

Niekto ste tu spomínal, že sa tomu nehovorí discriminated unions, ale variant. Mne na až tak nezáleží na názvosloví (v každom jazyku sa to volá trošku inak, C++ má na veľa jazykových prvkov vlastné názvy). Ide o to aby som dosiahol v praxi podobný efekt.

Ale ajtak Discriminated Union mi príde celkom výstižný názov. Lebo v OCAML sa tým tagom hovorí discriminator. A historicky discriminated unions vychádzajú z únií. Ale na githube som videl aj názvy tagged union. V každom prípade sú to algebraické dátové typy. std::variant dokáźe to isté, len má o niečo menej prehľadnú syntax (nevidím na prvý pohľad aký tag je priradený ku ktorému typu) a treba si trošku pomôcť enumeráciami ako vidím aj vo Vašich príkladoch.

Ďakujem aj Baloun echo_zulu, Wrána diskuse a ďalším za príklady, idem si ich teraz prejsť a vyskúšať a som zvedavý akým spôsobom sa líša o môjho príkladu.

7
Vývoj / Re:Discriminated unions v C++
« kdy: 23. 10. 2020, 23:56:58 »
Dobrý deň, ďakujem Vám za odpovede. Zatiaľ som ich preletel len veľmi rýchlo. Zajtra si ich prečítam a poodpisujem. (Doteraz som kôli práci nestíhal).

Len v skratke: viem, že existuje viacero spôsobov, ako niečo podobné docieliť a tiež viem, že sa to dá spraviť aj flexibilnejšie. Bol to len príklad, ktorý ma v rýchlosti napadol pre vysvetlenie aby ste pochopili ako to funguje a čo vlastne v C++ hľadám. Sú veci na, ktoré sa discriminated unions hodia. Už len taký typ option(v haskelli sa mu hovorí maybe) je discriminated union:

Kód: [Vybrat]
type Option<'t> =
| Some of 't
| None

alebo si môžete nadefinovať typ:

Kód: [Vybrat]
type LoginResult =
| Auth of {| Uid : int64; Login : string; Password : string; FirstName : string; Roles : Roles; Profile : Profile |}
| InvalidField of int * string * string
| Error of int * string

A vyhnete sa tak používaniu výnimiek

alebo si môžete vytvoriť rekurzívnu discriminated union

Kód: [Vybrat]
type MultiTree<'a> =
| Leaf of 'a
| Node of MultiTree<'a> list

prípadne

Kód: [Vybrat]
type ast =
| Nil
| Unit
| Identifier of string
| IdentifiersPath of string list
| Block of ast list
| ExprList of ast list
| Root of ast list
...

Pointa je, že by som potreboval niečo, čo sa vzdialenie podobá na úniu z Ocaml, dá sa do nej vložiť napríklad aj viacero typov, ale nechcem aby únia rozlišovala hodnoty podľa typu, ale podľa tagu.

S tým zadrátovaním máte pravdu, tento príklad by som v praxi aj ja riešil inak.

Že sa niečo v Ruste dá riešiť elegantnejšie viem. Rust je veľmi pekný jazyk. Ja tiež používam jazyky z rodiny ML, ktoré sú ideálne na rýchly vývoj aplikácií a v ktorých je radosť programovať, ale C++ baví z viacerých dôvodov (je univerzálne, je rozšírené, dá sa tam hrať z detailami a optimalizovať, je to hlavný jazyk pre Unreal Engine, je to jazyk orientovaný na rýchlosť, nič pred programátorom neskrýva atď). Ale máte pravdu, že má aj veľa nedostatkov.

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

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

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

11
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á

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

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

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

Stran: [1] 2 3 ... 12