Anonymní profil Ovrscout – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Ovrscout – Programujte.comAnonymní profil Ovrscout – Programujte.com

 

Příspěvky odeslané z IP adresy 193.165.79.–

Ovrscout
C / C++ › Cim nahradit Watcom C ? Prac…
7. 9. 2023   #391536

Já bych ale tu www.libsdl.org uplně nezatracoval. Sice uz je to starsi projekt ale porad je aktivni (verze 2 je udrzovana a pracuje se na SDL 3).

Každopádně ale budu držet palce, a díky za tip na glfw :) vypadá to dost podobně.

Ovrscout
C / C++ › Cim nahradit Watcom C ? Prac…
6. 9. 2023   #391532

#1 Atro

Koukám že zatím bez odpovědi, tak přispěju svou troškou do mlýna :)

Přímou náhradu Neporadím.
Ono taky bude záležet jak moc ty programy používají dosové API případně přímý přístup ke grafice. Taky to může znamenat různé vesa a podobné režimy a přímý přístup do RAM pro grafiku. Tam už se asi bez něčeho jako DOSBOX nejspíš nepohnete.

Pro nové věci ale můžete zkusit překladače clang nebo gcc(mingw). A jako knihovnu pro grafiku asi něco jako libsdl. Tu sice znám jen z dálky, ještě jsem se k vyzkoušení nedostal, ale vypadá že to je celkem používané a relativně jednoduché..

Ovrscout
.NET › Srovnání dvou polí
18. 5. 2023   #391295

#6 beltonendownload

Celá část zní: " zda obsahují ke každému X odpovídající x*x ".
Tj požaduje se kontrola že pro prvky z pole B(x) existuje položka v poli A(x*x). O opačné kontrole se nic nepíše. Takže v poli A mohou být položky navíc a ničemu to nevadí. Tedy,  teoreticky :( , viz níže.

Nicméně začátek zadání je: "dvě int pole, pole A plné x*x, druhé pole B plné x."
Což může taky znamenat že součástí zadání jsou dvě pole které už by měla podmínku splňovat.
Ale protože se následně to má kontrolovat, tak se asi očekává že to zadání vlastně není platné protože seznam hodnot x v poli A asi nebude ten stejný co seznam hodnot x pro pole B.
Což vrhá dost špatné světlo na kvalitu této části zadání a je třeba se ptát zda i další části nelze vyložit jinak.

Takže bych řekl, že to je klasicky mizerné školní zadání, které se dá správně vypracovat jenom tím že se podíváte jak ten konkrétní vyučující s tímto konkrétním typem zadáním obvykle myslí.
Respektive se kouknete do příkladů od něj nebo od někoho zjistíte jaký byl výklad při hodinách.

S vyučujícím se ale nehádejte, protože nejspíš by tvrdil že je to jasné zadání a že se to jinak než on to tak dělá a učí roky, a že se to nedá vyložit jinak, že si vymýšlíte atp. atd.
K ničemu to nepovede a jen zvyšujete riziko že si na vás zasedne.A i kdyby jste tuhle bitvu vyhráli, jste připraveni na dlouhotrvající válku s vyučujícím?
 

P.S. Pro případ výjimečně otevřeného a nemstivého vyučujícího, můžete zkusit na nejednoznačnost upozornit.
       Dva takové jsem měl čest poznat(ale jenom jeden byl matematik), ale dle mé zkušenosti to jsou opravdu výjimky z pravidla, a měl jsem dost štěstí.

Ovrscout
C / C++ › Typedef v C ?
3. 1. 2023   #390762

Chápu že to vypadá užitečně, ale vzhledem k tomu že třeba pořadí je závislé na použitém překladači, tak doporučuji se tomu vyhnout.

Pokud se k tomu z nějakého důvodu rozhodnete, tak alespoň  připravte automatické testy které zkontrolují zda jsou bity tak jak opravdu potřebujete, aby se změnou překladače nebo jeho verze nedošlo k překvapení.

A každopádně také si dejte pozor na to jak velké je třeba definovat ty proměnné aby to fungovalo správně - což by mělo být závislé na "architektuře" pro kterou překládáte (viz druhý odkaz níže).

Doporučuji googlit, ale narychlo třeba https://blogs.sw.siemens.com/embedded-software/2019/12/02/why-not-use-bit-fields-for-device-registers/ a obzvlášť výživné  Betrayed by a bitfield [LWN.net]

Ovrscout
PHP › Data se nenacitaji do db
25. 9. 2020   #386671

#1 petr

Nechybí u $a -> execute; závorky?  ->  $a -> execute();

Ovrscout
MySQL › Indexace tabulky pro rychlé…
16. 1. 2019   #382817

#7 šnekr Jaký druh indexu?

Pokud chceš hledat podle začátku textu tak B-Tree je co hledáš, jukni třeba do dokumentace ohledně indexů v mysql. Ještě to umí fulltext ale s tím moc zkušeností nemám.

Do více tabulek bych to zbytečně nerozděloval, nejdříve si pohraj s těmi indexy a vyzkoušej jak je to rychlé.
Vypiš si pomocí explain jestli tvé selecty používají indexy které jsi vytvořil.

Ovrscout
MySQL › Jakou používat strukturu tab…
7. 8. 2018   #381125

#1 Pavelv

To se mi nezdá že by to mělo být tak pomalé, zkus kouknout jaký plán se pro ten tvůj dotaz použije.(A pozor na to že plán se může lišit pokud zadáš SQL dotaz přímo v nějaké konzoli, nebo když použiješ parametrický dotaz v kódu)

Pokud budeš mít index (IDzarizeni, Čas), v tomto pořadí - ne opačně, a budeš mít správně dotaz,
tak musí být odpověď na aktuální data dannéhop zařízení téměř okamžitá.(pokud má db dost paměti na to udržet index/y v paměti).
Uznávám že je to trochu atyp index, ale pro tenhle typ dotazů je to skoro nutnost. Pokud tedy nechceš mít extra tabulku jen na aktuální data jak už tu někdo psal.

Také zkontroluj že máš dobře statistiku nad indexama, MySql moc neznám ale většinou je třeba čas od času aktualizovat.

Pokud bys chtěl data z jednotlivých zařízení od sebe oddělit do "jednotlivých částí" kvůli optimalizaci, tak zkus juknout na partitioning. Je to trochu složitější a jsou i nějaká omezení ale mělo by to dělat co chceš, a přitom pro dotazy by se to stále mělo tvářit jako jedna tabulka (ale osobně jsem to nepoužil).
Nejdříve bych se ale zkusil obejít bez partitioning-u, těch dat co píšeš zas tak moc není aby to nezvládl běžný desktop stroj.

Jediné čeho bych se trochu dlouhodobě bál bude čištění db po smazaných řádkách, a údržbě indexů.Může trvat, pokud je hodně dat. Případně řešit partitioningem. Ale to je třeba ozkoušet jak se MySql chová, jak říkám moc ji neznám, ale těch dat není tak moc.

Ovrscout
Python › Reakce na překročení teploty
10. 4. 2018   #220300

(neřeším cyklus čtení atp ale jen podmínku, syntaxe je céčková)

pokud chceš zavést hysterezi tak musíš vyhodnocovat nejen teplotu ale i aktuální stav výstupu.

 

int8_t sStavVystupu=-1;//vychozi stav je neznamy - takze podminky se kontroluji dle poradi

if (sStavVystupu!=1)//je rozepnuto, respektive neni sepnuto nebo je stav -1
{
 if (temp_calibrated < 15) {GPIO.output(7, True);sStavVystupu=1;}
}
if (sStavVystupu!=0)//pokud je sepnuto, respektive neni rozepnuto 
nebo je stav -1

{
    if (temp_calibrated > ventilator) {GPIO.output(7,False);sStavVystupu=0;}
}

Dá se napsat i úsporněji a místo proměnné načíst stav výstupu(pokud to knihovna umožňuje).
Také nemusíš použít stav -1, pokud určíš výchozí stav jinak.

Ovrscout
OS - Windows › Win 10 sabotují ovladač virt…
2. 2. 2018   #219607
Ovrscout
Java › Počet nulových bitů v čísle
10. 11. 2017   #218456
Ovrscout
Java › Počet nulových bitů v čísle
10. 11. 2017   #218455

#6 Ovrscout
případně pokud to chceš jenom použít tak koukni umí tvůj překladač (případně i procesor) např gcc podporuje

__builtin_popcount(x) https://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html

který by se měl optimalizovaně přeložit pro danou architekturu. (v tomto případě bude třeba zavolat zvlášť pro každých 32 bitů)

Ovrscout
Java › Počet nulových bitů v čísle
10. 11. 2017   #218453
Ovrscout
.NET › Hra - Vrstvy na postavě
8. 11. 2017   #218404

nemám radu ale dotaz, obouruční a jedenapůlruční zbraně také podporuješ? :)

Ovrscout
C / C++ › Vymazání bitů
7. 8. 2017   #217342

 #5 oxidián
Int. Vnulování čísla. Leč uznávám že lepší bude dát tam LSB = 0;]

doufám že unsigned int :) , bitové operace nad znaménkovým typem snadno sklouznou do undefined/unspecified části ansi c. Pravidla jsou tu trochu složitější, skus hledat na webu.

Ovrscout
C / C++ › Vymazání bitů
7. 8. 2017   #217341

#5 oxidián
Pro info, pokud je LSB 32bitove cislo bez znamenka (předpokládám). Tak je operace LSB <<= 32; nedefinovaná (v ansi c).

Tj může to dělat cokoliv. většinou to buď hodnotu vynuluje nebo ji to ponechá nezměněnou, záleží na platformě.
navíc se můžou objevit problémy/rozdíly při kompilaci se zapnutou optimalizací/nebo bez.

např zde

Ovrscout
C / C++ › Jak vypnout optimalizaci u i…
27. 6. 2017   #216816

#4 Ovrscout
Abych jen neprudil, pokud jde o gcc tak lze optimalizace (asi i v závislosti na verzi) ovládat

  • Vypnutím optimalizace na úrovni souboru - commandline -O0)
  • Vypnutím optimalizace na úrovni funkce  - __attribute__((optimize("O0")))
  • pomocí #pragma GCC optimize ("O0")

asm volatile by mělo fungovat také, zkuste dát každé NOP do samostatného asm volatile bloku.

Ovrscout
C / C++ › Jak vypnout optimalizaci u i…
27. 6. 2017   #216815

#3 Jonáš
Co je to tedy za překladač? Pokud možno uveďte i číslo verze.

Ovrscout
C / C++ › Algortimus funkce cos(x)
29. 5. 2017   #216420

#7 Kit
emh, jsi si jistý? Možná na ten svůj kód ještě koukni.

Ovrscout
C / C++ › Přetypování a výpis
25. 5. 2017   #216286

#1 Václav
Většina nových překladačů by tě na tuto chybu měla upozornit. Zkus si poladit parametry pro překladač -  zapnout rozšířené warningy nebo tak něco.

Ovrscout
C / C++ › Návrhové vzory - Specializac…
28. 3. 2017   #215364

#1 Doomista
Jsem teď nějaký líný nějak hlouběji promýšlet architekturu :) takže spíš jen pár poznámek:

Pro vytváření bych popřemýšlel nad factory které bude vracet buď cli nebo qt verzi objektů. Tj na začátku si vytvoříš správné factory a pak už při vytváření objektů neřešíš jakou verzi chceš.

Taky by možná bylo dobré uvažoval o oddělení prezentace do samostané třídy (případně více tříd).
Možností jak propojit GM s vizualizací bude více.

Ovrscout
C / C++ › Import dll do me dll
21. 3. 2017   #215288

#2 VladislavK
Tipnul ze ten ukazatel na winapi funkci by mnel taky obsahovat volací konvenci pro winapi.


typedef void (WINAPI *FNPTR)(int freq, int dur);
nebo
typedef void (__stdcall *FNPTR)(int freq, int dur);

Ovrscout
HTML / XHTML › Spustanie EXE z HMTL suboru…
21. 3. 2017   #215282

ehm, podle nápisu CGI v prvním příspěvku soudím že jde o spuštění CGI aplikace/skriptu, což znamená že se to spustí na serveru a teprve výstup ze skriptu(std out) se přes webový server předá do prohlížeče uživatele. Dřív se to docela používalo.

#1 marek17
je potřeba dát pozor na několik věcí, ale všechno se to odvíjí od toho jaký používáš server(win/linux/..) a webový server(appach/nginx..):

-soubor musí být platný spustitelný soubor pro dannou platformu (tj pokud máš na serveru windows tak exe, pokud tam běží linux tak to musí být binárka pro linux), pokud je to skript tak musí mít správnou hlavičku atp..)

-soubor jako takový musí mít nastaveno oprávnění ke spuštění

-ideálně, pokud máš na server přístup z příkazové řádky tak zkusit ten soubor spustit a kouknout že to co ti vrací je to co očekáváš (pravděpodobně html stránka, nebo její část)

-dalším krokem je nastavení webového serveru, to se může dost lišit, doporučuju vygooglit pro danný webový server. Může být vyžadováno aby byl ten cgi program/skript uložen v nějakém konkrétním adresáři, a případně s konkrétními oprávněními. viz dokumentace k webserveru. Může být nutné doinstalovat/povolit nějaké rozššíření atp.

Ovrscout
Java › Trošku teorie...OOP
12. 1. 2017   #214469

#12 Kit
Můžeš prosím poradit nějakou lepší literaturu? :)

Ovrscout
Python › Pravdepodobnosť útoku
16. 12. 2016   #214082

#19 RomanZ
Částečně souhlasím, je třeba určit co má být cílem a za jakých podmínek/v jakém prostředí. Proto pořád píšu že je to třeba doupřesnit.

Ale na druhou stranu, když vyjdu z původního požadavku, tak tam není požadavek aby zbraň měla náhodnou úspěšnost, ale na to, aby byla splněna určitá pravděpodobnost zásahu. Tj aby 70% střel zasáhlo cíl. Čili nic jako ruleta kde je požadavek čistě jen na náhodu. Když hra napíše 70% tak hráči budou očekávat že to 70% bude, ne 50 ne 90 ale 70%. Obzvláště citlivé je to podle mne u PvP her.

Co se týče požadavků, tak obvykle(podle mne tedy, někdo může mít jiný názor) se v tésto situaci požaduje aby to chování zbraně nebylo jednoduše predikovatelné, aby s tím hráči nemohli taktizovat.
Sice se opakuji ale: pokud např budou hráči vědět že prvních 7 střel vždy zasáhne a další 3 nezasáhnou tak to sice celkově je 70% ale hráč by se na to mohl dívat tak že prvních 7 střel má 100% a další tři mají pravděpodobnost 0. Podobné problémy má i míchání v poli , ale jsou tu i jiné vlivy (viz dřívější příspěvky) které se více méně obejvují pokud to má platit pro malý počet střel.

Druhý požadavek je přijatelná chyba, pokud někdo bude mít vlivem náhody pro zbraň s úspěšností 70% uspěšnost 8 zásahů z 10 a jiný hráč jen 6, je to přijatelné? A co když se budeme bavit o 20%, a jednom vs třech zásazích z 10, je to přijatelné?

Jedna z nejdúležitějších informací, které nám zatím chybí, je nějaký alespoň hrubý odhad počtu střel o kterém se bavíme. Pro tisíce a desetitisíce by mohl stačit i ten jednoduchý přístup od petra z #5 příspěvku. Pro 10 střel bude možný rozsah chyb nejspíše příliš velký.

Další důležitá informace je, pro jaká procenta se bude výpočet dělat. Víme o 70% ale předpokládám že je to jen příklad a rozsah možných hodnot bude větší.

Ovrscout
Python › Pravdepodobnosť útoku
16. 12. 2016   #214079

#17 hanpari

Tímhle vyřešíš jen jednu konkrétní situaci, tj že když vystřelíš 100x tak bude splněná požadovaná "přesnost".
Zkus se ale zamyslet nad celým scénářem, ne jen nad jedním případem který jsem vypsal.

Přikládám typy k zamyšlení:
Co když za hru hráč vystřelí jen 150 střel? bude rovnoměrnost platit?, s jakou odchylkou?
A co když to bude jen 20 střel?
Dokážeš se 100 položkamy vyjádřit pravděpodobnost 0,5% (je to ale vůbec potřeba?)
Pokud budeš znát předchozích 99 střel, s jakou pravděpodoností dokážeš odhadnout jaké bude ta poslední - bude ta poslední střela náhodná?

Dokud to původní pisatelka neupřesní, je těžko se někam dobrat. Je tu u možnost že střel bude tolik že i naivní přístup bude dostatečný.

Ovrscout
Python › Pravdepodobnosť útoku
15. 12. 2016   #214059

#13 hanpari
ehm, zkus kouknout do mého postu #7 . Kde, kromně toho nezáživného dlouhého pokecu  kde se snažím ukázat že to není tak jednoduché, jsem to i vyzkoušel.

A pro <=0,5 mi v jednom konkrétním případě vyšlo jen 42 hodnot ze 100 což odpovídá 42% místo požadovaných 50%. Což mi přijde jako docela velká chyba.

Samozřejmně záleží na počátečním "seedu" a typu toho RNG algoritmu. Někdy se dostaneš na lepší přesnost, někdy na horší. Ale dokud bude ten RNG algoritmus alespoň trochu náhodný , tak u malého vzorku hodnot prostě k této "chybě" docházet bude.

Ovrscout
Python › Pravdepodobnosť útoku
8. 12. 2016   #213978

#7 Ovrscout
ta čísla v příkladech jsou:
P = Hit =>SP

P je Požadovaná procenta
Hit = počet skutečných zásahů(porovnáním dle požadovaného procenta)
SP =skutečné procento zásahů (hit/počet střel)

Ovrscout
Python › Pravdepodobnosť útoku
8. 12. 2016   #213977

#1 allicce
Víceméně ti již petr odpovědeli, ale nadruhou stranu je třeba říci že že jen použití náhodného generátoru a "hranice úspěchu"(tj procenta) může být pro některé případy problematické.

Například je problém v rozložení hodnot které generátor dává. To ani zdaleka nemusí být rovnoměrné, nebo může být cca rovnoměrné aje jen při velkém počtu použitých čísel. Například pro  milion vyčtených náhodných  čísel to bude rovnoměrné, ale pokud ale hráč "použije" jen stovku čísel (např 100 střel za jednu hru). Tak může nastat situace že prostě netrefí vůbec nic. Ačkoliv by asi měl.

Další variací na toto téma je pokud se jeden náhodný generátor použije pro generování hodnot pro různé hráče a zbraně. Co když zrovna na někoho vyjdou ta vyšší čísla z toho rovnoměrného rozložení? To se klidně může stát pokud je generátor dostatečně náhodný. Takový hráč pak trefí všechno a ostatní sotva něco. ... .

Podobné je to i  tím o, že není jasné co přesně znamená 70% provděpodobnost.
Matematicky se k tomu číslu můžeš dostat i tak že prvních 7 výstřelů vždy zasáhne, a zbylé 3 nezasáhnou. Nebo 70/30 nebo 700/300. Vše čistě bez náhodného elementu.

A stejně jako čím méně čísel z generátoru se použije,tím je větší problém s náhodností a "kvalitou".
Tak platí, že čím menší je rozsah do kterého se potřebuje hráč trefit, tím větší jsou nároky na "kvalitu" toho rozložení. Pokud je šance třeba jen jedno procento, tak je vliv "náhodnosti a rozložení" mnohem větší.

Těm procentům toiž chybí rozměr a rozložení.
např: "během jedné hry (cca 100 střel) má být pro jednu konkrétní zbraň pravděpodobnost 70% že něco zasáhne" je trochu odlišné od "během jednoho dne všechny střely z daného typu zbraně zasáhnou v 70procentech případů".  Obojí vyjde 70% ale to druhé může také znamenat že 70% hráčů s touto zbraní zasáhne vše a 30procent z nich se netrefí nikdy.

Obě varianty jsou tak trochu "krajní" ale snad je na nich vidět že jen náhodnost, a procenta nestačí.
Některé hry to opravdu neřeší a pak se při velkém počtu hráčů může stát že někomu padají celý den samá "malá" čísla, a někdo má zas neuvěřitelné štěstí. To nutně nemusí vadit pro kratší časový interval(pár minut nebo část bitvy), ale pokud to trvá celou dobu co hráč ten den hraje, tak to je frustrující.

Možná by také stálo za to kontrolně vygenerovat danný počet čísel (např dle očekávaného počtu střel pro které mají platit ta procenta - např za jednu hru) a spočítat zda jednoduché vyhodnocení hranic bude fungovat. tj. spočítat kolik ze (např 100) se vejde pod hranici 50%,70%,80%,90%,95%,99%

Např můj kód v C (porovnání hodnoty z generátoru náhodných čísel bez korekce jako petrova ukázka) mi vrátil pro deset náhodných hodnot toto:

NumOfValues=10
1.0%=  0 hits =>0.0
5.0%=  1 hits =>10.0
50.0%=  5 hits =>50.0
70.0%=  7 hits =>70.0
80.0%=  7 hits =>70.0
90.0%=  8 hits =>80.0
95.0%=  9 hits =>90.0
99.0%= 10 hits =>100.0
99.9%= 10 hits =>100.0

a pro 100 hodnot toto:

NumOfValues=100
1.0%=  2 hits =>2.0
5.0%=  6 hits =>6.0
50.0%= 42 hits =>42.0
70.0%= 69 hits =>69.0
80.0%= 77 hits =>77.0
90.0%= 86 hits =>86.0
95.0%= 91 hits =>91.0
99.0%= 98 hits =>98.0
99.9%=100 hits =>100.0

Funkce pro náhodná čísla v pythonu https://docs.python.org/2/library/random.html

Takže opravdu dopručuju se zamyslet a doplnit nějakou korekci.
Například lze počítat úspěšnost v posledních 100 zásazích, a pokud bude výrazně pod požadovanou úrovní(třeba 50% místo 70%) tak hranici snížit, nebo naopak, pokud bude výrazně vyšší tak zvýšit. Samozřejmně pokud bude požadováno 1% bude třeba nastavit hranice jinak, případně povolit korekci až po určitém počtu výstřelů.
Možná by se ty korekce neměli počítat zvlášť pro každou hráčovu zbraň ale spíše, pro každou střelu s požadovaným procentem zásahu(případně v několika rozsazích), jednoho hráče.

Není to úplně snadné, možná bych radil pro jednoduchost začítl tak jak poradil petr. A vylepšovat až pak.

Ovrscout
PHP › PHP práce s daty
29. 9. 2016   #212830

viz to co napsal  #2 peter jen bych si dal pozor na přechody letního a "zimního" času, Tj nejlépe se tomu vyhnout a při převádění datumů poučít čistou "GMT" zónu.

Ovrscout
C / C++ › otevření souboru který je vl…
4. 8. 2016   #212219

Je rozdíl mezi tím když je uživatel ve skupině administrátor a možností programu těchto práv využít.

programy jsou běžně spuštěny v "uživatelském" režimu. Pokud potřebují něco víc, je potřeba je spustit v "povýšeném" režimu. Nebo třeba jako total commander, pru určitou úlohu spustí nový proces v tomto režimu.
Je to něco jako sudo v linuxu.

Pro odpíchnutí se jukni sem: http://stackoverflow.com/questions/6412896/giving-application-elevated-uac

nebo zagoogluj : c++ elevated privileges

Ovrscout
.NET › Přesné předání pozice v stre…
1. 8. 2016   #212171

#1 kocourek
#2 BDS

Podle "googlu" a "internetu", si StreamReader data bufferuje, tj. načítá si je dopředu do bufferu, takže když se zeptáš streamu ze kterého ten streamreader data tahá(ti dva jsou jakoby v kaskádě) tak ta pozice nemusí/nebude souhlasit.

Navíc se zdá že ani Seek ve spojení se StreamReaderem není tak bezproblémový.
Např http://forums.codeguru.com/showthread.php?384759-StreamReader-BaseStream-Seek-Problem doporučují po volání stream.seek() zavolat streamReader.DiscardBufferedData()

Nicméně zjistit aktuální pozici StreamReaderu nějak jednoduše, elegantně a zároveň čistě nejde.
Někdo dokonce doporučuje zkopírovat si zdrojáky pro třídu streamreaderu a udělat úpravu aby šla pozice vyčíst. A nebo fujky řešení s čtením Private členů, což se může v další verzi .net rozbít.
Pokud se čte jen po řádkách je relativně čisté a jednoduché si třídu pro čtení napsat sám. Ale bacha, pokud je soubor v unicode, je třeba správně ošetřit aby znaky byli vždy celé.

Více např http://stackoverflow.com/questions/10189270/tracking-the-position-of-the-line-of-a-streamreader

(upozornění: Kód v odkazech jsem nezkoušel. Spíš sem to sem dal, aby se měl tazatel od čeho odrazit)

Ovrscout
C / C++ › nefunkční switch?
18. 7. 2016   #212015
Ovrscout
C / C++ › nefunkční switch?
18. 7. 2016   #212014

#1 kojor44
za while máš středník navíc co ti udělá nekonečnou smyčku pokud to nebude číslo 3 :) .

Navíc testuješ ještě před tím switchem takže když dáš ten středník pryč tak ti to při zadání trojky neudělá nic jen ukončí program.

spíš bych to zkusil přepsat jako do{}while() i kdy6 ho b26n2 moc nepoužívám: (neotestovany kod!)

do{
	cin >> volba;
	switch(..)
	{
	..
	};
}while(volba!=3);
Ovrscout
OS - Windows › Windows 10 - nevhodný ovlada…
12. 7. 2016   #211863

Možná to máš nějak divě nainstalované, obzvlášť jestli si to dělal jako upgrade (pokud ne tak ti to myslím nevezme ten klíč z win 7). Některé systémové appky to občas nerozchodí : antivir, firewall, appky od výrobce počítače, různé drivery, nebo pokud jsi to měl nějak tweakované. Obzvlášť pokud to nejsou poslední verze.
Někdy se doporučuje je před upgradem odinstalovat(záleží kus od kusu na hw a výrobci).

To iso co máš je stažené z netu,? nebo to je to co vyleze z toho sw pro upgrade, já používal ten vygenerovaný při upgrade a v pohodě. Původní win musí být na disku když děláš upgrade, nestačí jen to vygenerované iso, neměls třeba odpojený disk s win 7 a neinstaloval na jiný?
Pro návrat k win 7 není třeba reinstalovat, po dobu třiceti dní lze provést návrat k předchozí verzi klikátkem z win 10 (jednou jsem úspěšně použil)

Buď to zkus všechno odinstalovat nebo spíše zkusit čistou intalaci(během instalace lze zvolit že se zachovají data ale něpřebere se žádné nastavení ani naistalované programy, nebo tak nějak) a pak teprve stáhnout a nainstalovat aktuální verze těhle SW.

Já osobně jsem měl na jednom PC problém se staší verzí esetu, nestačilo přeinstalovat na novou :( , a na jednom notebooku s driverem k Wifi (musel jsem vypnout úsporné funkce wifi). Jinak ale pár PC v pohodě naupgradováno.

Ovrscout
.NET › C# - DataGridView + float
9. 6. 2016   #211291

#2 ing
hmm, projistotu jsem rychle zagooglil ale nic moc.
Možná máš přeci jen pravdu a fungovat by to mohlo. Stojí to za vyzkoušení.

Ovrscout
.NET › C# - DataGridView + float
9. 6. 2016   #211290

#2 ing
myslím že takhle v událostech to s databindingem nebude fungovat.

#1 BDS
Nejspíše to nebude to úplně "správné" řešení s C# bindingem zas tak moc zkušeností nemám, ale možná stojí za pokus, nebo tě to alespoň někam posune:
Změnit get/set na typ hodnoty string, a definovat private proměnou float.
Do Get/Set doplnit konverzi  float<->string pomocí ToString, TryParse nebo taknějak.
Hodnotu proměnné v setteru přepsat jen pokud se konverze z textu podaří.
Nejsem si jist zda se v tom případě původní hodnota prokreslí zpět na Formulář, pokud ne tak by se musel vyměnit list<> za BindingList<> a do MyModel implementovat INotifyPropertyChanged, Do setteru pak při chybě konverze přidat volání PropertyChanged.

Ovrscout
.NET › c# SLIP protokol, praca s st…
29. 4. 2016   #210304

#3 TD

Jak psal q, v tom bufferu(byte[]) si najdes konec telegramu a tak budes vedet jak ma byt text dlouhy.
Take je dobre si udrzovat kolik dat se do toho bufferu zapsalo(a nova data pridavat na konec. Kdyz najdes konec telegramu tak si ten pocet nactenych dat vynulujes(nebo pokud budes mit za koncem jeste nejaka data tak je presunes na zacatek pole a upravis delku a znovu zkontrolujes  jestli tam neni dalsi telegram ...))

Ta funkce pro převod na text má více variant vstupních parametrů, jedna z nich umožňuje zadat i počáteční index a počet bajtů tim vytvoris text jen z toho co ma opravdu text byt.

Pokud se jedná o velikost vstupního bufferu, tak pokládám za lepší mít předem alokovanou rozumnou velikost než při každém příjmu alokovat nový buffer(což může v závislosti na tom z čeho čteš a jak data dále používáš může vést k nepěknému chování ve spojitosti s garbagekolektorem případně piningem).
Navíc pokud to opravdu nevíš jak může být vstup velký tak můžeš po naplnění bufferu použít resize nebo udělat nový větší(s rezervou) buffer a data do něj překopírovat, a starý buffer zahodit.

Ovrscout
.NET › c# SLIP protokol, praca s st…
27. 4. 2016   #210235

#1 TD

Jeli tím myšleno https://cs.wikipedia.org/wiki/SLIP :

C# String obsahuje text ve formátu unicode, tady to asi není uplně dobrá volba, ten slip může obsahovat cokoliv(nejen text) a navíc jsou tam ty náhrady znaků. To nemůže dělat dobrotu.

Asi by bylo s tím na začátku a pracovat v poli byte[].
Tedy, načtení dat, vyhledání koncové značky a provedení náhrady ESC sekvencí. Teprve potom bych se rozhodoval jestli danný telegram převést na string.
To finální převedení na text má samozřejmně smysl jenom pokud víš že v tom telegramu je uložen text a víš v jakém je kódování, pro UTF8 se dá použít např System.Text.Encoding.UTF8.GetString(..)
 

Ovrscout
.NET › Monitor sériového portu [C#]
26. 4. 2016   #210211

Z trochu jiného soudku:
Ten přístup k formuláři z druhého vlákna, není úplně nejzdravější. Mělo by to být třeba přes Invoke.
Také by mohlo být lepší místo ručně spuštěného vlákna skusit použít obsluhu události SerialPort.DataReceived

Ovrscout
Visual Basic › Parallel For
19. 4. 2016   #210020

#1 Pavel
VB neni muj obor ale troufám si hádat že přístup k Formu z více programových vláken (což ten ciklus zřejmně vytvoří) je nutno ošetřit jukni sem - https://msdn.microsoft.com/en-us/library/ms171728%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

Obzvlášť "vytváření", ale také "přidávání" nových prvků do formu není dobrý nápad, to by se mnělo dělat vždy z vlákna kde byl daný form vytvořen.

To že fungují MessageBoxy bude tím že jsou jsou vytvořeny a použity v tom sammém vlákně, Správně by se vlákno asi mnělo pro GUI připravit viz. ApartmentState.STA, ale zrovna v Paralel.For to asi není dobrý nápad. Každopádně doporučuju se tomu také vyhnout.

Ovrscout
C / C++ › Dlouhá aritmetika?
29. 2. 2016   #208983

#11 peter
:) mno pokud vim tak to plati tak akorat pokud pouzivas precompiled headers(VS studio t má v defaultu), což je tak trochu hack pro rychlou kompilaci, vlastne se to pak chova tak jako kdyz se na zacatek vsech c/cpp souboru vlozi include nekterych standardnich souboru. Bez tohoto, se naopak musi includovat skoro vsechno vcetne i tak základních věcí jako math a string.

No a s temi standardy, ono jich jak pro C tak pro C++  vznikla celá řada, za ty roky se specifikace nejen zpřesnila ale i rozrostla o nové věci. zkus zagooglit rozdíly třeba C89/C99 C++98/C++14 . Např. pokud si pamatuji správně tak treba v C89 zadne stdint.h -> uint32_t a podobne typy nebyly (ackoliv nektere C89 kompatibilni prekladace to pozdeji v sobe meli integrovano, ve standardu C89 to nebylo, az v C99)

Ovrscout
.NET › zamzrani Serveru TCP/IP
29. 2. 2016   #208981

#9 Ovrscout

taji takový základní příklad od ms

https://msdn.microsoft.com/en-us/library/bew39x2a%28v=vs.110%29.aspx

Ovrscout
.NET › zamzrani Serveru TCP/IP
29. 2. 2016   #208980

Takováhle práce se socketem v ručně vytvořeném vlákně je spíš vhodná pokud těch tcp spojení není mnoho a potřebuješ průběžně na pozadí komunikovat přes tcp a jen sem tam aktualizovat GUI.

Při zběžném kouknutí mi v tom příkladu chybí ošetření přístupu z více vláken k receive a  text_to_send.
Zatím to asi tak moc nevadí(rozumněj, asi ti to nebude moc často padat) ale jakmile s tím začneš nějak pracovat můžeš se dočkat nepěkného chování a pádů.


Zkus najít přklady s BeginAccept , BeginReceive,BeginSend ... . V podstatě to funguje podobně jak to máš, také je tam takový skrytý worker thread, ale nemusíš ho ručně psát, jen uděláš funkce které se zavolají při dokončeném načtení nebo zápisu dat, nebo při příjmu spojení. Pro tvůj jednoduchý příklad (příjem a odeslání na základě povelu z GUI) to bude dost možná ještě jednodušší než to máš teď. I když obecně mi to vychází tak asi stejně složité jako ruční worker thread, ale zase se to lépe škáluje kdybys to snad potřeboval. Každopádně doporučuji se na to alespoň podívat.

Ovrscout
C / C++ › Dlouhá aritmetika?
29. 2. 2016   #208978

#9 peter
Mno chaos to možná je, ale dost možná ještě větší než si myslíš.
Původní typy (char,int,long) jsou definované  tak jak jsou definované zřejmně kvůli snadnějšímu portování překladačů(pro portování aplikací to múže být i trochu nevýhoda, záleží jak je aplikace napsaná).
To přiřazení co jsi napsal platí jen na některých platformách/překladačích. Na modernějších překladačích (od C99) je proto, pokud potřebuješ konkrétní velikost typu,lepší používat standardizovaný #include <stdint.h> a typy jako int32_t atp. Mnohdy je to ale jedno a třeba pro for cyklus může být celkem jedno jaký typ číselné proměnné se použije pokud je dostatečně velký. Dokonce může být rychlejší použití int než uint8_t.
Jinak ty knihovny na práci s velkými čísly jsou většinou pro práci s opravdu opravdu velkými čísly kde ti již 64bitů nestačí.

Ovrscout
.NET › zamzrani Serveru TCP/IP
26. 2. 2016   #208896

#1 TD
Mno nějaký pěkný a dobrý tutoriál teď v záložkách nemám, v tom ti neporadim. Každopádně pokud ti to zamrzá tak je prostě nejlepší se podívat kde, použij debuger, logy, příznaky, cokoliv co je po ruce. :)

JInak klasicky čtení,zápis, příjem a někdy i ukončení spojení mohou docela dlouho trvat. tj. Buď je dobré použít Async volání, nebo pěkně jednoduše pro každé TcpSpojení vytvořit vlákno. Teoreticky můžeš zkusit i Socket.Blocking=false, ale to už bych raději doporučil Ten async přístup.

Každopádně pár obecnějších rad k Tcp co mne tak napadá:
-Zkontroluj si nastavení timeoutů, Bývá jich víc(read,write) a na více místech(třeba pokud používáš stream nebo tak).
- Kontroluj návratové hodnoty a při chybě se dle nich řiď, případně si je někde zaloguj.
  Konkrétně třeba Send vrací kolik byte se podařilo zapsat, některé tutoriály to ignorují.
  Obyčejně se to dělá tak že se program zkusí odeslat neodeslaná data znova v nějaké smyčce s vlastním timeoutem.
-nespoléhej se na to že co pošleš jedním zápisem tak na druhé straně vyčteš jedním čtením. Tcp není packetový protokol! i když většinou se to tak chová. Některé tutoriály jsou v tomhle fuj.
-zkontroluj a zajisti řádné uvolňování prostředků(sockety, streamy, async věci) né všeho je v systému nekonečné množství
-Tcp port clienta by mněl být dynamický, statický(pevný) Tcp port je na serveru. To je ověřená konfigurace.
  Pokud se budeš nastavovat oba porty, může ti to fungovat, ale také se můžeš dočkat nepěkných věcí kolem TIME_WAIT a chyb při obnovování spojení(pokud se z nějakého důvodu rozpadne).

-Tcp není vhodné používat stylem připojit-dotaz-odpověď-odopojit. V rámci vteřin nebo i desítek vteřin a více spojení najednou pak může být spousta spojení v TIME_WAIT stavu nebo, což může být horší, k vyčerpání "volných" tcp portů(ok, tohle je trochu zjednodušné ale v kostce je to tak)

Teď trochu více zaměřené na propustnosti a odezvy (na LAN asi není nutné ale pro GPRS, to je jiné káva, ale třeba 3G/4G už zas bývá docela přijatelné):

-Zkontroluj si nastavení velikosti bufferu pro čtení a zápis aby nebyli zbytečně malé(pro většinu  čtených a odesílaných dat), ale nedělej je zas ukrutně velké.

- Data pro odeslání si pokud možno připrav do bufferu a odešli najednou(pokud mají rozumnou velikost do pár kB, 100MB balík dat asi bude lepší posílat po částech nebo přes stream).
Pomůže to snížit počet packetů které v tcp létají sem a tam(i pokud se jen odesílá, tak příchozí strana potvrzuje přijatá data aodeslaných a nepotvrzených dat je jen omezené množství)
-Pokud je komunikace typu dotaz-odpověď tak v kombinaci s předchozím bodem může být vhodné vypnout nagle algoritmus, viz Socket.NoDelay. Někde to zas vhodné být nemusí, např pokud by jsi přímo posílal stisky kláves, tak bych to nechal na nagle a nepsal bych vlastní buffer s timeoutem.

Mno a když nevíš, tak prozkoumej dokumentaci pro použité funkce na msdn, občas se tam najde pár typů nebo komentářů.

Ovrscout
Visual Basic › Prosba o překlad z ASM
13. 10. 2015   #205603

#1 madeindoma
Mno to záleží co je to za překladač pro který je tek kód určen, inspirovat se můžeš třeba zápisem GCC https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s5

Ty dvě řádky s dvojtečkou  se starají o předání Cčkových proměnných z/do asembleru:

Odhaduju že : "z" (__addr16) naplní registr Z hodnotou proměnné addr16 před vstupem do asm bloku.
A : "=r" (__result) zřejmně vezme některý z registrů r (např r0 - výběr je na překladači podle aktuální situace)  ten se vloží do asm kódu místo značky %0 a následně po provedení asm bloku hodnotu z registru uloží do proměnné result.

Ovrscout
.NET › Služba na rozdělování progra…
5. 10. 2015   #205415

#3 Matěj Andrle

Sleep() uvolní procesor až do konce ticku, mluvím o winapi ale předpokládám že to v dotnetu bude podobné. Snadno to zkusíš třeba nastavením čekání na 30sec a kouknout do task manageru :)

omezit proces či vlákno lze nastavením tzv Process/Thread affinity mask, dál už určitě vygooglíš.

Pokud nepotřebuješ předávat data mezi vlákny/procesy opravdu hodně často, tak je lepší nahradit poolování pomocí posílání zpráv nebo synchronizačních funkcí (event,mutex, semafor, a nebo jejich nadstavby), ty totiž předají procesor OS a obnoví se až když je potřeba(tj. druhý proces/vlákno uvolní mutex, atp). Potom už bývá lepší to nechat na OS protože si s tím obvykle už dobře poradí.

Ovrscout
.NET › Nedala by se podmínka rošády…
2. 9. 2015   #204720

#21 Matěj Andrle
hmpf, podle prvního příspěvku mi to nepřijde nějak moc vhodné k zjednodušení na úrovni podmínek. Možná by šlo sloučit některé části podmínek(např selected.X == 0 atp.) a vytvořit tak hlubší vnoření podmínek to by ale na přehlednosti moc nepřidalo a if-ů  by také nebylo méně, ale mohlo by to pomoct rychlostně.
Ale když už jste/jsi nakousl mapu,pole,slovník, Co tak zkusit z toho udělat něco jako seznam tahů

tj. pole ve smyslu: (Omluvte mou klačtinu můj prasozápis v C jakožto názvy,typedef a podobné)

typedef struct {
       //pozadovana vstupni konfigurace
       Point target_in;
       Point select_in;

       //vystup - pokud plati vstupni konfigurace
       Point target_Out;
       Point select_Out;
}TZnamyTah;

TZnamyTah ZnameTahy[]={...ze doplnit...}

Toto pole by se pak jednoduše prošlo a při souhlasících pozicích target a select by se výstup přepsal tím co je v poli uloženo jako out a ukončilo by se procházení, (nebo ne pokud i další položka má stejné vstupní hodnoty).
Jisté optimalizace by se možná dalo dosáhnout pokud by pole bylo setříděno v
pořadí:target_in.x, target_in.y,select_in.x,select_in.y . Potom by se dalo procházení pole "optimalizovat" tak že by se nejdříve našla řádka která má správnou první souřadnici, pak by se pokračovalo kontrolou druhé, třetí, čtvrté.
Nabo případně když už to bude tabulka, tak záznamy vložit do hashtabulky (Hash ze všech vstupních souřadnic),ale zas záleží jak rychlá bude hash funkce a hledání v hashtabulce.
A samozřejmně záleží na počtu podmínek, zda by se to vyplatilo a je nutno to změřit.

Dálší vylepšení mohou být např generování tabulky dle rozměrů a počtu stran místo statické tabulky. A pokud už budete tabulku generovat tak třeba bude možné místo tabulky použít iterátor/generátor ke generování položek za běhu(asi yield nebo tak něco se na to používá) - to ale zas nepoužije hash tabulku.

A kdo ví, možná že z té tabulky bude vidět něco co z toho zápisu s podmínkami není vidět a napadne vás nějaký lepší způsob.

P.S. Teď koukám že v podmínkách je i !=0 (respektive else k ==0). Pro klasickou rošádu (já šachy moc neznám takže dle wiki)musí být obě figurky na výchozích pozicích, čili místo !=0 lze testovat konkrétní pozici.
Pokud by to však bylo nutné pro vaše vícerozměrné šachy tak by mohlo situaci zkomplikovat, nejspíše přidáním příznaku pro "žolíkování" danné souřadnice pro dannou položku pole.

Ovrscout
Java › Priradenie premennej odkazuj…
11. 8. 2015   #204251

#21 Ovrscout
Lépěji řečená první část věty:  Pro mne je význam "pole" spíš bližší pojmu "List", ..

Ovrscout
Java › Priradenie premennej odkazuj…
11. 8. 2015   #204250

Zajímavé,

Pro mne je význam "pole" spíš bližší vašemu seznamu, než "nativnímu" poli hodnot(fyzické uspořádání hodnot v paměti).
I když váš pojem "seznam" mi spíše přijde jako to čemu říkám List(položky s definovaným pořadím přístupné dle indexu). Nebo že by pro vás pojem "seznam" jen obecným označením pro skupinu položek?

Mám malinký problém s prohlášením  §zcela přirozeně používá slova "seznam", ...§ já bych raději řekl list nebo kolekce, protože mi to přijde přirozenější a přesnější než jen seznam, Je ale pravda že asi nejsem tak obyčejný člověk ale programátor, a to jednoho poznamená :) .
Holt jste asi jiná škola a máte své zaběhlé termíny.Takže po zvážení situace, s tím vlastně nemám zase až takový velký problém.

Kdybych slyšel "Dynamické pole zaměstnanců", tak po včerejším pátrání by to ve mně vzbudilo dojem že se nejedná o obecný popis "pole s proměnnou velikostí" ani "dynamicky alokované pole) ale o konkrétní typ datové struktury - viz ta en wiki čili prakticky ArrayList.

Přiznávám se že historicky asi tíhnu k strukturovanému programování.

Každopádně děkuji za reakci. Teď už snad víceméně rozumím jak jste to myslel.

Ovrscout
C / C++ › C++ - detekce zda do proměnn…
10. 8. 2015   #204230

#2 ls2015
Mno nejsem uplne odbornik na tuto (c++, konzole) ale podle meho odhadu program selze uz v casti cin >> volba kde se pokusi prevest znak/znaky z klavesnice na cislo. a protoze se to nepovede tak ani neulozi novou hodnotu do "volba".

zkusil bych něco na způsob http://stackoverflow.com/…ecking-error

 

if (cin >> volba)
{
 cout <<"dobra volba"<<endl
}else
{
 cout <<"Spatna volba"<<endl
 cin.ignore();
 cin.clear();
 volba=-1;
}

Případně zkusin načíst z cin nikoliv číslo ale znak/znaky, (místo int použít char? jen hádám), a pak porovnávat ne na číslo ale na znak tj n2co jako : if(volba == '7') 

Taky jukni sem http://stackoverflow.com/…from-cin-get
 , aby ti nezůstávali v cin frontě znaky odřádkování.

Ovrscout
.NET › C#: rozdiel medzi ref a out
7. 7. 2015   #203468

Zajímavé oživení vlákna z roku 2009 :)

Jinak pokud bych to mněl říci selsky jednoduše tak je to dle mne takhle:

out se použije pokud předáváme data z metody ven (tj na vstupu funkce je daný parametr neinicializován)
ref se použije pokud předáváme data dovnitř i ven   (tj hodnota se předává jak do funkce tak ven)

Jinak samozřejmně implementační detaily (jako co kdy se inicializuje, kopíruje nebo že se odkazuje adresou) jsou velmi důležité. Ale pro pochopení základní myšlenky( k čemu to vlastně je dobré) u začínajícího programátora jsou občas trošku složité(pokud se má brát ohled na všechny detaily) a je třeba se k nim propracovat postupně.

Ovrscout
C / C++ › Vzájemné includování hlaviče…
12. 6. 2015   #202878

#3 Lukáš
Překladač neví kolik má pro tu proměnnou "B" vyhradit  místa pokud není plně definována.
Můžeš to ale obejít tak že použiješ ukazatel(ten má celkem jasnou velikost):

class B;


class A
{
...
	B *otherclassdata;
...
};

Samozřejmně když budeš chtít s "B" pracovat, tak musíš mít v .c souboru includnuté oba hlavičkové soubory.

Ukazatel je třeba správně inicializovat, několik základních možností:

  • v konstruktoru se objekt vytvoří (pomocí new) a adresa se přiřadí do B
  • Do konstruktoru předáš odkaz na existující objekt a jen jej přiřadíš do proměnné B
  • Nebo "odkazem" mezi objekty vytvoříš později. Pomocí funkce Registruj nebo Propoj cizí objekt
    (v konstruktoru ale doporučuju B vynulovat a tam kde se používá kontrolovat zda je správně nastavena (tj. není nula)

Je třeba táké dát pozor na to jak se budou objekty uvolňovat, pokud je v konstruktoru vytvoříš tak v destruktoru uvolníš, to je jasné/snadné. Ale Pokud máš vazbu odkazem, je vhodné ji správně přerušit dokud oba ojekty existují, a nebo použít něco jako chytré ukazatele (smart pointers).

Případně se na to podívat z jiného úhlu, nějak nepřekopat abys to nemněl takhle křížem.
Např tak že třídy se nebudou vnořovat ale budou spolu komunikovat přes nějaké rozhraní(eventy,notifikace,roura,fronta,..)  nebo že společný kód přesuneš do jiné třídy kterou pak budou obě vkládat . Možná se i zamyslet zda by nešla použít dědičnost (tj obecný společný předek a jeho specializace A,B)
Tohle se obecně nedá dost dobře říci, záleží na konkrétní situaci jak si s objekty pohrát

Ovrscout
Mikrokontroléry › arduino ethernet http GET re…
10. 6. 2015   #202851

#4 Pavel
Střelba od boku: Zkus do "Host: localhost" zadat skutečnou ip adresu nebo DNS jméno pokud přes něj přistupuješ.
Jinak, jak psal Kiv, ověř si že řetězec co posíláš je správný, nejdřív si jej sestav v paměti(stringu,poli,..) třeba ulož do souboru,  nebo ho zkoukni v debugeru. Hlavně jestli jsou na konci ta odřádkování dvě(aby ti je to nějak automaticky nesloučilo :) ).

Pokud můžeš(server běží u tebe), zkus vysledovat komunikaci mezi serverem a arduinem pomocí programu wireshark.Tam si můžeš porovnat to co posílá arduino a co webový prohlížeč.

 

Ovrscout
C / C++ › Čítanie impulzov z CTS na RS…
25. 5. 2015   #202449

Souhlasim s hlucheucho, jakekoliv přesné časování na windowsech je ošidné, klidně se může stát že systém přepne ne jiný proces a program se na pár desítek až stovek ms zastaví než bude pokračovat. Může se to lišit pc od pc a od ovladače k ovladači, hodně záleží jak douhá bude ta komunikační smyčka. Je pravda že se to nemusí stávat moc často a dá se různě laborovat, ale hledat pak chybu není nic moc. Určitě je mnohem spolehlivější a jednodušší použít klasický Uart.

Ohledně USB existují integrované obvody převádějící USB na Uart(většinou TTL, nikoliv RS232).
Výhoda je že k tomu mají ovladače a i v PC se to pak tváří jako Seriový port (takže není nutno měnit aplikaci v PC).
Mezi známé a celkem ověřené patří FTDI. http://www.ftdichip.com/FTProducts.htm
Existují i hotové kabely nebo moduly ale bývají patřičně dražší než samotný čip.

Ovrscout
C / C++ › Best practice - Načítání bin…
30. 3. 2015   #200883

#4 ondra.holub
Tak endianita mi na mysl nepřišla, rep. tazatel se neptal  :)
To už pak řeším nějakou funkcí které předhodím ukazatel na strukturu a jednu položku po druhé překonvertuju.

Je to obecně nějaká taková fujky C ošklivost:
 

static void SwapByteOrder(unsigned char *d,int size)
{int i;
 unsigned char c;
 if (size<=1)return;
 for (i=0;i<size/2;i++)
  {
   c=d[i];
   d[i]=d[size-i-1];
   d[size-i-1]=c;
  }
  return;
}

#define Swap(A) SwapByteOrder((void*)(&A),sizeof(A))
//Swap struct
void SwapMUSHeader(MUSHeader *pData)
{
    _Static_assert(sizeof(*pData)==534);
        Swap(chans);
    Swap(pData->freq);
    Swap(pData->ssize);
    Swap(pData->blck);
    Swap(pData->resv);
    Swap(pData->bla);
    for (int i=0;i<sizeof(pData->amplt)/sizeof(pData->amplt[0]);i++)
    {
     Swap(pData->amplt[i]);
    }
    return;
}

#5 Judegarek
Myslím že původní dotaz je mířen na soubor s již existujícími daty v nějakém konkrétním formátu.
Předpokládám že data pocházejí z jiného programu který má pevný výstupní formát.
Po zběžném kouknutí myslím že protocolbuffers má vlastní vnitřní formát dat takže "Raw" data takto zpracovat nejdou.
Ale zatím jsem s ním ještě nepracoval, pokud na to je nějaký fígl,tak mne kdyžtak prosím opravte.

Ovrscout
C / C++ › Best practice - Načítání bin…
27. 3. 2015   #200771

Nejjednodušší je vynutit/vypnout padding pro dannou strukturu..
např gcc:

#pragma pack(push,1)
typedef struct {
..
} MUSHeader;
#pragma pack(pop)

Pro různé překladače se zápis může mírně lišit.
Číslo v pack udává na kolik byte se zarovnává, 1=jeden byte tedy bez paddingu

Ovrscout
C / C++ › Problém s výkonem - procháze…
20. 2. 2015   #199428

hmm, bez celého kódu včetně výsledků měřen nad stejnými daty se těžce radí,nicméně:

Pro cyklus se většinou používá int i když by stačilo něco menšího,protože výpočty s ostatními typy bývají pomalejší (nebo stejně rychlé) a paměť se také většinou neušetří, protože taková proměnná cyklu by mněla být buď v registru(hlavně v release režimu, s optimalizací) a ten má stejnou velikost bez ohledu na to co v něm je (víceméně) a nebo je někde na stacku a to také nebývá problém.
Každopádně použití něčeho jiného než int/unsigned int mi přijde jako předčasná optimalizace pokud nemáš změřeno že to dává lepší výsledky. A nebo nemáš nějaký jiný důvod, např int je příliš malý nebo potřebuješ cyklovat nad floatem atd.

Když vidím  rev_delta = 1.0 / delta , tak by mne zajímalo, zda je nějak zajištěno že delta nebude nula.
To by pak mohlo dělat různé zajímavé věci, a mohlo by to mít i vliv na výkon.

JInak by stálo za to porovnat výkon těch algoritmů v release režimu se zapnutými optimalizacemi (-O2)
Nad stejným obrázkem(i když třeba u jpg se díky ztrátové kompresi se můžou data rasteru od ostatních lišit).
Ono se to v release režimu a s optimalizacemi může chovat dost jinak, a možná to ani nebude třeba dál řešit.

Ovrscout
C / C++ › FTP Klient - Upload souborů…
25. 11. 2014   #196434

jen tipuju, ale možná je potřeba nastavit typ přenosu na binární. FTP povel "binary" nebo tak nejak. Jinak může dojít ke konverzi. také je dobré kouknout na ten soubor např v hexa editoru, je divné že by tam nebyli žádné konce řádek. Spíš budou nahrazeny znakem /n nebo /r který může být v některém prohlížeči souborů ignorován pokud není v páru /n/r případně /r/n. Také je možno monitorovat přímo TCP komunikaci pomocí wiresharku.

Ovrscout
C / C++ › Delenie 2 float-ov
12. 11. 2014   #195977

#6 Ovrscout
ještě doplním sám sebe :)

v určitých případech se i při počítání s float/double může stát že hodnota výpočtu je jakoby přesnější nebo odlišná než odpovídá ručnímu přepisu/přepočtu. Fígl může být ukryt v tom že procesory (často) nepočítají ve float/double ale mají mají hodnotu uloženou ve více bitech (třeba 80bit proti 64bit v double) a když to překladač řádně zaoptimalizuje (a nebo taky nezoptimalizuje) může být výsledek překvapující. Čili pak už jen zbývá debugovat až do asembleru a zobrazovat si hodnoty v hexa místo promocí prinf :)

Jinak dobrou (ale jen orientační) pomúckou je uvažovat počet platných dekadických číslic, např pro float je to 7(7.2) a pro double 15(15.95).   např ve floatu je číslo 9`999`999, nebo 99`999`900 je v pohodě ale 9`999`999.1 nebo 99`999`999 už se dobře uložit nedá. Je to ale jen orientační, zkuste si třeba číslo 1E10 a 1E11 (v tom online konvertoru).

Ovrscout
C / C++ › Delenie 2 float-ov
12. 11. 2014   #195976

#3 lukas.balaz
Pokud jde o funkce s proměnným počtem parametrů jako třeba printf je float hodnota "vždy" přetypována/překonvertována na double a pak teprve předána do té funkce, přkladač to dělá automaticky a nelze se tomu vyhnout, vychází to z normy pro céčko. Z toho vyplývá že specifikátory %g a %f  pracují pouze s typem double. Teoreticky se pak může stát že při konverzi z floatu na double dostanete trochu jiné čislo.

Prakticky je třeba vědět na kolik počet desetinných bylo číslo zadáno,/změřeno/spočítáno, nebo na kolik desetinných míst se má zobrazit. Ta automatika se totiž v některých případech může chovat dost divně, protože určit počet platných míst z neceločíselné hodnoty uložené jako float/double není tak jednoduché jak se zdá. Hlavní problém je že číslo není uloženo s desetinnou čárkou ale s "dvojkov-nou" čárkou (čárka v zápise ve dvojkové soustavě).

Na hraní jsou dostupné online nástroje jako třeba http://www.h-schmidt.net/…IEEE754.html
Schválně si zkuste vyplnit čísla 0.1 a  1000000.1 :)

Ovrscout
OS - Windows › W7 instalace služby - error…
20. 8. 2014   #193231

#3 hlucheucho

Jde ale nastavit ve vlatnostech souboru (či jeho zástupce) aby vyžadoval spuštění jako správce.
Je to na záložce kompatibilita.

Při spuštění tak vyjede okénko vyžadující potvrzení "spuštění jako správce" automaticky - není potřeba to naklikávat přes menu.

Alternativně by ta výzva mněla jít dodělat i do toho programu, ale s tím nemám zkušenost. Zkus googlit něco jako user rights elevation nebo tak něco. Nebo možná by to šlo i přes soubor .manifest ale to už spíš jen hádám.

Ovrscout
OS - Windows › W7 instalace služby - error…
20. 8. 2014   #193227

#1 hlucheucho
Rychlá střelba od boku,nebylo to "spuštěno jako správce". což není totéž jako pracovat pod účtem s administrátorským oprávněním.V nabídce start/průzkumníku si najdi cmd.exe a pomocí pravého tlačítka vyvolej menu, tam je spustit jako správce. potom už spusť příkaz viz výše.
Jde i vytvořit zástupce s tímto nastavením pokud to budeš dělat častěji

Pokud to nezabere tak bude zřejmně problémek jinde.

Ovrscout
.NET › Zbytečná alokace aneb nevýho…
14. 8. 2014   #192981

Tys tím pracuješ spíše jako se strukturou kterou předáváš do funkcí Load/Save.

Pokud nechceš pořád kopírovat/alokovat tak nejdřív jednorázově vytvoř instanci objektu Map (
Map mojemapa = new Map();),
a poté nad touto instancí volej funkce load/save (ale ne static public ale jen public funkce)
které pracují přímo s dannou instancí, takže ten objekt nemusíš předávat dovnitř/ven ale přímo s ním pracuješ:
  -  mojemapa.Load(string fileName, int width, int height)
     {this.Content = new byte[width, height];..}; //nebo bez "this."
  - mojemapa.Save(string fileName, int width, int height, sbyte direction);
  - mojemapa.content ..

Detaily se pak můžou různě lišit, např jestli dovolíš jen jeden load(a s tím spojenou alokaci content) nebo umožníš více loadů a budeš content používat opakovaně(nebo ho přealokuješ pokud nebude dost velký), load v konstruktoru atd atd.

Také mi přijde že dialogová okna pro výběr souboru by mohla být někde jinde (v hlavním objektu fromuláře/okna/aplikace) a tuhle třídu nechat jen uchovávat, zpracovávat a načítat/ukládat data.
Ale to už záleží i na zbytku tvého projektu.

P.S. Jeste bude asi potreba dopnit konstruktor a destruktor pro inicializaci a uvolneni pameti(Content)
P.P.S. nejsem zrovna c# ani oop guru, tak to ber z rezervou, a radši koukni do nějaké pěkné knížky

Ovrscout
PHP › Co jste možná nikdy neřešili
9. 1. 2014   #186139

nemůžu odolat a trosku si taky zaflejmuju tady :)

1)Pokud chcete dělat nízkoůrovňové optimalizace tohoto typu nebude php zrovna vhodné. (asi jako vodní dělo na zalití malého květináče). Skuste C/C++ či asembler tam jsou takovéto optimalizace jednodušeji realizovatelné, používají se a někdy mají i smysl.

2)String je obecně entita která umožňuje udržovat a pracovat s krátkýmy i dlóóouhými řetězcy znaků které nejde je ve "Stroji" vyjádřit a zpracovávat jako jedno jediné číslo. Jak už někdo psal tak do největšího registru ,čísla s kterým umí stroj pracovat (64bitů), se vejde jen pár znaků. 2..8 podle použitého kódování. Proto se s Stringem ve stroji pracuje jako s polem hodnot/bajtů nikoliv jako s jedním číslem. Jinak řečeno "Stroj" není ideální matematický aparát ale má konkrétní možnosti a omezení. Takže například neumí přímo počítat(+,-,*,/,...) s tisícibitovými hodnotami. To už je pak zálečitostí různých chytrých algoritmů který takový výpočet provádějí po částech, v extrémním případě jako je tento si představte funkci substr.

3)Doporučuji rozšířit repertoár matematických operací o bitové AND,OR,XOR,LSHIFT,RSHIFT.  Pro Stroj jsou většinou výrazně efektivnější a pro člověka je to mnohem pochopitelnější. Také pro zápis dloouhých čísel se často používá hexadecimální soustava.  Obzvlášť ve spojení s funkcemi výše se pak dají dělat jednoduše různá kouzla.

Nadruhou stranu než dělat čtyři matematické operace nad číslem, je pro Stroj mnohdy jednoduší a rychlejší přistoupit k části toho čísla jako k 8bitové/1bajtové hodnotě (v RAM jsou čísla uložena,a jdou adresovat, po jednotlivých byte) a udělat jednu jednoduchou operaci (jako například při změně hoj na doj) stačí odečíst od první byte řetězce číslo 4.

4)Jednoduchost matematických operací je možná jen pokud je string jednoduše vyjádřen vnějakém pevném kódování 1znak=Nbyte nebo obecně Nbit kde N je konstanta např ASCII/UTF32. Zkuste kouknout na UTF8 kde jsou znaky v řetězci(Stringu) vyjádřovány různým počtem bitů/bajtů.
Třeba mne ale jako nematematika překvapíte.

Ovrscout
C / C++ › TXT soubory + replace
6. 11. 2013   #183398

#8 Ovrscout
omlouvám se, na konci má být  acc_*.ini
sfk.exe filt -spat -lswhere "money*=*\"" -rep "_\"*\"_\"3000\"_" -dir . -file acc_*.ini

a se zápisem
sfk.exe filt -write -yes -spat -lswhere "money*=*\"" -rep "_\"*\"_\"3000\"_" -dir . -file acc_*.ini

Ovrscout
C / C++ › TXT soubory + replace
6. 11. 2013   #183397

#7 Patrik

Pokud si to nechcete psát celé sám, dobrý nástroj na práci s textovými soubory je sfk: http://stahlworks.com/dev/swiss-file-knife.html

občas je problém najít v těch desítkách funkcí co to umí tu správnou, ale běží opravdu rychle.

příkaz pro nahrazování zhruba toho co potřebujete
(nezapisuje změny do souborů, jen vypíše "změněné" řádky na obrazovku - pokud konzole umí tak barevně)
sfk.exe filt -spat -lswhere "money*=*\"" -rep "_\"*\"_\"3000\"_" -dir . -file *.ini

Pro povolení zápisu do souboru doplnit -write -yes  za sfk filt
sfk.exe filt -write -yes ...............................

Varování:občas tomuto programu dělá problém řetězené vzájemné nahrazování:
např. nahradit v "1234" řetězec "23" za "14" a zároveň naradit řetězec "11" za "44". Výsledek by mněl být 4444 ale někdy je, a jindy není :), takové věci je lepší zpracovat na více průchodů souborem, pak je to spolehlivé.

Ovrscout
C / C++ › Pekelný assembler
22. 10. 2013   #182660

#1 Sefiros

Nejsem extra odborník ale vidím to takto:

Krátká odpověď:

rep movs bude tím efektivnější čím více toho bude kopírovat. Pokud snížíte počet průchodů prvního cyklu a zvětšíte počet kopírovaných položek (například tisíckrát nebo milionkrát) měl by být čas s for cykly delší a s rep movs kratší.

Dlouhá odpověď:

Program s for cykly má všechnu režiji(z obou cyklů) strčenou ještě před začátek prvního cyklu.
Do registrů se načtou adresy polí a počty opakování. V samotných cyklech se už jen projíždí cykly a kopíruje paměť. žádné zbytečné operace. Sice se určuje adresa přístupu do paměti při čtení i zápisu ale je to v rámci instrukce přístupu do paměti, takže si stím procesor zřejmně poradí rychle.
Díky tomu že je kód malý a vejde se do chashe procesoru a díky dalším vlastnostem proseoru(jako předvídání skoků atp)  tak může program proběhnout rychle.

V druhém případě je pak v každém průchodu prvního cyklu prováděna kompletní inicializace pro druhý cyklus. To jest: Výpočet adres (2*LEA + 2*MOV) aby se pak spustila optimalizovaná verze for cyklu(rep movs)

rep movs totiž není nic jiného než provádění cyklu, jen to není napsáno v několika instrukcích, takže procesor ušetří čas s jejich dekódováním. Všechny ty inkrementace adres ,dekremantace počítadel, porovnání na konec cyklu a kopírování paměti se ale tak jako tak provádějí.
Nastavení výchozí stavu cyklu ale několik instrukcí stojí. Ten počet instrukcí je víceméně pevný a při několika stovkách nabo ticíci průchodeh je proti ušetřenému času zanedbatelný. Pokud ale použijete tuto funkci(rep movs) pro (v extrémním případě) zkopírování jednoho bajtu bude režije pro inicializaci větší než co uspoříte.
Je to podobné jako mít for cyklus pro kopírování (v extrémním případě) jednoprvkového pole.
Jednoduché přiřazení bude prostě rychlejší.

Bylo by zajímavé znát čas zpracování pokud by se podařilo přesunout lea instrukce před první cyklus.
Možná pomohlo zapnout nějakou drastickou optimalizaci, která by to mohla zvládnout, ale asi by se musel celý cyklus přepsat do asm.

Ovrscout
C / C++ › Správce úloh - využití paměti
10. 10. 2013   #182178

#1 hoacin

Zobrazit pamět kterou nějaký programem je trošku problém, protože existuje více ůhlů pohledu na to co je využitá paměť . Pohybuje se to od "přidělený adresový prostor" což je to co se rozšiřuje alokací, až do "aktuálně využívaná a namapovaná paměť" což by mnělo být to co program aktuálně využívá a není to  odloženo do souboru virtuální paměti.  (zjednodušené a asi né moc přesné)

V správci procesů máš pravděpodobně zobrazenu jen "používanou" paměť. Pro zobrazení "alokované" paměti je třeba ve správci procesů přidat další sloupec. V různých windows se to jmenuje různě, např pracovní sada, virtuální paměť atp. Mělo by to být někde v menu "Zobrazení->přidat sloupce".
Nejsem si jist jestli tohle umožňuje správce ůloh v WinXP ale od vist výše tam jde zobrazit spoustu informací.

Další možností je použít procexp,vmmap,Rammap z sysinternalssuite http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx ale tam už je informací možná až zbytečně moc :)

mimochodem v  sysinternals je spousta pěkných prográmků (a některé nástroje jsou mocné:) takže opatrně)

Ovrscout
C / C++ › chyba kompilátoru
8. 9. 2013   #181167

#6 Adam108

V menu dej File->New project->console application , pak se spustí průvodce, kde kromně nastavení adresáře pro projekt je jedna z voleb C/C++

Ovrscout
C / C++ › chyba kompilátoru
7. 9. 2013   #181145

#1 Adam108
Devc++ už není pokud vím nějakou dobu podoporován (udržován) , takže předpokládám hodně starou verzi překladače (mingw?), což se sice nejspíše dá nahradit ale konfigurace mingw není úplně triviální.Takže bych spíše doporučil se poohlédnout po nějakém jiném IDE.

Doporučil bych buď MS visual studio a nebo CodeBlocks.

Pokud máte averzi k visual studiu (přeci jen je to opravdu docela velký moloch) tak je Codeblocks je celkem slušná volba (k devcpp má rozhodně blíže). Má spoustu užitečných funkcí a přitom je to celkem jednoduchý a malý.
Součástí instalátoru pro Windows je i překladač Mingw, vše se nastaví automaticky a mně to vždy hned fungovalo. No a pokud je třeba tak se pak dá mingw použít i z příkazové řádky stejně jako gcc.

(možná bych doporučil DevC nejdříve odinstalovat , aby se obě verze Mingw nepoštěkali :)

Ovrscout
C / C++ › Vícevláknové
10. 6. 2013   #177752

Ono záleží na architektuře procesoru použitém OS, počtu spuštěných aplikací které využívají procesor atp.

Ale obecně není zaručeno že pokud se operace provede jednou instrukcí tak je to na na více jádrovém(nebo více procesorovém) procesoru atomická operace. Na atomické operace jsou extra instrukce(např LOCK CMPXCHG). A existuje několik vrstev mezipamětí(Cache) na procesoru které mohou a nemusí mít vliv. Pro googlování doporučuji zajímavý termín "memory barier"/"memory fences".

Určitě je to všechno moc zajímavé a poučné k nastudování, nicméně pro reálné použití v programu je přímé použití nebezpečné a já už se raději držím zaběhnutých připravených primitiv (mutext, kritická sekce, semafor,...). I s těmi se dá užít spousty zábavy u hledání problémů typu deadlock,livelock atp. které se projevují třeba jen jednou za měsíc nebo jen na konkrétním stroji.

Zamykat zAmykat zaMykat. Ostatně pro většinu vícevláknových aplikací jsou Kritické sekce, (a nepojmenované mutexy) dostatečně efektivní, případně se dají použít v kombinacích s semafory a eventy.
V opačném případě je třeba skusit spíše (tak tomu říkám já) "tzv. paralelní programování"  s pomocí OpenMP,OpenCL.
(tj, já říkám vícevláknové pokud jde o vlákna která víceméně pracují samostatně déle než 0.4..10sec, a paralelní pokud se snažím paralelizovat i vlemi krátké úseky kódu (např cykly atp))
 

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý