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.


Témata - fortran1986

Stran: 1 2 3 [4] 5 6 ... 8
46
Vývoj / C++ inicializácia immutable typov
« kdy: 09. 12. 2020, 01:04:55 »
Na úvod len spomeniem že používam najnovšiu verziu C++ kompilátr čisatočne podporuje C++ 20, ktorá ešte tuším ani neni hotová, ale niektoré časti normy sú už známe a všetky najrzšírenejšie C++ kompilátory ju do určitej miery podporujú... To čo tu rozoberám je súčasťou C++ 20... a teraz k veci.

Mám takýto typ:

Kód: [Vybrat]
struct FileTimesInfo
{
const __time64_t LastAccessTime;
const __time64_t LastModificationTime;
const __time64_t LastStatusChangeTime;
};

ktorý vieme inicializovať takto (namiesto núl si tam doplnte hodnoty aké chcete):

Kód: [Vybrat]
auto ti = FileTimesInfo{ .LastAccessTime = 0, .LastModificationTime = 0, .LastStatusChangeTime = 0 };

keď ale typu pridám nejaký konštruktor napr.

Kód: [Vybrat]
struct FileTimesInfo
{
const __time64_t LastAccessTime;
const __time64_t LastModificationTime;
const __time64_t LastStatusChangeTime;

FileTimesInfo(struct _stati64 stat) :
LastAccessTime(stat.st_atime),
LastModificationTime(stat.st_mtime),
LastStatusChangeTime(stat.st_ctime)
{
}
};

Tak sa dá inicializovať len cez ten nadefinovaný konštruktor. Ale už ho neviem inicializovať tak ako pred tým:

auto ti = FileTimesInfo{ .LastAccessTime = 0, .LastModificationTime = 0, .LastStatusChangeTime = 0 };

Prečo to tak je? a ako tento problém napraviť tak aby som mohol inicializovať triedu oboma spôsobmi? Aj cez custom konštruktor aj cez inializátor? Teraz si len domýšlam... moj predpoklad je že keď v C++ nenadefinujem žiadny konštruktor C++ nadefinuje nejaký implicitný defaultný konštruktor, ktorý umožňuje atribúty inicializovať priamo cez inicializátor. keď ale explicitne nadefinujem konštruktor prídem o ten implicitný ktorý C++ vytvára automaticky. Ako teda triede definovať custom konštruktor pričom nechcem prísť aj o tú formu priamej inicuializácie cez membery? Vopred ďakujem za vysvetlenie.

47
Moja PCIe zvukovka Sound Blaster Z má okrem analógových vstupov a výstupov (5 jackov) aj dva digitálne. Googlil som si čo to je. Ale moc nechápem ako by som to mohol využiť? K zvukovke mám pripojenú takú vežičku so zosilovačom subwooferom a dvomi reprákmi (len 2.1, lebo 5.1 by sa mi do kanclu nezmestilo) ale tá veža nemá optický vstup (len RCA). Takže ju mám so zvukovkou prepojené analógovo jack a potom redukcia na RCA.

Keby som si kúpil toslink kábel a pripojil naň nejaký D/A prevodník a na to pripojol RCA a viedol to do veže získal by som tým niečo? Akú výhodu má ten toslink? Teda tuším že asi bude menenj náchylný na rušenie keďže je vedený opticky a ešte digitálne. Takže na to nebudú mať vplyv typické rušenia. Ale zase ten analógový kábel neni ničím rušený. A myslím že už aj tá zvukovka má v sebe zabudovaný dosť kvalitný D/A prevodník.

Joo a ešte doplňujúca otázka nedávno som si nakupoval rôzne zbytočnosti a kúpil som aj 2 elektrónkové predzosilovače. Má to zmysel pripojiť na vstup tej veže? Počul som že elektrónky majú úplne iný zvuk (iné skreslenie) ako polovodiče (lampový zvuk) a že je to oveľa príjemnejšie na počúvanie. Keď si to pripojím na vstup tej veže získam tým nejakú výhodu? Alebo načo by som to mohol využiť ešte? Na vianoce plánujem postaviť vlastný audiosystém založený RPI 4 tam by to mohlo mať využitie?

48
Windows a jiné systémy / Jak dopadl vývoj 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í.

49
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ť?

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

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

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

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

54
Dobrý deň nedávno som tu založil túto tému: https://forum.root.cz/index.php?topic=23520.0

V skratke do funkcie, ktorá vyžaduje ako parameter pointer na funkciu, s jediným parametrom by som potreboval pridať ďalší parameter. (pozn: Keďže v C++ sa currying nedá použiť (nie tak ako inde) lebo lambda s captures je typovo nekompatibilná s lambdou bez captures takže postupy, ktoré poznám z funkcionálnych jazykov som nemohol použiť)

Spomínali ste, že sa mám pozrieť na type erasure. Niekto tam pridal príklad s constexpr ktorý síce fungoval ale len s primitívnymi typmi. A keď som chcel ten primitívny typ nahradiť objektom tak compiler protestoval.

Hral som sa aj s tými type erasures, ale nejako mi to nefungovalo.V čistom C som nikdy neprogramoval a v C++ som začiatočník venujem sa mu občas s niekoľko mesačnými prestávkami. Takže Cčkovský pointer na funkciu je pre mňa niečo nové. C++ má typ std::function s ktorým mi všetko bez problémov funguje (kôli vačšej prehľadnosti kódu som to hodil na pastebin):

https://pastebin.com/zEY0H7Ay - verzia std::function mi funguje.

Lenže ja mám windows api funkciu ktorá ako parameter nepýta std::function z C++ ale pointer na funkciu. To znamená že som použil typ std::function naň som aplikoval std::bind pridal som parameter. A potom som sa snažil to prekonvertovať na Cčkový pointer na funkciu:

https://pastebin.com/5icv1F7b - verzia s konverziou na pointer na funkciu mi nefunguje. Skompilovať ide ale potom mi to hodí runtime error:

Exception thrown at 0x0000000000000000 in Erasure.exe: 0xC0000005: Access violation executing location 0x0000000000000000. Niečo tam mám evidentne zle ale ani za svet nedokážem prísť na to že čo.

Viete mi prosím poradiť ako nabindovaný std::function<int(int)> prekonvertovať na int(*)(int item)?

PS: Tá funkcia map je len príklad... Samoztejme viem že C++ má std::transform používajúce iterátory. Mne išlo len o ukážku kódu. V mojom projekte riešim niečo iné, ale súvisí to tiež s bindovaním funkcií. Akurát tam nechcem nabindovať premennú primitívneho typu, ale objekt.

55
Vývoj / C++ funkcionálny typ
« kdy: 10. 09. 2020, 01:32:12 »
Dobrý deň včera som narazil na jeden problém s funkcionálnymi typmi v C++. Išlo tam o jednu špecifickú higher-order funkciu (tú sem ťahať nebudem), ale skúsim to vysvetliť na príklade - bežnej higher-order funkcii map, ktorú asi pozná každý programátor.

dajme tomu že máme "modul" Vector a v ňom funkciu Vector::map ktorá má dva parametre:

1. mapper: Mapper<T1, T2>
2. list: vector<T>

Typ Mapper je funnckionálny typ:
Kód: [Vybrat]
template<typename T1, typename T2> using Mapper = T2(__stdcall*)(T1 item);

Funkcia Vector::map vyzerá nejako takto:
Kód: [Vybrat]
static struct Vector
{
template<typename T1, typename T2>
static std::vector<T2> map(const Mapper<T1, T2> mapper, const std::vector<T1> list)
{
...implementácia
}
}

Dajme tomu že chcem druhú mocninu položiek vektora:

Kód: [Vybrat]
const auto numbers = std::vector<int>{ 1, 2, 3 };
const auto squares = Vector::map(
(Mapper<int, int>)[](int a) -> int { return a * a; },
numbers
);
Vector::dump(squares);

Zatiaľ je všetko ok, no problém nastane keď chcem do tej lambdy dostať nejaké dáta z vonku. Dajme tomu, že mám číslo a všetky položky vectoru chcem vynásobiť týmto číslom. Ako to číslo dostanem do vnútra funkcie? Ak povolím lambde captures "[=]" alebo "[&]" tak už tá lambda nesedí s typom Mapper a (takú) lambdu v tomto prípade nemôžem použiť:

Kód: [Vybrat]
const auto numbers = std::vector<int>{ 1, 2, 3 };
const auto multiplier = 5; //ako tam dostanem tuto premennu?
const auto squares = Vector::map(
(Mapper<int, int>)[=](int a) -> int { return a * multiplier; },  // pri použití [=] alebo [&] prekladač vyhodí chybu
numbers
);
Vector::dump(squares);

Rovnako nejde do parametra vložiť metódu objektu (dá sa vložiť len statická metóda bez this). Vo funkcionálnych jazykoch by som použil buď currying, lambdu, ale C++ je na toto príliš striktné. Jediné čo ma napadlo je použiť statickú triedu so statickým memberom, lenže to je prasárna (a dosť nebezpečná prasárna). Máte nejaký nápad ako tento problém obísť? Vopred ďakujem.

56
Vývoj / C++ Windows API - clipboard
« kdy: 05. 09. 2020, 20:56:56 »
Ahojte,

potreboval by som naprogramovať aplikáciu ktorá na pozadí a checkuje zmeny v schránke windows.

Keď sa v hociktorej inej aplikácii niečo skopíruje do schránky (akcie cut, copy) tak moja aplikácia toto kopírovanie deteguje. Pozrie si obsah schránky a skopíruje ho na iné mesto v pamati.

Keď moja aplikácia deteguje vkladanie (paste), tak sa buď:

a) obsah vloží priamo z mojej aplikácie
b) alebo sa obsah vloží do schránky a z nej sa obsah vloží do tej aplikácie v ktorej bolo detegované vkladanie.

Ide mi proste o náhradu clipboardu z windows svojim vlastným clipboardom. Buď by sa clipboard nahradil úplne, alebo by sa windows clipboard prepojil s mojou aplikáciou (neviem čo je jednoduchšie).

Ako na to?

Mám odchytiť messages WM_PASTE a WM_COPYDATA? Určite existuje viacero možností ako to spraviť tak poprosím napíšte aspoň jednu. Vo windows api sa moc nevyznám, ale tak veľmi hrubo si to predstavujem asi tak že sa bude musieť hooknuť WndProc? A potom sa v ňom odchytiť príslušná správa? Ale ako to spraviť tak aby to fungovalo pre všetky aplikácie?

57
Vývoj / C++ načo slúži constexpr?
« kdy: 27. 08. 2020, 21:20:00 »
Vedel by mi prosím niekto vysvetliť načo slúži keyword constexpr?

58
Vývoj / C++ chybové hlásenia a kruhové závislosti
« kdy: 21. 08. 2020, 10:34:45 »
Po pár mesiacoch som sa vrátil k C++ a UE4. UE má nad C++ vlastné nadstavby, takže je v tom radosť programovať. C++ ako jazyk ma baví, lebo sa v ňom dá stále objavovať nové zákutia a hlavne je to úplný opak hi-level jazykov ktorými sa živím.

No jedna vec čo mi na C++ compileroch prekáža sú veľmi neadresné chybové hlásenia, možno je to o skúsenostiach, ale C++ kompiler fakt programátora nevodí za ručičku (používam jak C-lang tak MSVC compiler).

Najhoršie odhalitelné chyby sú úplné kraviny, ktoré by sa dali vyriešiť za pár minút (keby bola lepšia chybová hláška) a často sa týkajú includovania súborov alebo namespacov. Včera som napríklad dlho nevedel prísť na to prečo sa mi nedá skompilovať projekt, až nakoniec som zistil, že sa niečo navzájom includuje (neviem či sa tomu nehovorí circular dependency). V iných platformách s kruhovými závislosťami nebol problém a ani ma nenapadlo, že si s tým compiler neporadí (viem že je to asi údel starších platforiem).

1. Ako sa takýto problém (kruhové závislosti) rieši v C++? Keď 2 triedy na seba odkazujú? Pomocou odkazovania na ich abstrakcie?, alebo sa to dá vyriešiť aj nejako priamočiarejšie?

2. Neexistuje nejaký nástroj ktorý by dokázal C++ kód rozanalyzovať tak že by mi poskytol lepšie chybové hlásenia?

PS: Dúfam že keď do C++ 20 prídu moduly, tak sa tieto problémy snáď konečne vyriešia.

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

60
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

Stran: 1 2 3 [4] 5 6 ... 8