Ubuntu 26.04 patrně bude ve výchozím nastavení zobrazovat hvězdičky při zadávání hesla příkazu sudo, změna vychází z nové verze sudo-rs. Ta sice zlepší použitelnost systému pro nové uživatele, na které mohlo 'tiché sudo' působit dojmem, že systém 'zamrzl' a nijak nereaguje na stisky kláves, na druhou stranu se jedná o možnou bezpečnostní slabinu, neboť zobrazování hvězdiček v terminálu odhaluje délku hesla. Původní chování příkazu sudo
… více »Projekt systemd schválil kontroverzní pull request, který do JSON záznamů uživatelů přidává nové pole 'birthDate', datum narození, tedy údaj vyžadovaný zákony o ověřování věku v Kalifornii, Coloradu a Brazílii. Jiný pull request, který tuto změnu napravoval, byl správcem projektu Lennartem Poetteringem zamítnut s následujícím zdůvodněním:
… více »Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 163 (pdf).
Eric Lengyel dobrovolně uvolnil jako volné dílo svůj patentovaný algoritmus Slug. Algoritmus vykresluje text a vektorovou grafiku na GPU přímo z dat Bézierových křivek, aniž by využíval texturové mapy obsahující jakékoli předem vypočítané nebo uložené obrázky a počítá přesné pokrytí pro ostré a škálovatelné zobrazení písma, referenční ukázka implementace v HLSL shaderech je na GitHubu. Slug je volným dílem od 17. března letošního
… více »Sashiko (GitHub) je open source automatizovaný systém pro revizi kódu linuxového jádra. Monitoruje veřejné mailing listy a hodnotí navrhované změny pomocí umělé inteligence. Výpočetní zdroje a LLM tokeny poskytuje Google.
Cambalache, tj. RAD (rapid application development) nástroj pro GTK 4 a GTK 3, dospěl po pěti letech vývoje do verze 1.0. Instalovat jej lze i z Flathubu.
KiCad (Wikipedie), sada svobodných softwarových nástrojů pro počítačový návrh elektronických zařízení (EDA), byl vydán v nové major verzi 10.0.0 (𝕏). Přehled novinek v příspěvku na blogu.
Letošní Turingovou cenu (2025 ACM A.M. Turing Award, Nobelova cena informatiky) získali Charles H. Bennett a Gilles Brassard za základní přínosy do oboru kvantové informatiky, které převrátily pojetí bezpečné neprolomitelné komunikace a výpočetní techniky. Jejich protokol BB84 z roku 1984 umožnil fyzikálně zaručený bezpečný přenos šifrovacích klíčů, zatímco jejich práce o kvantové teleportaci položila teoretické základy pro budoucí kvantový internet. Jejich práce spojila fyziku s informatikou a ovlivnila celou generaci vědců.
Firefox 149 dostupný od 24. března přinese bezplatnou vestavěnou VPN s 50 GB přenesených dat měsíčně (s CZ a SK se zatím nepočítá) a zobrazení dvou webových stránek vedle sebe v jednom panelu (split view). Firefox Labs 149 umožní přidat poznámky k panelům (tab notes, videoukázka).
Byla vydána nová stabilní verze 7.9 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 146. Přehled novinek i s náhledy v příspěvku na blogu.
Řešení dotazu:
long long int i; signed long long int j; unsigned long long int k;Pokud nechceš long long int, ale přesně 64bitový integer, tak (špičaté závorky nepíšu, protože to je tu k naštvání)
#include stdint.h int64_t i; uint64_t j;Pokud nechceš long long int, ale alespoň 64bitový integer, tak
#include stdint.h int_least64_t i; uint_least64_t j;Pokud nechceš long long int, ale co nejdelší integer, tak
#include stdint.h intmax_t i; uintmax_t j;long long int má formátovací modifikátor ll, (u)intmax_t má modifikátor j, vše uvedené vyžaduje alespoň ISO C99 (případně rozšíření kompilátoru ve starším C), pro typy s přesnou délkou formátovací modifikátory neexistují. Pokud potřebuješ fakt velké integery, použij GMP.
ostream je super věc a kdo si to komplikuje používáním rodiny fcí print je v 90 % blázen, nebo to nepochopil…
cout << setiosflags(ios_base::fixed) << setprecision(2) << x << setprecision(0);jako hezčí oproti
printf("%.02f", x);
To se mi nechce ani věřit.
Přetěžování operátoru << je dost jednoúčelové, přijde mi lepší mít u objektu něco, jako je obvyklý javovský toString().
#include <iostream>
#include <float.h>
int main(int argc, char **argv) {
std::cout.precision(FLT_DIG);
std::cout.flags(std::ios::scientific);
std::cout << "float:" << std::endl;
std::cout << " min: " << FLT_MIN << std::endl;
std::cout << " max: " << FLT_MAX << std::endl;
std::cout << " 10 exponent min: " << FLT_MIN_10_EXP << std::endl;
std::cout << " 10 exponent max: " << FLT_MAX_10_EXP << std::endl;
std::cout << " digits: " << FLT_DIG << std::endl;
std::cout << " Epsilon: " << FLT_EPSILON << std::endl;
std::cout.precision(DBL_DIG);
std::cout << "double:" << std::endl;
std::cout << " min: " << DBL_MIN << std::endl;
std::cout << " max: " << DBL_MAX << std::endl;
std::cout << " 10 exponent min: " << DBL_MIN_10_EXP << std::endl;
std::cout << " 10 exponent max: " << DBL_MAX_10_EXP << std::endl;
std::cout << " digits: " << DBL_DIG << std::endl;
std::cout << " Epsilon: " << DBL_EPSILON << std::endl;
std::cout.precision(LDBL_DIG);
std::cout << "long double:" << std::endl;
std::cout << " min: " << LDBL_MIN << std::endl;
std::cout << " max: " << LDBL_MAX << std::endl;
std::cout << " 10 exponent min: " << LDBL_MIN_10_EXP << std::endl;
std::cout << " 10 exponent max: " << LDBL_MAX_10_EXP << std::endl;
std::cout << " digits: " << LDBL_DIG << std::endl;
std::cout << " Epsilon: " << LDBL_EPSILON << std::endl;
#if defined FLT_ROUNDS
std::cout << std::endl;
std::cout << "Type of rounding floating numbers: ";
switch(FLT_ROUNDS){
case -1 : std::cout << "indeterminable"; break;
case 0 : std::cout << "towards zero"; break;
case 1 : std::cout << "to the nearest number"; break;
case 2 : std::cout << "towards positive infinity"; break;
case 3 : std::cout << "towards negative infinity"; break;
default : std::cout << "? - no standard definition"; break;
}
std::cout << std::endl;
#endif
return 0;
}
a vynikne to, že kód je stejně čitelný jako jeho výstup.
Styl formátovaní lze nastavit jen 1×, ne opakovaně pro každé číslo. Pak se jedním přepnutím formát všech čísel změní dle potřeby.
//trhlé zobáčky
cout << v << endl;
//print metoda to string
printf("%s\n",v.toString().c_str());
//printf po jednom
printf("%.02f,%.02f,%.02f\n",v.i,v.j,v.k);
//nebo
printf("%.02f,%.02f,%.02f\n",v.getI(),v.getJ(),v.getK());
Obecně metoda toString() je trochu něco jiného, ta pracuje se stringem, ale zobáčky se stream-em a ten může být cokoliv, string, stdout, stderr, soubor…, takže zaměněním std::cout za ukazatel typu std::ostream, jedním přehozením ukazatele zapisujete do souboru nebo na stdout, nebo cpete data do parseru, je to daleko flexibilnější.
print xnadchne stěží. Uvedený příklad je vtipný, protože (a) v C lze napsat přinejmenším stejně čitelně (b) polovina využívá velké zlo z C, tedy preprocesor (všechna ta FLT_xxx jsou jakási makra, nemají žádný namespace, prostě hrůza hrůzoucí). [*] Taky funguje s libovolnou třídou.

PRIx64apod., což tu čitelnost a stručnost trošku zhoršuje. Ale ať si každý používá, co chce. Čím víc se toho musí opravovat (a je jedno, jestli zbytečně, nebo odůvodněně), tím více je pro nás práce
- chci střídat formát výstupu (ne vše potřebuju na stejný počet desetinných míst)Ano, pokud musíte střídat nastavení výstupu čísla, napíšete toho více. Ale setkávám se daleko častěji s opačným požadavkem.
- jeden typ objektu má dvě možné řetězcové reprezentacePopravdě toto jsem čekal jako první námitku, ale řešení je identické jako když máte metody toString() a podobné, prostě předem přepnete formát výstupu. Nemyslím, že je to
cout vs. printf, protože to řeší daný objekt interně a je sám odpovědný za formát výstupu. To je prostě jiný problém.
- formát výstupu se neřídí samotným objektem, ale něčím z vnějškuTak buď je to zodpovědnost toho objektu nebo jiného objektu a když je to „nedefinovné“ skládání „něčeho“ venku, tak ano asi si napíšete toho více, ale je otázkou, jestli když se bavíme o C++, není-li někde chyba návrhu (netvrdím, že je), ale jste ve stejné situaci a je jedno jestli to sypete pomocí cout nebo printf, krom toho, že platí „námitka“ první.
- potřebuju sypat různé hodnoty do předpřipravených šablon (genialita printf)Souhlasil bych, kdyby byly parametry očíslovány.
- potřebuju skládat data "nelineárně"Nevidím asi rozdíl, malý příklad by nebyl?
formát: nu, já třeba v matematických aplikacích to řeším - často pro různé kontroly chci zběžně zkouknout hodně čísel na pár desetinných míst.No a právě tady mi to připadá super, bo vysypu celou matici, vector nebo cokoliv hned a je klid…
reprezentace: pokud mám výstup z objektu řešený pomocí metody toString(), není problém tuto metodu rozšířit o další parametr s implicitní hodnotou popisující styl výstupu. Rozdíl oproti přepnutí formátu výstupu je ten, že přepnutí formátu je globální změna, ovlivňující další chování programu, což je věc veskrze zavrženíhodná. Takové věci pak aby prase ladilo.To beru kompletně (jakože souhlasím).
nelineárně: no do coutu těžko pošleš nejdřív konec výstupu a pak začátek, stejně tak do stringstreamu. U skládání stringů snadno string předřadíš před zbytek (a máš-li inteligentní řetězce, tak i levně). Takže opět člověk skončí u toho, že si nejprve poskládá celej výstup (řádku) a tu pak vyplivne najednou.Ale to je stejné i s printf-em. Když je třeba čupr formát, tak to stejně lze akorát poskládat do string-u a je docela jedno kterou funkcí a zas lze používat oba přístupy, ale já rozhodně ten string pak vysypu pomocí <<
.
Operátor << se IMHO hodí na rychlé vypsání věcí, u kterých tak nezáleží na kvalitě prezentace: prostě chci něco vysypat, napsat to co nejrychlejc, a nezáleží mi na tom, jak to bude vypadat. Pokud ale chci složitější věci, tak je najednou spousta věcí přes ruku....Ano, určitě to není, stejně jak fce printf, na nějaké složité a třeba i uživatelsky definované formátování, to si každý musí stejně napsat sám a může pro to použít jak stream, tak printf nebo třeba itoa
. Ale myslím, že i na „střední třídu“ se to hodí a pokud jsou classy dobře navržené, lze to rozumně skládat a vrstvit na sebe…
), takže lze použít jakoukoliv metodu skládání.
, když jsem to psal nedošlo mě, že přes fprintf můžu i na stdout atd. a popravdě kdybych to psal (jakože rodinu printf nepoužívám už 300let), tak bych dělal nějaký switch a volal printf nebo fprintf.
Tiskni
Sdílej: