Chcete vědět, co se odehrálo ve světě techniky za poslední měsíc? Nebo si popovídat o tom, co zrovna bastlíte? Pak doražte na listopadovou Virtuální Bastlírnu s mikrofonem a kamerou, nalijte si něco k pití a ponořte se s strahovskými bastlíři do diskuze u virtuálního piva o technice i všem možném okolo. Mezi nejvýznamnější novinky patří Průšovo oznámení Core One L, zavedení RFID na filamentech, tisk silikonu nebo nový slicer. Dozvíte se ale i
… více »Vývojáři OpenMW (Wikipedie) oznámili vydání verze 0.50.0 této svobodné implementace enginu pro hru The Elder Scrolls III: Morrowind. Přehled novinek i s náhledy obrazovek v oznámení o vydání.
Komunita kolem Linux Containers po roce vývoje představila (YouTube) neměnný operační systém IncusOS speciálně navržený pro běh Incusu, tj. komunitního forku nástroje pro správu kontejnerů LXD. IncusOS poskytuje atomické aktualizace prostřednictvím mechanismu A/B aktualizací s využitím samostatných oddílů a vynucuje zabezpečení bootování pomocí UEFI Secure Bootu a modulu TPM 2.0. Postaven je na Debianu 13.
Mozilla začne od ledna poskytovat komerční podporu Firefoxu pro firmy. Jedná se o podporu nad rámec stávající podpory, která je k dispozici pro všechny zdarma.
V Bolzanu probíhá konference SFSCON (South Tyrol Free Software Conference). Jean-Baptiste Kempf, zakladatel a prezident VideoLAN a klíčový vývojář VLC media playeru, byl na ní oceněn cenou European SFS Award 2025 udělovanou Free Software Foundation Europe (FSFE) a Linux User Group Bolzano‑Bozen (LUGBZ).
Open-source minimalistický trackball Ploopy Nano byl po modelech modelech Classic a Thumb Trackball také aktualizován. Nová verze Nano 2 používá optický senzor PAW3222 a k původně beztlačítkovému designu přidává jedno tlačítko, které ve výchozí konfiguraci firmwaru QMK přepíná režim posouvání koulí. Sestavený trackball nyní vyjde na 60 kanadských dolarů (bez dopravy a DPH).
Github publikoval Octoverse 2025 (YouTube), tj. každoroční přehled o stavu open source a veřejných softwarových projektů na GitHubu. Každou sekundu se připojil více než jeden nový vývojář. Nejpoužívanějším programovacím jazykem se stal TypeScript.
Kit je nový maskot webového prohlížeče Firefox.
Mastodon (Wikipedie) - sociální síť, která není na prodej - byl vydán ve verzi 4.5. Přehled novinek s náhledy v oznámení na blogu.
Německo zvažuje, že zaplatí místním telekomunikačním operátorům včetně Deutsche Telekom, aby nahradili zařízení od čínské firmy Huawei. Náklady na výměnu by mohly přesáhnout dvě miliardy eur (bezmála 49 miliard Kč). Jeden scénář počítá s tím, že vláda na tento záměr použije prostředky určené na obranu či infrastrukturu.
program vratnice;
uses crt,graph,printer;
const hlaska ='Stisknete libolny znak ...';
const verze = '1.1.2 (BETA)';
type vozidlo = record
spz:string[8];
ridic:string[19];
poznamka:string[7];
end;
var
vuz:vozidlo;
f,g:file of vozidlo;
i,vel,gd,gm:integer;
odpoved:char;
zadani:string[19];
soubor:string;
trideno:boolean;
nalezeno:boolean;
procedure iniciace;
begin
checkbreak:=false;
clrscr;
window(1,1,20,16);
gd:=1;gm:=1;
assign(f,'vratnice.data');
{$I-}
reset(f); {testuje zda soubor existuje}
{$I+}
if ioresult <> 0 then rewrite(f); { kdyz ne tak ho vytvori}
close(f);
end;
procedure pozdrav;
begin
writeln('Vitejte ve vratnici');
writeln('-------------------');
writeln('Verze: ',verze);
writeln('Autor: Jan Brunclik');
writeln('Mobil: 775 384 910');
writeln;
writeln('Pokracujte stiskem libovolne klavesy ...');
repeat until keypressed;
end;
procedure cekej;
begin
writeln;
write(hlaska);
repeat until keypressed;
end;
procedure trid; {tridi metodou BUBLE SORT}
var
a,b,p:vozidlo;
prohoz:boolean;
begin
reset(f);
vel:=filesize(f);
close(f);
repeat
prohoz:=false;
for i:=0 to (vel-2) do begin
reset(f);
seek(f,i);
read(f,a);
read(f,b);
close(f);
if a.spz>b.spz then begin
p:=b;
b:=a;
a:=p;
prohoz:=true;
end;
reset(f);
seek(f,i);
write(f,a);
write(f,b);
close(f);
end;
until prohoz=false;
trideno:=true;
end;
procedure vypis; {vypis obsahu souboru}
var
vuz:vozidlo;
begin
clrscr;
writeln('+----------------+');
writeln('| Pocet vozidel |');
writeln('+----------------+');
writeln;
reset(f);
writeln('Nalezeno : ',filesize(f),' vozidel.');
close(f);
cekej;
end;
procedure pridat; {prida zaznam na konec souboru}
begin
reset(f);
seek(f,filesize(f)); {nastaveni ukazatele na konec souboru}
repeat
clrscr;
writeln('+--------------+');
writeln('| Pridani vozu |');
writeln('+--------------+');
writeln;
with vuz do begin {nacteni dat}
write('SPZ : ');
readln(spz);
write('Ridice : ');
readln(ridic);
write('Poznamku : ');
readln(poznamka);
end;
write(f,vuz); {zapis do souboru}
writeln;
writeln('Vuz s "',vuz.spz,'" byl pridan.');
writeln;
writeln('Dalsi zaznam? A/N');
until upcase(readkey)<>'A';
close(f);
trideno:=false;
end;
procedure vyhledat; {vyhleda podle spz vozidla}
var
nvuz:Array[1..9] of vozidlo;
pocet:integer;
begin
clrscr;
nalezeno:=false;
writeln('+-------------+');
writeln('| Hledani SPZ |');
writeln('+-------------+');
writeln;
reset(f);
write('SPZ : ');
readln(zadani);
clrscr;
writeln('+------------------+');
writeln('| Vysledek hledani |');
writeln('+------------------+');
writeln;
for i:=1 to filesize(f) do begin
read(f,vuz);
if zadani=copy(vuz.spz,4,4) then
begin
nalezeno:=true;
with vuz do begin
writeln(spz);
writeln(ridic);
writeln(poznamka);
end
end;
end;
if not nalezeno then
writeln('Vuz s "',zadani,'" nenalezen !');
close(f);
writeln;
cekej;
end;
procedure odstranit; {odstrani zaznam ze souboru}
begin
clrscr;
nalezeno:=false;
assign(g,'tmp.data'); {pomocny soubor}
writeln('+----------------+');
writeln('| Odstraneni SPZ |');
writeln('+----------------+');
writeln;
write('SPZ : ');
readln(zadani);
writeln;
reset(f);
rewrite(g);
for i:=1 to filesize(f) do begin {do pomocneho souboru se prenesou}
read(f,vuz); { vsechny zaznamy, krome toho }
if ((vuz.spz=zadani)or(length(vuz.spz)>=8)) then { zadaneho }
begin
writeln('Vuz s "',vuz.spz,'" byl odstranen ze zaznamu.');
nalezeno:=true;
end
else
begin
write(g,vuz);
end;
end;
close(f);
close(g);
rewrite(f);
reset(g);
for i:=1 to filesize(g) do begin
read(g,vuz); {zaznamy se prenesou zpet do hlavniho souboru}
write(f,vuz);
end;
close(f);
close(g);
erase(g); {pomocny soubor se vymaze}
if not nalezeno then
writeln('Vuz s "',zadani,'" nebyl nalezen.');
writeln;
cekej;
end;
procedure tisk; {tisk vsech povolenek serazene podle SPZ}
var ft:text;i:integer;
begin
clrscr;
writeln('+--------------+');
writeln('|Tisk povolenek|');
writeln('+--------------+');
writeln;
write('Trideni ... ');trid;write('[ok]');
writeln(lst,'Projekt Vratnice ');
writeln(lst,'Jan Brunclik 2011');
writeln(lst,'737 385 291');
writeln(lst,'');
writeln(lst,'+----------------+');
writeln(lst,'| Tisk povolenek |');
writeln(lst,'+----------------+');
writeln(lst,'');
reset(f);
writeln('Tisknu celkem ',filesize(f),' povolenek');
for i:=1 to filesize(f)-1 do begin
seek(f,i);
read(f,vuz);
with vuz do begin
writeln(lst,spz:8,ridic:20,poznamka:8);
end
end;
close(f);
cekej;
end;
procedure import;
var
fe: text;
i : integer;
radek : string;
begin
clrscr;
writeln('+----------------+');
writeln('|Import povolenek|');
writeln('+----------------+');
writeln;
assign(fe,'vratnice.csv');
rewrite(f);reset(fe);
radek:='';
while not eof(fe) do begin
with vuz do begin
readln(fe,radek);
spz:=copy(radek,1,7);
radek:=copy(radek,9,length(radek));
ridic:=copy(radek,1,pos(',',radek)-1);
poznamka:=copy(radek,pos(',',radek)+1,length(radek));
end;
write(f,vuz);
end;
close(f);close(fe);
writeln('Hotovo');cekej;
end;
procedure export; {export aut do souboru vratnice.csv}
var
fe : text;
i : integer;
begin
clrscr;
writeln('+----------------+');
writeln('|Export povolenek|');
writeln('+----------------+');
writeln;
assign(fe,'vratnice.csv');
reset(f);rewrite(fe);
for i:=1 to filesize(f)-1 do begin
seek(f,i);
read(f,vuz);
with vuz do begin
writeln(fe,spz,',',ridic,',',poznamka);
end
end;
writeln('Hotovo');
close(fe);close(f);
cekej;
end;
{definice jednotlivych funkcich}
procedure hledat_spz;begin;end;
procedure hledat_jmena;begin;end;
procedure hledat_datum;begin;end;
procedure evidence_hledat;begin;end;
procedure evidence_pridat;begin;end;
procedure evidence_editovat;begin;end;
procedure evidence_smazat;begin;end;
procedure evidence_opravit;begin;end;
procedure evidence_import;begin;end;
procedure evidence_export;begin;end;
procedure kontrola_hledat;begin;end;
procedure kontrola_pridat;begin;end;
procedure kontrola_editovat;begin;end;
procedure kontrola_smazat;begin;end;
procedure kontrola_opravit;begin;end;
procedure kontrola_import;begin;end;
procedure kontrola_export;begin;end;
procedure povolenky_hledat;begin;vyhledat;end;
procedure povolenky_pridat;begin;pridat;end;
procedure povolenky_editovat;begin;end;
procedure povolenky_smazat;begin;odstranit;end;
procedure povolenky_opravit;begin;end;
procedure povolenky_import;begin;import;end;
procedure povolenky_export;begin;export;end;
procedure povolenky_vypsat;begin;end;
procedure povolenky_tisk;begin;tisk;end;
procedure obedy_hledat;begin;end;
procedure obedy_pridat;begin;end;
procedure obedy_editovat;begin;end;
procedure obedy_smazat;begin;end;
procedure obedy_opravit;begin;end;
procedure obedy_import;begin;end;
procedure obedy_export;begin;end;
procedure smeny_hledat;begin;end;
procedure smeny_pridat;begin;end;
procedure smeny_editovat;begin;end;
procedure smeny_smazat;begin;end;
procedure smeny_opravit;begin;end;
procedure smeny_import;begin;end;
procedure smeny_export;begin;end;
procedure klice_hledat;begin;end;
procedure klice_pridat;begin;end;
procedure klice_editovat;begin;end;
procedure klice_smazat;begin;end;
procedure klice_opravit;begin;end;
procedure klice_import;begin;end;
procedure klice_export;begin;end;
{definice jednotlivych menu}
procedure menu_hledat;begin;end;
procedure menu_evidence;begin;end;
procedure menu_kontrola;begin;end;
procedure menu_povolenky;
begin
repeat
clrscr;
writeln('+--------------+');
writeln('| Povolenky |');
writeln('+--------------+');
writeln('| 1 - Hledat |');
writeln('| 2 - Pridat |');
{writeln('| 3 - Editovat |');}
{writeln('| 4 - Smazat |');}
{writeln('| 5 - Opravit |');}
writeln('| 6 - Import |');
writeln('| 7 - Export |');
{writeln('| 8 - Vypsat |');}
writeln('| 9 - Tisk |');
writeln('+--------------+');
writeln('| 0 - Zpet |');
writeln('+--------------+');
odpoved:=upcase(readkey);
case odpoved of
'1':povolenky_hledat;
'2':povolenky_pridat;
{'3':povolenky_editovat;}
{'4':povolenky_smazat;}
{'5':povolenky_opravit;}
'6':povolenky_import;
'7':povolenky_export;
{'8':povolenky_vypsat;}
'9':povolenky_tisk;
end;
until odpoved='0';
end;
procedure menu_obedy;begin;end;
procedure menu_uzivatele;begin;end;
procedure menu_smena;begin;end;
procedure menu_klice;begin;end;
procedure menu_nastaveni;begin;end;
begin {hlavni menu}
iniciace;
trideno:=false;
pozdrav;
repeat
clrscr;
writeln('+--------------+');
writeln('| Hlavni menu |');
writeln('+--------------+');
{writeln('| 1 - Hledat |');}
{writeln('| 2 - Evidence |');}
{writeln('| 3 - Kontrola |');}
writeln('| 4 - Povolenky|');
{writeln('| 5 - Obedy |');}
{writeln('| 6 - Uzivatele|');}
{writeln('| 7 - Smeny |');}
{writeln('| 8 - Klice |');}
{writeln('| 9 - Nastaveni|');}
writeln('| . - Pocet |');
writeln('+--------------+');
writeln('| Q,0 - Konec |');
writeln('+--------------+');
write('Volba :');
odpoved:=upcase(readkey);
case odpoved of
'1':menu_hledat;
'2':menu_evidence;
'3':menu_kontrola;
'4':menu_povolenky;
'5':menu_obedy;
'6':menu_uzivatele;
'7':menu_smena;
'8':menu_klice;
'Q','0':odpoved:=chr(27);
{'T':trid;}
',','.':vypis;
end;
until odpoved=chr(27);
end.
Řešení dotazu:
BTW nakolik je z toho kódu poznat účel a úmysl, dalo by se to přepsat do pár řádků v nějakém skriptovacím jazyce s jednoduchou databází. Ale jestli se chceš naučit C tak držím palce. A když tak koukám na to clrscr;… další věc kterou budeš hledat je knihovna curses.
Použít raději curses nebo ncurses ?Curses je název původní knihovny pro unixy, ncurses je GNU implementace. API je stejné a na linuxu afaik nic jiného než ncurses není, takže není co řešit
Přemýšlel jsem že bych použil dialog --menu a další parametry.Pokud vystačíš s něčím tak primitivním, tak opravdu binárku nepotřebuješ. Parsovat textový výstup z podprocesu se mi zdá víc práce než volat funkce v knihovně, dokonce i s tak hnusným API jako má curses.
Sice to mohu nascriptovat, ale spíše bych to chtěl jako binárku, aby mi do toho BFU uživatel nelezl.Co myslíš tím "nelezl"? Zní to jako security through obscurity. Když už někdo umí skriptovací jazyk, tak už to u mě není BFU.
Blast from the past. Tady ve 21. století je Pascal pohřbený stejně hluboko jako fortran a cobol.
EGAVGA.BGI
Jestli chceš psát hry, hledáš nejspíš knihovnu SDL. Djgpp taky nebývala špatná a přenositelná na wydle. Jestli si chceš jen nakreslit nějaký graf nebo schéma, toolkity mívají nějaký prvek na který se dá kreslit. O komunikaci s X serverem se stará knihovna xlib nebo xcb ale to už je hodně low-level, nic pro obyčejné smrtelníky
. OpenGL bych raději pro jednoduchost taky vynechal.
Tady ve 21. století je Pascal pohřbený stejně hluboko jako fortran a cobol.Priateľu, realita je taká, že Pascal (Delphi), Fortran aj Cobol sa majú čulo k svetu. Len je to (hlavne v prípade Fortranu a Cobolu) iná liga.
Treba fortran se pouziva na vypocty a pouzivat se bude, protoze C a spol obsahuje urcity veci (napr. pointery) kvuli kterym je prakticky nemozny napsat rozumny optimalizator...
A ukazatele se moc neoptimalizují proto, že už jsou zoptimalizované až na kost. Co chceš optimalizovat na adrese v paměti?
O přetrvávání fortranu jsem slyšel dost, ale spíše jako ukázku zatvrzelého konzervativismu
Chápu že přepisovat speciální knihovny na drcení čísel asi nemá moc smysl, ale pochybuju že by dnes někdo ve fortranu začal nový projekt. Dobře, není mrtvý, ale v zaslouženém důchodu.
Problem je ze ta adresa muze ukazovat na cokoli, coz je sice super z pohledu programatora ale uz ne z pohledu optimalizatoru. Treba kdyz pres ukazatel nekam zapises tak je problem rozhodnout ktery promenny nacteny v registrech jsou porad platny a ktery se musi nacist znovu...Pokud vyjdu z odvážného předpokladu, že většina programátorů dnes nepíše ovladače a nepotřebuje se hrabat v IO portech nebo jiné mapované paměti – čemu to vadí? Pokud bych vymyslel architekturu a kompiler který by něco takového umožňoval, byl by tedy mnohem rychlejší než "neoptimalizovaný" kód na takové architektuře. Jenže byl by taky rychlejší než klasické ukazatele, které jsou "optimální" v jiných ohledech? Například zapomenutí registru je na dnešním železe AFAIK menší problém protože máš slušnou šanci trefit interni cache. Ktera je účinná kromě jiného i proto že prosté adresy jsou jednoduche na, ehm, optimalizaci
Nebo na něco zapomínám?
IMHO měl kolega na mysli spíš tohle:
uint64_t data;
uint64_t* p8 = &data;
uint32_t* p4 = (uint32_t*) &data;
Teď budete chvíli pracovat s p8, chvíli s p4… Překladač neví, jestli když něco zapíšete do *p8, očekáváte, že následně hodnota *p4 bude záviset na tom, co jste tam zapsal. Pro optimalizátor by bylo ideální, kdyby mohl předpokládat, že ne, ale řada programů spoléhá na to, že ano (a musejí se překládat s -fno-strict-aliasing).
code místo pre, snad je to srozumitelné i takhle.
I pokud by cteni z cache bylo stejne rychly jako provedeni operace, coz se obavam ze neni, tak ve vysledku to bude 2x pomalejsi... ;) A ted si predstav ze neco takovyho mas ve vnitrni smycce.
btw. samozrejme se bavime o aplikacich ktery potrebuji hruby vypocetni vykon, ne o scriptech v bashi kde te par instrukci (milionu instrukci) nemusi zajimat...
I pokud by cteni z cache bylo stejne rychly jako provedeni operace, coz se obavam ze neni, tak ve vysledku to bude 2x pomalejsi... ;)Chyba, nejsi na PDP-10
Čtení z paměti je na x86 mnohem pomalejší než samotná operace, čtení z cache je ve srovnání s tím zanedbatelné. Ergo pokud čekáš hromadu taktů na paměť, instrukce navíc není velký rozdíl. Všimni si že v kernel trafficu tady na abíčku se často zmiňuje že lidi od kernelu se nerozpakují přidat kód jen aby udrželi hardwarové cache pořádně nažhavené.
Pokud by ta operace navíc musela (často) taky čekat na paměť, bylo by to samozřejmě o něčem jiném. Prostě tím že jsou věci jednoušší se ztížila práce kompileru, ale zase ulehčila CPU. A kompiler se taky nefláká, i když nemůže instrukce zahodit, může je řadit tak aby se cache co nejvíc využívaly. Nějaký rozdíl v tom bude, ale rozhodně to nebude 2x pomalejší.
*p4 nakonec nikde v paměti neobjeví a celou dobu svého života může být jen v registru (a ten pointer bude jen fiktivní pointer kvůli předávání odkazem do nějaké inline funkce), zatímco *p8 bude regulérní 64-bitová hodnota v paměti a p8 regulérní pointer na ni. Bez strict aliasing rules takovou optimalizaci udělat nemůžete.
Zatím moc jsem nepochopil práci s poentry. Tak bych potřeboval drobet nakopnout.Po zbežnom prečítaní: A kde tam máš nejaké pointre? Tie budeš potrebovať akurát tak pri čítaní zo súboru. Napr namiesto
read(f,vuz);
budeš mať
read(f,&vuz, sizeof(vuz));
Čo ešte iné potrebuješ?
type vozidlo = record spz:string[8]; ridic:string[19]; poznamka:string[7]; end; var vuz:vozidlo; f,g:file of vozidlo; i,vel,gd,gm:integer; odpoved:char; zadani:string[19]; soubor:string; trideno:boolean; nalezeno:boolean;
typedef struct
{
char spz[9];
char ridic[20];
poznamka string[8];
} vozidlo;
vozidlo vuz;
int f,g;
int i,vel,gd,gm;
char odpoved;
char zadani[20];
char *soubor; // ??
int trideno;
int nalezeno;
Co to prepsat do bashe ?
Bude to snad jen o malo delsi... (ale nevim jak se v nem tiskne) ...
Tiskni
Sdílej: