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 ... 7 8 [9] 10 11 ... 18
121
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.

122
Vývoj / Re:C++ funkcionálny typ
« kdy: 11. 09. 2020, 17:52:53 »
linuxák a alexbbx:

Ďakujem za tipy na to type erasure. Prečítam si o tom.

...

Ahoj veľmi pekne ďakujem za príklad. Večer vyskúšam.

template uvnitř struktury ???

- Statickú štruktúru používam ako náhradu za modul, nakoľko C++ bude obsahovať plnohodnotné moduly až od verzie 20. Mohol by som použiť aj NS, ale ten neobsahuje modifikátory prístupu (a my potrebujeme mať možnosť niektoré časti modulu skryť pred vonkajším svetom).

- Struct je v C++ úplne to isté čo class s tým rozdielom že membery sú implicitne public (a dedenie je tiež implicitne
 public)

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

124
Vývoj / Re:C++ Windows API - clipboard
« kdy: 07. 09. 2020, 12:15:58 »
Na Paste není žádný univerzální postup, protože si to aplikace může řešit sama jak se jí zachce. Teoreticky se může hodit zachytit klávesovou zkratku Ctrl+V, potlačit V pokud je aktivní ta správná aplikace, zpracovat schránku a pak s pomocí SendInput poslat nové Ctrl+V. Hook na zachycování má příznak, jestli jde o opravdovou událost nebo umělou, takže tím se odliší SendInput od HW stisku a nezpracuje se. Samozřejmě, když uživatel klikne v nabídce na Vložit, tak je to marné.
Zpracování zachycené zprávy by mělo být co nejrychlejší, jinak to systém odřízne.

Ďakujem za informácie. No veď toto je práve ten problém, že užívateľ nemusí pri pastovaní používať skratku Ctrl+V a potom to neni dostatočne univerzálne riešenie.

Ale teraz ma napadol ešte jeden spôsob ako to celé obísť, bez toho aby som potreboval zachytávať paste.

Nechcem to teraz prezrádzať lebo tým by som prezradil aj iné nápady (týkajúce sa schránky), ale keď budem mať hotovú celú appku tak sem dám link na github, že ako som to vyriešil.

125
Vývoj / Re:C++ Windows API - clipboard
« kdy: 06. 09. 2020, 20:49:27 »
Tak som to včera v noci skúšal vyriešiť (podľa rád Martin-a Dráb-a), ale funguje mi zatiaľ len copy + cut, na paste budem musieť použiť asi tie hooky lebo iná možnosť ako odchytiť paste neexistuje:

https://pastebin.com/Z5YNnnLm POZN: Toto je samozrejme len prototyp, preto tam nepoužívam exceptiony, ale chyby vypisujem priamo na ostream vo svojej appke to potom celé wrapnem do objektov.


126
Vývoj / Re:C++ Windows API - clipboard
« kdy: 05. 09. 2020, 23:41:47 »
Takže vyskúšal som to AddClipboardFormatListener funguje podobne ako SetClipboardViewer, akurát sa namiesto WM_DRAWCLIPBOARD triggeruje WM_CLIPBOARDUPDATE.

Ešte musím vyriešiť PASTE

127
Vývoj / Re:C++ Windows API - clipboard
« kdy: 05. 09. 2020, 23:31:06 »
Já na Linuxu používám ClipIt a zdá se, že je dost alternativ i pro Windows.
https://alternativeto.net/software/clipit/?license=opensource&platform=windows

Dík za tip. V linuxe vyskúšam ten ClipIt. Ale vo windows potrebujem niečo presne na mieru mojim potrebám. Mám pár nápadov, ktoré som ešte nevidel v žiadnej aplikácii tohto druhu. A okrem toho je to dobrý spôsob ako sa niečo nové naučiť. Keď to budem mať hotové tak to hodím na github.

128
Vývoj / Re:C++ Windows API - clipboard
« kdy: 05. 09. 2020, 23:26:46 »
Pokud programujete pro Windows Vista a novější, pro sledování obsahu schránky můžete využít AddClipboardFormatListener.
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-addclipboardformatlistener

Pokud potřebujete podporovat i Windows XP, musíte využít funkci ChangeClipboardChain. Zde musíte být opatrný, abyste nerozbil ostatní aplikace, protože zde v zásadě dochází k vytváření spojového seznamu oken, kterým se má notifikace posílat. Ten samozřejmě nesmíte rozpojit...

Pak budete potřebovat funkce na přístup k obsahu schránky. Ten samý obsah může být uložen ve více různých formátech, takže si můžete vybrat ten nejvhodnější pro vaši aplikaci. Pozor na to, že aplikace si může přidat vlastní formát.

Co se týče vámi navrhované metody monitorování zpráv, pro kterou se obvykle používá termín subclassing, není přísliš vhodná, chcete-li monitorovat všechny aplikace na daném desktopu či window station. Pro tento účel se lépe hodí tzv. Háky Windows (mrkněte na funkci SetWindowsHookEx). I zde ale musíte být velmi opatrný, abyste nerozbil jiné aplikace. V podstatě totiž systém přimějete, aby do každé vhodné aplikace injektoval vaší DLL knihovnu, která pak bude odposlouchávat (a teoreticky i upravovat) zprávy zasílané jejím oknům. Je třeba opravdu pečlivě číst dokumentaci.

Ďakujem za vyčerpávajúce info. Tie hooky som skúšal  ešte na začiatku, hook na wnd proc som mal v exernom DLLku, ale asi som robil niečo zlé lebo mi to nefungovalo.

Medzitým som si, ale na githube našiel príklad pre inšpiráciu - jednu appku, ktorá pracuje so schránkou (príklad je v C# takže som to musel prepísať do C++).

Tu je kód tej inšpirácie v C#:

https://github.com/chrisnas/DebuggingExtensions/blob/b3c38e5e3d95f1f53ce26bbe1209569716e60714/src/LeakShell/ClipboardListener.cs#L124,L165

Keď si zadefinujem:

Kód: [Vybrat]
HWND nextInChain = SetClipboardViewer(hWnd);

tak potom sa mi pri cut + copy akcii v akejkoľvek windows aplikácii triggeruje WM_DRAWCLIPBOARD ktoré zachytávam vo WndProc taktiež tam riešim WM_CHANGECBCHAIN (ako ste spomínali). Po skončení aplikácie zavolám ChangeClipboardChain(hWnd, nextInChain);

Kód: [Vybrat]
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CHANGECBCHAIN:
    {
    if ((HWND)wParam == nextInChain)
    {
    nextInChain = (HWND)lParam;
    }
    else if (nextInChain != NULL)
    {
    SendMessage(nextInChain, message, wParam, lParam);
    }
    }
    break;
    case WM_DRAWCLIPBOARD:
        {
            if (attachedToClipboard && nextInChain != NULL)
            {
                /*** TU MOŽEM ZACHYTÁVAŤ KOPÍROVANIE ***/
                SendMessage(nextInChain, message, wParam, lParam);
            }
        }
        break;

Každopádne AddClipboardFormatListener a RemoveClipboardFormatListener bude na tento účel asi adresnejšie (idem to vyskúšať). Akurát týmto mám vyriešené len CUT a COPY akcie. Ale ako mám zachytiť PASTE?

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

130
Vývoj / Re:Extrakce CSS
« kdy: 28. 08. 2020, 21:23:06 »
Řekl bych, že z popisu není úplně jasné, co chcete. Chcete to dělat jednorázově třeba v developer tools v prohlížeči? Nebo na to chcete nějaký automat pro dávkové zpracování? Chcete vytahovat informace jen z HTML, nebo i z CSS?

Pokud chcete jen z HTML vytáhnout vše, co ovlivňuje CSS, jsou to obvykle jen tři atributy – id, class a style. Dále to ale samozřejmě může ovlivňovat hierarchie dokumentu (předchozí a nadřazené uzly DOMu) a jakékoli další atributy (CSS má atributový selektor).

Pokud by vám stačilo vytahat ty tři atributy (id, class, style), je asi nejjednodušší převést HTML na XHTML a pak použít XSLT (nebo XQuery nebo samotné XPath, záleží na požadovaném výstupu.

Tak to ste veľmi zjednodušili. Pretože dosť často sa používa selector priamo na elementy, prípadne kombinácie viacerých tried / elementov, prípadne XPath. Alebo aj toto:

Kód: [Vybrat]
article + article {
    margin-top: 25px;
}

nehovoriac o vnáraní a hierarchii elementov. Na základe samotného id a class teda nezistíte skoro nič.

131
Vývoj / Re:C++ načo slúži constexpr?
« kdy: 28. 08. 2020, 20:52:51 »
...

Ďakujem Vám za vysvetlenie keď som si to čítal v angličtine tak som tomu nerozumel a až pri Vašom vysvetlení som to pochopil. Takže tá funkcia vlastne v preloženom kóde neexistuje a toto:

Kód: [Vybrat]
include <iostream>

consteval int add(int a, int b)
{
return a + b;
}

int main()
{
constexpr int result = add(5, 5);
std::wcout << L"result: " << result << std::endl;
        return 0;
}

sa preloží ako keby bol na vstupe takýto zdroják:

Kód: [Vybrat]
include <iostream>

int main()
{
std::wcout << L"result: " << 10 << std::endl;
        return 0;
}

Ak som to správne pochopil, tak constexpr resp. consteval, dovoluje niečo podobné ako makrá (samozrejme to zjednodušujem), len to neprekladá prerocessor, ale priamo prekladač C++ a tým pádom to má ako bonus rovnakú syntax ako C++ a taktiež sa tam oproti makrám checkujú typy.

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

133
Vývoj / Re:C++ chybové hlásenia a kruhové závislosti
« kdy: 21. 08. 2020, 17:34:24 »
Funguje to super! Ďakujem. Vlastne veď ja som tie forward deklarácie už videl v jednom screencaste (video tutoriale) ale vtedy autor toho videa nevysvetli, že načo to vlastne robí a až teraz mi to došlo.

134
Vývoj / Re:C++ chybové hlásenia a kruhové závislosti
« kdy: 21. 08. 2020, 17:29:07 »
Ďakujem Vám všetkým za pripomienky. Prejdem si to a poskúšam.

Ja som všade použil ten (nenštandartný):
Kód: [Vybrat]
#pragma once
ale aj napriek tomu som mal tento problém.

...

Aha takže deklarácia (bez definície). Toto asi pomôže.

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

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