reklama

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 - x14

Stran: [1] 2 3 ... 12
1
Vývoj / Re:C nebo Rust?
« kdy: 11. 09. 2018, 16:07:39 »
C? Ani náhodou! Když už tak C++.

2
Vývoj / Re:Old C++ VS C++11, 14, 17
« kdy: 04. 09. 2018, 14:05:33 »
Moderní C++ znamená, že jsem si v týmu prakticky zakázali new/delete.
Z boostu používám snad už jen wformat, jinak se držím STL.

3
Vývoj / Re:Jak můžu opustit funkci
« kdy: 17. 07. 2018, 12:52:31 »
Ok, takže znovu: Prosím vás, už nekrmte ty trolly.

4
Vývoj / Re:Jak můžu opustit funkci
« kdy: 16. 07. 2018, 16:05:45 »
Ok, takže znovu: Prosím vás, už nekrmte ty trolly.

Proč? Je to sranda, Jirsák jim docela dává :D
Jeho práci většinou oceňuji, ale ne v tomto případě. Zde je to zbytečné. Opakuji, je to zbytečné.
Jen se tak dostává více prostoru nekonečným blábolům o programování ve stavu nejhorší nouze.
Doufám, že to nečte původní tazatel, jinak se programovat nikdy nenaučí.

5
Vývoj / Re:Jak můžu opustit funkci
« kdy: 16. 07. 2018, 15:44:19 »
Ok, takže znovu: Prosím vás, už nekrmte ty trolly.

6
Vývoj / Re:Jak můžu opustit funkci
« kdy: 16. 07. 2018, 15:08:17 »
Bože už zas?
Použití break, continue, goto a return je v C naprosto normální!
Prosim vás, už nekrmete ty trolly.

7
Vývoj / Re:Jak můžu opustit funkci
« kdy: 14. 07. 2018, 00:08:26 »
Tou korektnostou myslim to, ze program nespracuva zle vstupy, ale proste ich zahodi. (pripadne sa zjebe pri zlych vstupoch, to je ten horsi pripad)
Znělo to tak honosně a přitom jde jen o část zadání úlohy. Ovšem pokud je to postaveno vedle robustnosti programu (která je pro slušný program bezpodmínečná), tak je jasné, jak autor myslel "veci ako break, continue, goto by sa mali pouzivat v stave najhorsej nudze".

8
Vývoj / Re:Jak můžu opustit funkci
« kdy: 13. 07. 2018, 15:48:22 »
Nebylo by vhodnější to makro pojmenovat assert?
To by určitě nebylo, když to není assert. Nápověda: assert se v release kódu odstraňuje.

9
Vývoj / Re:Jak můžu opustit funkci
« kdy: 13. 07. 2018, 15:43:41 »
K čemu je dobré na začátku nulovat proměnné?
Přece abych za exitusem nevolal free(mem) na náhodou adresu, nezavíral soubor, k jehož otevření nikdy nedošlo...

10
Vývoj / Re:Jak můžu opustit funkci
« kdy: 13. 07. 2018, 14:14:49 »
Já jsem tak rád, že nemusím dělat v C. V C++ dělám vše 100 % RAII a utéct z funkce můžu kdykoliv - uklízí destruktory.

V C jsem většinou dopadl tak, že jsem na začátku měl vynulované všechny proměnné a jednu stavovou proměnnou (často jen bool success=true) a kousek před koncem funkce label se jménem exitus, na který jsem skákal při předčasném ukončení. A za ním už byly jen samé delete, free, closehande, closefile...

Bylo to přehledné a bránilo to opomenutí v případě nečekaného selhání. Jiné goto než goto exitus jsem nikdy nepoužil a tento skok v naprosté většině případů znamenal chybu.
A zdroják pak byl čistě takto:
Kód: [Vybrat]
mem = alloc(...);
if(!mem)
{
     succes = false;
     goto exitus;
}

11
Vývoj / Re:Jak můžu opustit funkci
« kdy: 13. 07. 2018, 12:49:15 »
Chybí tomu větve "else" s ošetřením chyb, které budou nejspíš úplně vespod, aby je nikdo nenašel.

Nechybí. To může být na vyšší úrovni. Třeba zrovna včera jsem dělal ovladač HW, který běží ve vlastním vlákně a init vypadal (zjednodušeně) asi takhle:
Kód: [Vybrat]
error_t initDriver(struct params* params) {
  // Parametry jsou povinne
  if(!assigned(params)) return ERR_INVALID_PARAMS;

  // Potrebujeme frontu pro komunikaci
  queue = queueCreate(dataType, size);
  if(!assigned(queue)) {
     releaseMem();
     return ERR_OUT_OF_MEMORY;
  }
 
  // Potrebujeme mutex pro zamykani HW
  mutex = mutexCreate();
  if(!assigned(mutex)) {
     releaseMem();
     return ERR_OUT_OF_MEMORY;
  }

  // Init zeleza
  if(!hwInit()) return ERROR_HARDWARE;

  // Ted muzeme udelat vlakno pro obsluhu
  threadHandle = threadCreate(funkce, priorita, stack);
  if(!assigned(threadHandle)) {
     releaseMem();
     return ERR_OUT_OF_MEMORY;
  }

  // Init
  ...
  // Hotovo
  return ERROR_NONE;
}

Víš, jaký by to byl binec Balkiho stylem? A opravdu by nestačil jeden return, protože v tomhle se i jednoduše zaručí, že pokud není paměť, nebude se pokoušet tvořit další objekty...

Nechybí ti tam náhodou releaseMem() ve větvi if(!hwInit()) ?
BTW: Ten mutex, thread a queue není třeba uklízet?

12
Vývoj / Re:Je utf8 univerzální?
« kdy: 05. 07. 2018, 05:40:27 »
Jakmile to má na začátku 'u', tak je to v cajku.  ;D
Pak to je to nejspíš Unicode a Unicode je jen jeden. Co v něm není, není.
A Číňani jsou připraveni na to, že tam může něco chybět. Mají to tak rádi. Rozhodně se to nemůže stát u normální čínštiny.
Různé UTF jsou jen otázka přesypání dat. Nic se nemůže ztratit. To číslo v podstatě znamená po kolika bajtech se má konzumovat vstup, aby se na náhodou nepřešlo ukončení textu.
UTF8 je pro nás super, protože vypadá jako ASCII. Pokud by v tom měl být delší 'asijský text', tak to asi bude zbytečně prodlužovat.
Jenže, těch pár bajtů nikoho to nezajímá  :) :) :) Nebo zajímá?
http://utf8everywhere.org/
Doporučuji hlavně bod 3.

13
Tak to pozor, nodefautlib je opravdu hardcore volba. Nejde ani tak o to, že pak chybějí funkce z kernel32, user32, gdi32...
Ale hlavně tam není ani žádný runtime msvcrt.lib (pro C) a msvcp.lib (pro C++).
A to se pak dějí věci - NIC nefunguje! Chybí "entry point" - nikdo nezavolá winmain, nefungují floaty, globální proměnné nejsou přiřazené/nemají zavolané konstruktory, ...

Má to smysl asi jen pro pro dva speciální případy:
  • Generování co nejkratšího exáče z MSVC (dá se dostat na jednotky KB)
  • Eliminace něčeho, co je před WinMainem (např. natvrdo nastavené HeapSetInformation s HeapEnableTerminationOnCorruption, které už se nedá nikdy odvolat)
----------------------
P.S.: Samo se to tam určitě nenastavilo  ;)

14
Hned bych zkontroloval, zda není náhodou zapnuté Ignore All Default Libraries (/NODEFAULTLIB).
I s tím se to dá provozovat, ale pak je zapotřebí ručně nařídit import i takové "samozřejmosti" jako Kernel32.lib.
BTW Není potřeba to dopisovat do nastavení projektu, stačí do nějakého .cpp někam přidat následující zaklínadla. Někdy to má své výhody.
Kód: [Vybrat]
#pragma comment(lib,"Kernel32.lib")
#pragma comment(lib,"Gdi32.lib")

15
Takže - nejde o problém s kompilací, ale s linkováním. Použití metody pokus/omyl při hlášce linkeru "unresolved external symbol" není vůbec dobrý nápad. Náhodné matlání s Shell32.lib je čistá ztráta času.
Kousek za touto hláškou je napsáno přesně, co ten linker nemůže najít - nejspíš to bude funkce (a za ní bude jméno funkce odkud tu chybějící voláš).
Bohužel tuto klíčovou informaci jsi z chybové hlášky odmazal :(

Stran: [1] 2 3 ... 12

reklama