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

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

 

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

Wimby
Pascal › Existuje datový typ metoda?
12. 7. 2009   #111736

Mam mnoho malých objektů, které se dědí, a tak pro ně dělám rychlejší alokaci. Jenže New a Dispose jsou mi k ničemu, místo toho jsem odkázanej na GetMem a FreeMem, přičemž nefungují virtuální metody. Takže bych řešil virtuální metody tak jak je řeší kompilátor - dát do objektu ukazatel na tabulku virtuálních metod, a v konstruktoru vyřešit přiřazení správných metod do tabulky. Něco na tenhle způsob:

type

TabulkaVirtualnichMetod = record
Ahoj : procedure;
end;

Objekt1 = object
Virtualni : ^TabulkaVirtualnichMetod;
constructor Vytvor;
procedure Ahoj;
end;

Objekt2 = object(Objekt1)
Virtualni : ^TabulkaVirtualnichMetod;
constructor Vytvor;
procedure Ahoj;
end;

PObjekt1 = ^Objekt1;
PObjekt2 = ^Objekt2;

var
TVMObjekt1,TVMObjekt2 : TabulkaVirtualnichMetod;

constructor Objekt1.Vytvor;
begin
Virtualni := @TVMObjekt1;
end;

procedure Objekt1.Ahoj;
begin
WriteLn('Objekt1');
end;

constructor Objekt2.Vytvor;
begin
Virtualni := @TVMObjekt2;
end;

procedure Objekt2.Ahoj;
begin
WriteLn('Objekt2');
end;

var
O1 : PObjekt1;

begin
TVMObjekt1.Ahoj := @Objekt1.Ahoj;
TVMObjekt2.Ahoj := @Objekt2.Ahoj;
O1 := PObjekt2(Alokuj(SizeOf(PObjekt2)));
O1^.Virtualni^.Ahoj; {Napise "Objekt2"}
end;

Wimby
Pascal › Existuje datový typ metoda?
8. 7. 2009   #111626

MiMi :

podla toho co si napisal ti ide skor o datovy typ procedura.


Jde mi o datový typ procedura, do kterého je možné přiřadit proceduru z objektu.

Myslim ze hentak tospravit nejde ale to co si tam napisal ide spravit s funkciou.


Jak? Změna klíčových slov z "procedure" na "function" nefunguje.

Tady je příklad:
type

TMetoda : procedure;

TObjekt = object
constructor Vytvor;
procedure VolejMetodu;

var
Metoda : TMetoda;

constructor TObjekt.Vytvor;
begin
Metoda := @VolejMetodu
end;
Tohle selže očekávanou chybou ve stylu "Type mismatch", protože do datového typu obyčejné procedury se snažim přiřadit metodu (což ve skutečnosti je vlastně taky procedura, ale má navíc parametr, do kterého se přiřazuje objekt jenž ji volá - což je vlastně můj problém).

A tak bych se chtěl zeptat, jestli nějaké rozšíření pascalu nemá nějaký datový typ "metoda"? Něco, co by očekávalo přiřazení metody místo obyčejné procedury.

Wimby
Pascal › Existuje datový typ metoda?
8. 7. 2009   #111607

Nevíte, jestli v nějakém rozšíření pascalu se může použít deklarace typu procedura/funkce, a přiřadit do proměnné tohoto typu metodu?

var metoda : procedure;


begin
metoda := @objekt.metoda; {přiřazení metody}
metoda; {volání metody objektu}
end.

Wimby
Offtopic › Má smysl se učit JavaScript?
29. 5. 2009   #101930

Nevykat, prosím ;o)
Tak teda ahoj, já jsem Wimby :-)

Ještě nikdy jsem stránku do vyhledávače nedával, ale myslím, že i google má něco jako katalog (http://www.google.com/addurl/). Moc tomu automatickýmu přidávání stránek nerozumim...

formátování pomocí HTML tagů by znamenalo mít v každém odstavci <font color="green">…</font>
Tak můžu si ty odstavce dát DO obsahu FONT a všechny budou zelený jako u kaskád... Souhlasím, že to bude mít o pár bajtů víc, ale nebude to zas o tolik... chtělo by to spíš mluvit o nějakém konkrétním příkladě... včera jsem se podíval na stránky Amazon.com a vypadá to, že to s tou keší taky moc nehrotí. Zřejmě maj servery rychlý dost.

Pokud mám prohlížeč bez podpory CSS, vím, že se mi dostane toho obsahu bez nějakých fancy designových prvků. Zatímco při formátování pomocí HTML je to uživateli cpáno, i když možná nechce.
Před CSS se stránky normálně formátovali přes HTML a jelikož HTML je kvůli tomu, aby byl text nějak zabarvenej, zvětšenej a ztučněnej - zkrátka aby byl lépe čtivěj - nemělo by uživateli vadit, že bez podpory CSS bude pořád formátovanej. A co se týče těch fancy designových prvků, tak to je další důvod proč nepoužívat CSS :D

Proč se rovnou nezavede nějaká jiná služba, kde by bylo XML s CSS a pořádnym fancy systémem? Takhle napůl je to špatně :D
Jenom se z jedný dobrý služby stane něco mezi (XHTML s poloviční podporou CSS), co stejně nefunguje tak jak má.
Takže službu web bych na interaktivní aplikace rozhodně nepoužíval a tim spíš bych se ani neučil Javascript.

A s tim SESSID máš pravdu, to jsem nějak opmněl... čili by muselo být číslo jenom jedno.

A ještě jak bych řešil server já :o)
Udělal bych normální program (server), kterej umí jednak přečíst a zobrazit HTML stránku v souboru (statickou), a nebo jednoduše spustí zkompilovanej program (dinamickou stránku). Server sám by z bezpečnostních důvodů měl některá omezení co se týče přístupu do složek nebo přístupu k souborům...

Wimby
Offtopic › Má smysl se učit JavaScript?
28. 5. 2009   #101913

No, to je ale podle mne problém vyhledávačů. Hlavně, pokud já jakožto tvůrce webu budu chtít, aby se ke mně návštěvníci dostali, tak si najdu nějaký portál (nebo katalog, nebo jak se tomu vlatně říká) a uveřejním všechny odkazy a k tomu nějaký popisky. Od doby, kdy jsou vyhledávače automatické, musí se na to připravit jinak.

Jo, to je pravda, na to jsem zapomněl, ale když se nad tim tak zamyslim, tak mi nedělá problém napsat jméno a heslo jednou denně na nějaký stránky. Navíc si myslím, že heslo je právě od toho, aby se zadávalo. :o)

Formátovanej text nebude mít zas o tolik víc než neformátovanej text s CSS. Navíc zobrazí-li si uživatel stránku s prohlížečem bez podpory CSS tak bude vypadat úplně jinak. Ale stejně, pokud budu chtít udělat dynamickou stránku, například fórum, tak je kešování zbytečné, protože obsah je téměř každé načtení jiný.

S tím zbytkem s Vámi bohužel souhlasím :D
Ještě že nejsem programátor nebo snad analytik.

Jen mě napadají už jen taková tvrzení, že tim, že uživatelům dáte první poslední, jim vlastně vůbec nepomůžete, protože nebudou nuceni se učit xD

Ale vemte si jak by to bylo krásné, kdybych měl pro každej účel jednu diferencovanou, specializovanou aplikaci. Například pro přehrávání videa budu mít již zmíněné VLC, které umí streamovat. Na prohlížení obrázků budu mít ACDSee, které ale také umí v nějaké novější verzi přehrávat videa. Jenže jak, je to jen taková náhrada, aby to mělo o jednu funkci víc, která je k ničemu. Jen mi zabere pamět a vytíží procesor, takže bude kontraproduktivní. Neumí k videu přehrávat titulky, neumožní mi vybrat si jinou zvukovu stopu, neumožní mi spustit menu u DVD, neumí stream.
Nebo webový prohlížeč. Myslíte si, že je dobré, aby uměl i ftp? Když mam souborovej manažer, kterej umí téměř dokonale pracovat s adresářem a se souborem a prohlížeč mi ukáže sotva název a velikost a tim to končí? Neni tedy ta funkce zbytečná? Nebo spíš neni tak trochu z jinýho soudku?

Abych se tedy dostal zpátky k tématu. Možná pro stejný účely a víc možností už bude lepší naučit se rovnou Actionscript než Javascript. Ale v mých očích jsou oboje stejně zbytečné, ale je pravda, že náš zákazník, náš pán a když chce zběsilost, má ji mít. Od toho tu jsou konzultanti, aby mu to rozmluvili :-)

// Až jednou vyrostu, přál bych si, abych si mohl dovolit psát jenom to, co mě bude bavit a naplňovat xD

Wimby
Offtopic › Má smysl se učit JavaScript?
28. 5. 2009   #101891

To exekutor franta : A kdybyste věděli kde všude se používají jiné jazyky pro tiskové šablony, databáze, servery, ...! xD

Je jasný, že když budu umět programovat, tak je mi jedno v jakym jazyce to bude, ale taky si vybírám jazyk podle toho co budu dělat... Když budu psát OS loader a budu v něm potřebovat přepnout procesor do chráněnýho režimu, tak nejsnazší cestou bude assembler, naopak když budu chtít udělat něco velikýho, tak raději sahnu po hi-level jazyku. A když budu chtít udělat něco rozšiřitelnýho, tak použiju script... Ale na Javascript se stejnak nemůžu úplně spolehnout, protože ho ne každý může podporovat. Čili ho stejnak budu používat jenom tam, kde nebude mít zásadní význam...

P. S. : A to, že se něco na něco používá není argument :D Existuje mnoho příkladů, že se něco používá špatně, ale protože s tim hejbou peníze a ne um, tak to ani jinak nebude. Přijde mi, že s JS je to podobný. Prostě lidé chtějí, aby to dobře vypadalo, aby ta stránka měla něco víc než ostatní, protože to je to hlavní, a protože jakýsi cit pro estetičnost má přece každý. Ale zapomínají, že na pocitech se, biť i webová stránka, pořádně programovat nedá...

Wimby
Offtopic › Má smysl se učit JavaScript?
28. 5. 2009   #101866

Kruci, omlouvám se, to poslední jsem si nějak špatně přečetl a psal jsem blbosti na něco jinýho.

takže:
ale začínat s nim mi nepřijde jako rozumnej nápad, už jen kvůli tomu, že kdybych s nim začínal, tak mi to zabere několik měsíců
Jj, ono každej první jazyk zabere hodně času, ale když pak budu nucen psát v něčem jiném, rozsáhlejším, tak mi z toho zůstane mnoho zlozvyků (třeba nebudu používat nějaké konstrukce, například množiny, které se často hodí). Myslím si, že na začátek je dobré učit se v něčem, co má mnoho možností a zjistit je pokud možno téměř všechny.
Když zjistím všechny možnosti skriptu, a pak přejdu na rozsáhlejší jazyk, budu se muset doučovat další novinky, které nemusim hned pochopit a jelikož jsem lílý, vyřeším je tak jak bych to řešil ve scriptu...

Wimby
Offtopic › Má smysl se učit JavaScript?
28. 5. 2009   #101865

:-) gratuluji k úspěšnému popření všech mých ideí...

Jistě i sessiony v PHP tohle používají. Jak se k tomu staví vyhledávače nevím, ale celá stránka bude stějně ovlivněna proměnnými, takže to bude úplně jiná stránka než s jiným číslem. A jak jste správně podotkl, používat proměnné jen u přihlášených uživatelů - čili jen tam, kde je to nutné. A navíc mi přijde, že Cookies jsou jen kvůli Javascriptu.

Ano, kešování uznávám, ale kešování je hlavně kvůli obrázkům, který zabíraj několikanásobně víc než stránka, protože těch pár kilobajtů na stránku je vůbec otázkou, jestli je kešovat nebo ne.

"HTML + CSS do HTML s formátovacími tagy" - tak takhle je to samozřejmě zbytečný. Prostě budu mít program, kterej bude mít rovou v binárce styly. A když je budu chtít změnit, tak to překompiluju. To bude jednak rychlejší než jakejkoliv script a jednak nebudu muset mít víc souborů.

"udělat nějakou interaktivní aplikaci" - právě kvůli tomu to píšu. Když chci udělat interaktivní aplikaci, tak proč to dělat přes web? Například YouTube, videa jsou přes Flex, kdyby dali odkaz na stream, tak si ho otevřu přes VLC a kouknu na to s mym programem. Jednak je flash náročnější, jednak jsem zvyklej obsluhovat film na svých tlačítkách. :-)

To omezení je, předpokládám, v mojí režii - pokud to nebude omezení od providera, což snad u serveru by nemělo být. A ten timeout u prohlížeče možná bude, ale zatím jsem se s ním nesetkal. Navíc jak už jsem řekl, chat např. přes irq, ne přes web...

A to s tim jinym jazykem jsem jen tak plácnul xD ale když nad tim tak přemejšlim, tak by to nemuselo být zas tak špatný, aspoň by se snáz daly pochopit významy různých symbolů a konstrukcí, když budu muset přemejšlet jak je udělat, budu muset napřed vědět co maj dělat a jakej maj vůbec význam, ale začínal bych s nějakym starším, zaběhnutěšjším a osvědčenějším :-)

Wimby
Offtopic › Má smysl se učit JavaScript?
27. 5. 2009   #101844

To z_moravec : Koláčků se zbavíš snadno, stačí, když ke každýmu odkazu přidáš nějaký číslo, který server rozpozná a pod nim bude mít někde u sebe uložený proměnný. A když se bude číslo každý načtení stránky měnit, tak to bude jednak docela bepečný a jednak rychlejší a bude to fungovat na všech prohlížečích.

Navíc budu-li stránky generovat, tak je irelevantní jestli budu mít externí soubor se stylem, který si bude stahovat prohlížeč, nebo jestli ho budu mít u sebe na serveru a podle něj budu stránku tvořit a neposílat nic. Navíc HTML má docela dost možností na formátování textu, takže použití CSS není nezbytný.

A co se týče toho Javascriptu, tak je málo věcí, který by nešly udělat jinak a možná snáz. Je to dobrý třeba na odpočítávání, ale to si tak jako tak musí hlídat i server.

Na druhou stranu, například facebook.com má chat udělanej, myslim, přes Javascript. Chat by se bez JS řešil trochu obtížněji. Server by nesměl ukončit spojení, takže stránka by se neustále načítala, a čeklo by se na nový zprávy, které by vzápětí server poslal jako součást načítané stránky. Nicméně když už chci dělat chat, tak použiju službu irc.

To Lordest : :-))) Jasně, ale někdo by ho musel dobře popsat, aby se podle toho dal udělat překladač.

Jinak proti JS nic nemam, ale začínat s nim mi nepřijde jako rozumnej nápad, už jen kvůli tomu, že kdybych s nim začínal, tak mi to zabere několik měsíců, kdežto teď, když už programovat umim, mi to zabere pár dnů.

Wimby
Offtopic › Má smysl se učit JavaScript?
27. 5. 2009   #101798

Standardy určitě jsou, soudě podle verzí JS, ale nejsem si tak úplně jistej, jestli je podporuje celé alespoň jeden prohlížeč. A samozdřejmě každý prohlížeč nepodporuje odlišnou část, takže je nutné psát různé způsoby pro stejné věci :-)

Ovšem učit se javascript kvůli prototypové dědičnosti určitě nebude ten správný přístup... A i tak bych se ho já osobně neučil hned. Když už ho jednou budu potřebovat, tak jelikož programovat už umím díky jinému jazyku, stačí mi se jenom naučit syntaxi, a napíšu si v něm co potřebuju - neučil bych se na něm programovat. Kdysi mě javascript lákal, a tak jsem se ho učil, ale s odstupem času, kdybych měl tu možnost získat ztracený čas zpět a vrátit zkušenosti, vybral bych si čas.

Ono to také vyplývá z filosofie webu. Web je internetová služba, která byla určená k prohlížení formátovaného textu s možností odkazování se na jiný text. Přičemž text je psán v HTM jazyce a pro přenos slouží HTT protokol. Javascript je jakási "nadstavba" HTML, stejně jako třeba CSS. Prohlížeče, které jsou určeny k prohlížení webových stránek musí umět HTTP a HTML, aby je bylo možné nazvat prohlížeči. Ale žádný z nich nemusí znát CSS, Sušenky nebo JS. Jenže časem se to zvrtlo (nebo spíš se to zvrtlo hned na začátku) a lidé chtěli, aby nejen text, ale celá stránka nějak hezky vypadala. Jenže na to ta služba nikdy nebyla dělaná. A tak holt (protože dav se nedá utišit tak snadno) muselo formátování textu vzít na sebe i roli formátování celého dokumentu. Používají se oddíly nebo tabulky pro pozicování, všechno plave nebo je fixně na obrazovce, něco se překrývá atd. CSS tomu ještě víc přispělo. A javascript? Javascriptem se řeší věci, které se dají udělat na straně serveru nebo úplně jinak. Já tím například řešil drag-and-drop divy, se kterýma si návštěvník mohl upravit vzhled stránky. Dnes bych vzhled udělal jeden a neměnný.
Dnešní můj pohled je takový, že správně navržená stránka se musí obejít bez pozicování, kaskád, koláčků i javasriptu. Pokud to nejde, je dobré se pozastavit vůbec nad tím, jestli je stránka vhodná pro web, nebo mam raději využít jinou službu internetu, případně si nějakou udělat svojí.

Čili raději bych začínal s jazykem, ve které si časem napíšu svůj vlastní HTTP server a pak pro mě nebude nejmenší problém obejít se bez všeho zmíněného, i třeba bez PHP s MySQL. Bude to jednak rychlejší, bezpečnější, a navíc budu přesně vědět co to dělá - krom toho budu mít zkušenosti, které asi jako jediné mají v této intelektuální činnosti nějaký opravdový význam.

Wimby
PHP › Online/Offline?
26. 5. 2009   #101778

Jeden z jednodušších způsobů je pamatovat si ještě čas jeho poslední reakce a když uplyne nějaká doba, řekněme pár minut, a on nezobrazí znovu stránku, tak ho vyhodit ze seznamu online...

Wimby
Pascal › Návrh jazyka založeném na Pa…
24. 5. 2009   #101659

To janik366 : 255397306

Wimby
Pascal › Návrh jazyka založeném na Pa…
24. 5. 2009   #101632

Mám pocit, že stále dochází k nepochopení.

Proto snad píšeš ten parser, který zpracuje kód před posláním na překladač, tedy i ten tvůj text v uvozovkách převede na nějakou konstantu typu String

Ovšem, ale typ String z pohledu parseru neexistuje. Neexistuje žádný typ. Jen konstrukce jako je interval, množina, ukazatel na typ, pole, záznam a třída.

Mohl bys vysvětlit jak ten tvůj překladač má fungovat?

Jistě, nejdříve se nad textem provede lexikální analýza, která rozdělí text na lexémy, se kterými se dál provede v parseru rozbor. Vytvoří se syntaktické stromy (AST), které se dál optimalizují a pokračují do druhé fáze "back-endu", kde dojde k přeložení z AST do ASM/strojového kódu. Parser není závislý na platformě a počtu bitů. Zároveň však neimplementuje žádný typ.

Čeho hodláš docílit oddělením asi knihoven/jmeného prostoru(nebo jak se tomu nadává v Packalu) System?

Tím, že nebudu muset programovat typy jako integer, real, string vnitřně v parseru, ale jako konstrukce. Zjednoduší se jednak překladač, kterej má teď přibližně 10000 řádků kódu "front-endu", a jednak bude snazší editovat knihovnu než celý překladač při změně platformy.

Systém ale teď nemá cenu řešit, dokud nemám nástroj na jeho vytvoření.

Neumět si definovat si vlastní datový typ, nemít představu, jak se parsuje kód a s tím chtít napsat OS?

Myslím, že právě tady došlo k nepochopení. Není to o neumět si definovat vlastní datový typ, ale o nemožnosti přiřadit lexém řetězce, znaku, reálného čísla konstrukci, která neexistuje - Stringu, Charu, Realu...
Freepascal i GNU pascal, implementují typy vnitřně, ba implementují celou jednotku System. Snažím se od tohoto osvobodit a odstranit pár vad (v mých očích), které se mi na pascalu nelíbí. Například procedura Write z jednotky System nelze v jazyce Pascal napsat, protože jazyk Pascal neumožňuje libovolný počet argumentů, stejně tak nezná ani dvojtečku a číslo za argumentem. Kompilátor tedy musí tuto funkci mít integrovanou v sobě - což není zrovna to, co si představuji pod slovem ideální.

Jazyk to bude stále jako standardní Pascal, ale bez procedur Write, Read, Assign, Inc, Dec..., typů Integer, LongInt, Real, String, Byte, Char..., proměnných Input, Output, a konstant, až na Nil, kterou implementuji, protože je to klíčové slovo. String je také klíčové slovo, ale kdybych to zahrnul ho parseru, tak to sice vyřeší celý problém kolem Stringu, ale stejný problém zůstane u typu Char i Real... a po zahrnutí těchto typů sice už nebudu mít problém žádný, ale pak už bude zbytečný mít oddělenou jednotku System, a při změně systému budu muset přepisovat téměř celý překladač a nebude to "ideální" řešení.

Ještě mě napadlo zavést něco jako makra s regulárním výrazem pro řešení uvozovka-text-uvozovka nebo číslo-tečka-číslo-e-číslo, ale stejně nevím, jak to přiřadit k typu a jak to udělat Pascalovsky, aby to nebylo jen "lepení".

A co si od toho slibuji? například zápisy jako:

RealneCislo := 3.14;

KomplexniCislo := 14 + 4i;
PocetJablek := 15j;
PocetMetru := 90 m;
Prodleva := 1000 ms;
Retezec := 'ahoj svete';
Pripadne := "retezec na
nekolik
radku";
A díky silné typové kontrole mi to zahlásí chybu, když se budu snažit přiřadit do proměnné PocetMetru číslo v desítkové soustavě. Mimochodem, třeba zrovna ta desítková soustava. Co když budu chtít stopy nebo dvanáctkovou soustavu? Je mnohem přehlednější, napsat ji ve formátu, ve kterém ji píšu i tužkou na papír.

Wimby
Pascal › Návrh jazyka založeném na Pa…
23. 5. 2009   #101630

To Anonymní uživatel : Zatím jsem se k psaní OS jako takového nedostal, jen k psaní překladače pro OS. Nechci to psát ve standardním Pascalu ani Object Pascalu, ale ani to nebude C, bude to něco mezi Pascalem a Adou, ale většina kódu bude víceměně Pascal. Vím, že "operačních systémů" v C už bylo napsáno víc než hodně, a tudíš nejsnazší cesta zřejmě povede tam, ale tudy já jít nechci hned z několika důvodů. A už vůbec nechci jít přes parsování Pascalu do C, protože C jakžtakž umim.

Co se týče toho systému, tak to nebude jenom systém na desktopy, ale prakticky na cokoliv. A proto ho chci napsat celý v "Pascalu". V ASM budou jen některý části jako třeba některý ovladače a zavaděč, který připraví především to nejnutnější, jako přepnutí do chráněného režimu a časovač. Jádro už by mělo být celé v abstraktním kódu. Většina ovladačů (včetně filesystému) lze taky celkem obstojně napsat ve vyšším jazyce.

Ještě k tomu co jsem napsal o příspěvek výš: kdybych ze standardního Pascalu oddělil jednotku "System", mohl bych ji pro různé systémy pouze přepsat, bez zásahu do kódu překladače. A vše by bylo mnohem jednodušší. (Navíc na některých strojích nemusí být například Byte = 8 bitů, může být třeba 12, takže tady taky jen upravím System :-)) Akorát to přináší ten Hlavní problém, že potom pro překladač neexistuje typ String spolu se zápisem uvozovka-text-uvozovka, a tak bych musel nějakým způsobem umožnit to všchno napsat "zvenčí". Napsat String pomocí pole nahradí standardní String snadno, ale neexistuje způsob, jak vytvořit zápis uvozovka-text-uvozovka. A to je právě to, s čím bych potřeboval poradit. Navrhnout způsob zapsání uvozovka-text-uvozovka :-)

On ten zápis pak bude zřejmě jen v jednotce System a třeba v jednotce FPU, která pak nejspíš bude sama zahrnována do kompilace, takže by to pak ve výsledku mělo být téměř jako standatdní Pascal :-)

Wimby
Pascal › Návrh jazyka založeném na Pa…
23. 5. 2009   #101605

Jj, přesně takhle to řeším... do regulárních výrazů jsem se nepouštěl, ale ta lexikální analýza kompilovaného kódu vypadá v principu takto:

type

Tokeny = (tPlus,tMinus,tKrat,tDeleno,tStrednik,tTecka,tIdentifikator,tBegin,tEnd,tFunction{,...});

Soubor = object
Zdroj : text;
procedure Otevri(Cesta : String);
procedure DalsiZnak;
function AktualniZnak : Char;
end;

Tokenizer = object(TSoubor)
Token : Tokeny;
Buffer : String;
procedure DalsiToken;
end;

procedure Tokenizer.DalsiToken;
begin
while AktualniZnak = #32 do
DalsiZnak;
case AktualniZnak of
'{' : PrectiKomentare;
'A'..'Z','_' : PrectiIdentifikator;
'0'..'9' : PrectiCislo;
'+' : Token := tPlus;
'-' : Token := tMinus;
'*' : Token := tKrat;
'/' : Token := tDeleno;
{...}
else
Write('Syntakticka (lexikalni) chyba - neplatny znak');
end;
end;

S těmi realnými čísly to také není nijak složité... problém nastává, když mi do syntaktické a sémantické analýzy přijde token typu tRetezec nebo tZnak, protože v kompilátoru neimplementuji tyto typy ani jiné typy. Kompilátor prostě nezná typ String ani typ Char, a tak neví, respektive já nevim, jak s tímto tokenem naložit.
A tak mě napadlo, že by mu to mohl říct programátor až v kódu - jen nevím jak (a to je ten hlavní problém) :-)

Představu mám asi takovou:
type

Byte : 0..255; {úplně nejdřív deklaruju typ Byte, který použiju u předefinování přiřazení}
Char : 0..255; {pak deklaruju typ Char - stejně jako Byte}

{teď už překladač typ Char zná, ale ještě nerozumí formátu #číslo - musím "definovat formát hodnoty k tomu typu"}

{teď přetížím operátor přiřazení, protože se ten křížek s číslem (#číslo) používá jen u přiřazení}
{tady bych zavedl nové klíčové slovo, třeba TOKEN, které by mi proměnnou naplňovalo postupně tím, co je v kódu}
operator := (token Znak : Byte) Vysledek : Char;
var
Aktualni : Byte;
begin
{každé přečtení hodnoty Znak by způsobilo posunutí pozice v překládaném kódu na následující Byte}
{a tady by to už zůstalo na programátorovi}
if Znak = 38 {nevim, jaké číslo má křížek (#) v ASCII} then
begin
Aktualni := Znak; {prvni Byte za #}
if Aktualni = {ASCII hodnota pro dolar '$'} then
begin
Vysledek := Char(Aktualni);
Aktualni := Znak;
while Aktualni in [{ASCII hodnota pro nulu}..{ASCII hodnota pro devítku},{pro 'A'}..{a pro 'F'}] do
begin
Vysledek := Vysledek + Char(Aktualni)
Aktualni := Znak;
end;
end
else if Aktualni = {cislo procenta '%'} then
begin
Vysledek := Char(Aktualni);
Aktualni := DalsiZnak;
while Aktualni in [{'0'},{'1'}] do
begin
Vysledek := Vysledek + Char(Aktualni);
Aktualni := Znak
end
end
else
begin
while Aktualni in [{'0'}..{'9'}] do
begin
Vysledek := Vysledek + Char(Aktualni);
Aktualni := Znak;
end;
{ a tady přijde na řadu to VAL }
end
end
end;

Tak takhle by to mohlo například vypadat pro Char... pro ten řetězec by to bylo podobné. Tak by mě zajímalo, co vy si o tom myslíte.

Jinak ten operační systém má být opravdu systémem a bude psán v pascalu. Jen pro něj dopíšu ten překladač :-).

Wimby
Pascal › Návrh jazyka založeném na Pa…
21. 5. 2009   #101580

Dobrý den,

chtěl bych si napsat operační systém - s dobře čitelným a především bezpečným kódem, abych měl stoprocentní kontrolu nad věcmi, které bude provádět. Dobře čiltelná je pro mě pascalovská syntaxe, jenže jsem nenašel překladač, ve kterém by to šlo napsat... tak jsem si začal psát svůj, ale časem to přestávalo mít s pascalem tolik společného. Například, aby to bylo jednodušší, nezná to standardní typy (dají se snadněji napsat do zdrojovýho kódu, než zahrnout do překladače). Jedinné typy, které nejdou stoprocentně nadeklarovat jsou typy POINTER a STRING. Typ POINTER mi nevadí, že nebude existovat - alespoň to bude bezpečnější. STRING se dá deklarovat s pevně zadanou délkou polem, takže v tom taky nebude hlavní problém... Jenže když nebude existovat STRING nebo CHAR, tak nevím, jak by překladač přiřadil hodnotu řetězce nebo znaku ('něco',#32).
Na druhou stranu, tohle se vyskytuje jen u přiřazení, a přiřazení je možné přetypovat. A tady bych potřeboval poradit... V mnoha jazycích je možné definovat si vlastní typ. Jsou jazyky, ve kterých je možné si definovat i vlastní hodnotu k tomu typu?

Například:

type

Char = 0..255;

operator := (token) hodnota : Char;
begin
if token = '#' {tady by muselo byt cislo toho znaku, protoze retezec to nezna} then
while token in ['0'..'9' {tady take}] do
hodnota := token; {nejaka uprava, pro prevod z desitkove do binarni podoby}
end;


Jelikož přiřazení je konstatní, překladač by ho podle příkazů v "operator :=" zoptimalizoval už při překladu a v přeloženém kódu by nic z toho nebylo...
Dále by to ovšem chtělo posílit typovou kontrolu. Například:
type

Char = 0..255;
Byte = 0..255;

aby Char i Byte byly mezi sebou nekompatibilní.

Nenapadá vás tedy nějaký způsob, jak by bylo možné nadefinovat si formát vlastní hodnoty?
Například #číslo bude Char, číslo.čísloE-číslo bude pro Real, číslo+čísloI bude pro Complex, čísloM bude pro Metr a jiné... :-)

Wimby
Pascal › Základy slušného chování - p…
19. 3. 2009   #97586

K pochopení co je kdy lepší použít, je nutné vědět, jak s tím naloží překladač.
Když budu mít parametr, který se nevejde do registru procesoru, a budu ho chtít jenom číst, jako třeba nějaký velký pole, tak mi přijde lepší ho načítat jako globální proměnnou, protože se pak obejdu zbytečnému kopírování.

Takže:

write('ahoj světe')
, je pomalejší než:
napis := 'ahoj světe'; write(@napis)
protože v prvním případu se celé pole (256B) zkopíruje jako parametr a pak vypíše, kdežto ve druhém případu se vypisuje rovnou z paměti a ušetří se krok kopírování. Pokud bych však chtěl pole uvnitř funkce nějak upravit, ale aby to nemělo vliv na proměnnou "napis", tak by bylo rychlejší použít celý řetězec jako parametr.

Stejně tak když deklaruju lokální promennou, tak:
procedure foo;

var
neco : integer;
pole : array[0..49000] of integer;
begin
{ přístup k proměnné "neco" bude pomalejší než když budu deklarovat dříve to pole a neco až jako poslední }
end;


U globálních promenných toto neplatí, tam je přístup ke všem promenným v konstantním čase.
Čili v obou případech, jak už tady zaznělo, záleží na okolnostech. Ale globální promenné nemají za úkol znepřehlednění kódu, stejně tak jako ho můžou znepřehlenit, tak ho můžou i zpřehlednit!

A nebo jdou použít objekty:
TFont = object

private
Font : Pismo;
BarvaTextu : Barva;
Velikost : Body;
public
procedure NastavFont(font,barva,velikost);
procedure NapisText(text);
end;

Wimby
Pascal › pomoc s úkolem
16. 12. 2008   #92092

Jo já přehlédl readkey :-) v tom případě by tam ten READLN byl irelevantní, chyba je tedy pouze v přiřazování :-)

Wimby
Pascal › pomoc s úkolem
16. 12. 2008   #92088

To co přiřazuješ k proměnný 'c' je zcela náhodný číslo, pravděpodobně vyjde -m1
Ale jinak - program se ukončí, protože pokud until vyhodnotí true, tak už za ním není žádný příkaz, který by mu v tom zabránil.
Mělo by bohatě stačit na konec napsat READLN; což ukončí program až když se stiskne ENTER

Wimby
Pascal › Pomoc s domácím úkolem
16. 12. 2008   #92078

Jo, to je fakt, za to se omlouvám

Wimby
CSS › Stejná výška dvou divů
16. 12. 2008   #92071

To DragonBehemont : V kterém prohlížeči ti to nešlo? Asi jsem v tom teda udělal chybu... princip je takovej, že levej panel se neroztahuje, roztahuje se ten div "pod" ním, který má barvu levého panelu a obsah je taky uvnitř, ale nemá žádnej float, začíná vlevo od pravého panelu a roztahuje ten div "pod". No a k tomu, aby se zaručilo, že se roztahne levý panel vůči tomu pravému, tak je v tom pravým div se stylem clear:both...
zatim jsem to zkoušel na IE 5.5, 6, 7, Mozille 2, Opeře 9 a Safari 3, a oba divy se roztahly jak měly...

Wimby
Pascal › Pomoc s domácím úkolem
16. 12. 2008   #92059

Podle mne je zbytečné zpočítávat do rovnice i původní teplo C * (t - t1) - nebo co to je, opravte mě, jestli se mýlím :-)... čili rovnice by vypadala asi nějak: c1 * m1 * (t1 − t) = c2 * m2 * (t − t2) a jestli-že se jedná o tutéž vodu, pak c1 = c2 a jde krátit, čili výsledná rovnice by byla pouze: m1 * (t1 − t) = m2 * (t − t2)

Co se týče programu, tak nemůžeš mít stejný identifikátor pro dvě a víc symblů - máš tam "c" jako konstantu i proměnnou.
Používání knihovny CRT, když z ní žádnou funkci nebereš je také zbytečné (kompiler by to měl sice odstranit sám, ale proč si přidělávat práci :-) )
No a co se týče tý nabídky OPAKOVÁNÍ nebo skončení, tak to musíš buď celé uzavřít do cyklu, nebo tam definovat návěstí (návěstí se učiteli předpokládám nebude líbit - není-li tak zvrhlý jako já ;-) )

čili to vidím asi takhle:

var

m1,t1,t,m2,t2 : real; {vsechny promenne z rovnice budou zde}
ukonci : char; {pomocna promenna, ktera uchova hodnotu jestli chci pokracovat nebo ukoncit}
begin
ukonci := 'n'; {jaka koliv hodnota, krome 'a', coz znamena ukonceni programu}
while ukonci <> 'a' do
begin
write('Zadej hmotnost 1 [kg]: ');
readln(m1);
write('Zadej teplotu 1 [K]: ');
readln(t1);
write('Zadej hmotnost 2 [kg]: ');
readln(m2);
write('Zadej teplotu 2 [K]: ');
readln(t2); {az sem je to jasny, ted se ale rovnice musi predelat do tvaru t = xxx, nebo pouzit dalsi pomocnou promennou}
t := (m1 * t1 + m2 * t2) / (m1 + m2); {m1 + m2 se nesmi rovnat nule}
writeln('Celkova teplota je: ',t);
writeln('Chcete-li ukoncit program napiste 'a': ');
readln(ukonci);
end;
end.


Nabídka ukončování nebo pokračování se dá udělat mnohlem lépe, ale tohle by mělo stačit

Wimby
CSS › Stejná výška dvou divů
15. 12. 2008   #92012

Tak to zkus, třeba budeš mile překvapen :-)
BTW pokud bych zadal výšku přesně, tak by nebyla flexní

Wimby
CSS › Stejná výška dvou divů
15. 12. 2008   #92007

Zkoušel jsi to co jsem tu napsal? Možná je v tom někde chyba, ale mělo by se to zobrazit tak, jak chtěl. Obrázky maj nevýhodu v tom, že je striktně daná šířka.

Wimby
CSS › Stejná výška dvou divů
15. 12. 2008   #92005

předpokládám, že:

>> potřeboval bych vědět jak nastavit aby byly oba divy content i right_menu stejne vysoké, tzn. right_menu ná text navíce řádků a já chci aby i ten div content byl stejně vysoký v závislosti na tom sloupci right_menu a ne v zavislosti na textu co obsahuje..

Pokud jsem to dobře pochopil, tak chce dva divy, které mají stejnou výšku v závislosti na obsahu alespoň jednoho z nich

Wimby
CSS › Stejná výška dvou divů
15. 12. 2008   #92003

A neříkejte mi, že něco nejde vyřešit jinak než blablabla :-) Nejde je jenom jedno slovo z obrovského kvanta možností :-P

Wimby
CSS › Stejná výška dvou divů
15. 12. 2008   #92001

ten div s clear : both (teoreticky i clear : left) musí být uvnitř OBSAHu, a nejspíš tam musí být div - s tagem hr mi to nefungovalo v IE

Wimby
CSS › Stejná výška dvou divů
15. 12. 2008   #91999

Kdysi jsem řešil způsob, kterým by se to dalo udělat BEZ obrázku. Ne, že bych se chtěl vytahovat, ale přišel jsem na něj :-P Tedy jedná se spíše o chybu, ale zatím to zobrazil každý, mnou známý, prohlížeč stejně... :-)
Má to svá jistá omezení, ale pořád je to lepší než obrázek (alespoň se to může lépe přizpůsobit šířce)

<html>

<body>
<style type="text/css">
<!--
body
{
text-align : center; /* zarovnání na střed pro IE */
}
#OBAL
{
width : 80%;
background : blue; /* barva pozadí LEVÉHO divu */
margin : auto; /* zarovnání na střed pro nonIE */
text-align : left; /* soucast zarovnani pro IE */
}
#LEVY
{
width : 199px; /* myslim, ze tohle slo resit i lepe, ale ted si nemuzu vzpomenout, asi position : relative; a width : 100% */
float : left;
}
#OBSAH
{
margin-left : 200px; /* tohle urcuje sirku leveho divu */
background : red;
border-left : 5px solid black;
}
-->
</style>

<div id="OBAL">
<div id="LEVY">Tady je text leveho "panelu"</div>
<div id="OBSAH">Tady je text obsahu (pokud je potreba udelat treti panel, tak se situace trochu komplikuje, ale myslim, ze by mel fungovat stejny postup s tim, ze cely "komplex" divů bude vlozen do OBSAHU)<div style="clear:both;font-size:1px;">tohle je ten zazrak :-) Je nutne, aby tu byl nejaky text, staci i prazdna mezera, velikost pisma pak jde nastavit na nulu</div></div>
</div>
</body>
</html>

Wimby
Pascal › Přetěžení metody v objektu
15. 12. 2008   #91977

Dvojprůchodový algoritmus by byl jistě jednodušší, ale přinesl by řadu nevýhod, jako třeba to, že nevim jak bych to udělal, abych nemusel mít zdroj načtený celý, abych ho nemusel přeukládat.

Jde to udělat, možná stejně jednoduše, i s jedním průchodem, ale hledám způsob, který by byl lepší... abych nemusel použít tolik struktur, aby stačil pouze jeden objekt (do objektů sem to přepsal, protože mi přišlo, že tam mam hodně globálních proměnných), a aby to bylo co možná nejrychlejší... hlavně to programuju proto, abych se něco naučil a to se mi těžko povede datlováním pořád stejnýho kódu :-)

Nevim jestli je to chyba, ale Freepascal nějak zpřístupní celý objekt po tom přiřazení fuknce k proměnné a sice to ještě nepracuje tak jak by mělo, ale vrací to

AHOJ NAZDAR LIDI     E.


type

PT = ^T;
T = object
SOUBOR : string;
POZICE : byte;
function VRATZNAK : char;
PARSOVANI : function : string of object;
PARSOVANI_ZALOHA : function : string of object;
constructor PRIPRAV(VETA : string);
function ZNAK : char;
function PARSUJ : string;
end;


constructor T.PRIPRAV(VETA : string);
begin
SOUBOR := VETA;
POZICE := 1;
PARSOVANI := @PARSUJ;
end;

function T.VRATZNAK : char;
begin
VRATZNAK := SOUBOR[POZICE];
end;

function T.ZNAK : char;
begin
if POZICE = length(SOUBOR) then
begin
PARSOVANI := PARSOVANI_ZALOHA;
end;
inc(POZICE);
ZNAK := VRATZNAK;
end;

function T.PARSUJ : string;
var
PODRADNY : PT;
begin
PARSUJ := '';
while VRATZNAK = ' ' do
ZNAK;
while VRATZNAK in ['A'..'Z'] do
begin
PARSUJ := PARSUJ + VRATZNAK;
if PARSUJ = 'INCLUDE' then
begin
new(PODRADNY,PRIPRAV('NAZDAR LIDI'));
PARSOVANI_ZALOHA := PARSOVANI;
PARSOVANI := @PODRADNY^.PARSUJ;
PARSUJ := PODRADNY^.PARSUJ;
exit;
end;
ZNAK;
end;
end;

var
HLAVNI : PT;

begin
new(HLAVNI,PRIPRAV('AHOJ INCLUDE SVETE'));
repeat
writeln(HLAVNI^.PARSOVANI);
until HLAVNI^.VRATZNAK = #0;
end.

Wimby
Pascal › Přetěžení metody v objektu
14. 12. 2008   #91913

Dík za objasnění :-)

Jenom když teda udělám ve freepascalu (FP)

type

proc = function : char of object; { "of object" značí ve FP, že je typ součástí třídy }

o = obejct
p : proc;
end;


Jak s tou proměnnou procedurálního typu můžu pracovat uvnitř třídy? Například pokud s ní chci pracovat jako s normální funkcí, která vrací znak, tak to nejde.

if o.p = 'A'
napíše chybu v kompatibilitě typů

Wimby
Pascal › Přetěžení metody v objektu
12. 12. 2008   #91714

Super :-)

To je přesně ono :-) Já sem se jenom špatně vyžvejkl... Myslel sem si, že je to něco s typem PROCEDURE, ale ten sem ještě v praxi nikdo neviděl a nevim jak se s ním pracuje. Snad to tedy půjde i v objektech.

Díky Vám všem za pomoc :-)

BTW co přesně znamená to FAR? Jak to pak vypadá ve skutečnosti (po kompilaci) a je taky něco jako NEAR? Je rozdíl mezi FAR v 16-bitovém programu a FAR v 32-bitovém?

Wimby
Pascal › Přetěžení metody v objektu
12. 12. 2008   #91684

No, už je to blíž, ale ještě pořád to není ono :-)

Hlavní rutina hlavního programu je trochu komplikovanější než sem tu uvedl - jde mi o princip nikoliv naprogramování... řekněme, že to while < 10 by mohlo nahradit while POZICE <> length(SOUBOR) a to if cislo = 7 nahradí if PARSUJ = "INCLUDE", ale metoda PARSUJ nezkouší jenom jestli se to rovná INCLUDE :-)
Zkouší toho mnoho a opisovat to znovu mi nepřijde jako dobrý nápad. Navíc potřebuju volat pouze metody instance HLAVNI v hlavní části programu.

Krokování předchozího:

01. new(HLAVNI,Priprav); - vytvoření instance třídy T; POZICE = 1

02. je POZICE různá od length(SOUBOR) ? - ano, skoč do cyklu while
03. je HLAVNI.PARSUJ rovno INCLUDE ? ne, parsuj vrátilo "ahoj"
04. zvyš POZICI o jedna
05. je POZICE různá od length(SOUBOR) ? - ano, pokračuj v cyklu
06. je HLAVNI.PARSUJ rovno INCLUDE ? ne, parsuj vrátilo "svete"
07. zvyš POZICI o jedna
08. je POZICE různá od length(SOUBOR) ? - ano, pokračuj v cyklu
09. je HLAVNI.PARSUJ rovno INCLUDE ? ano, parsuj vrátilo "INCLUDE"
10. vytvoř novou instanci třídy T (PODRADNA) a do PODRADNA.SOUBOR nacti data ze "druhy_soubor.txt"
11. zvyš POZICI o jedna - tady koukám, že mam chybu mělo by tam u té podmínky být ELSE :-) ale to nevadí. Podstatné je,
aby ta POZICE byla z instance PODRADNA (tedy rovna jedné a ne tři), nikoliv HLAVNÍ, ale vylezla po volání HLAVNÍ (overload!!!)
12. je HLAVNI.PARSUJ rovno INCLUDE ? NE - HLAVNI.PARSUJ vrátilo PODRADNA.PARSUJ!!!!!! tedy "nazdar"!!!!
13. ... atd.


Jak tedy docílím toho, aby mi HLAVNI.PARSUJ vrátila to, co vrací PODRADNA.PARSUJ?

Možná podobně jako v C
zaloha := this;

this := podradna;
...
this := zaloha;


Dispose PODRADNE nastane až se PODRADNA.POZICE bude rovnat length(PODRADNA.SOUBOR) a vše se vrátí zpět pod kontrolu "pravých/nepřetěžených" metod instance HLAVNI :-)

Jestli sem se ještě správně nevymáčkl, tak se omlouvám :-)

Wimby
Pascal › Přetěžení metody v objektu
12. 12. 2008   #91681

Pravda, omlouvám se za tu chybu, že jsem nedeklaroval proměnnou... nicméňe problém (nebo spíš dotaz) neni ohledně deklarování, ale ohledně předání řízení (overload) metody. Mělo by to být zřejmé z toho očekávaného výstupu, ale asi jsem se špatně vyjádřil, tak se pokusím ještě uvést konkrétnější příklad :-)
BTW dispose je teď nepodstatné



type
PT = ^T;

T = object
cislo : integer;
constructor Priprav;
function A : integer;
procedure B;
end;

constructor T.Priprav;
begin
cislo := 1;
end;

function T.A : integer;
begin
inc(cislo);
A := cislo;
end;

procedure T.B;
var
PODRADNA : PT;
begin
new(PODRADNA,Priprav);
{ DOTAZ> jak udelat, aby nova instance T "PODRADNA" obsadila (přebrala řízení pro) metodu "HLAVNI.A" }
end;

var
HLAVNI : PT;

begin
new(HLAVNI,Priprav);
while HLAVNI^.cislo < 10 then begin
if cislo = 7 then
HLAVNI^.B;
wrte(HLAVNI^.A);
end;
end.


Konkrétní příkald: Mám třídu T, která se skládá z proměnných SOUBOR (to může být třeba pole znaků), POZICE (udržuje pozici v poli, ze které se čte znak) a metody CTIZNAK (zvýší POZICI o 1 a vrátí další znak v poli) a PARSUJ (která mi vrací třeba slova - typ string). Z vnějšku se k tý třídě dostanu přes proměnnou HLAVNÍ a volám metodu PARSUJ (dále pak v programu pracuju s tím co vylezlo z metody PARSUJ). Pokud ale metoda PARSUJ v poli SOUBOR narazí na slovo "INCLUDE"(mezera)CESTA, pak vytvoří novou třídu T (PODRADNA), ktera si konstruktorem naplní pole SOUBOR daty ze souboru CESTA.

Až do teď to je bez problému...

Ale...

Potřebuju abych dalším voláním HLAVNI.PARSUJ dostal slovo z PODRADNA.PARSUJ, potažmo aby PODRADNA.CTIZNAK obsadila metodu HLAVNI.CTIZNAK.

Mám-li dva soubory

prvni_soubor.txt


ahoj světe
INCLUDE druhy_soubor.txt
já jsem první soubor


druhy_soubor.txt


nazdar lidi


Po aplikování třídy by měl být výstup HLAVNI.PARSUJ postupně:


1. ahoj
2. světe
3. nazdar
4. lidi
5. já
6. jsem
7. první
8. soubor


ale jinak děkuji za odpovědi :-)

Wimby
Pascal › Přetěžení metody v objektu
11. 12. 2008   #91637

Tak já to trochu rozepíšu. Přetížení myslim jako overload, ale nevim jestli se tomuhle tak říká, takže:

Mam třídu T, která má metody A a B.
Metoda A dejmetomu vrací postupně číslo zvětšené o 1
Metoda B vytváří novou instanci T - new(T), která by mi ale měla ovlivnit (přetěžit) metudu A v současné instanci T (tedy v té, která právě vytvořila instanci)

Příklad:

type
T = object
cislo : integer;
constructor Priprav;
function A : integer;
procedure B;
end;

constructor T.Priprav;
begin
cislo := 1;
end;

function T.A : integer;
begin
inc(cislo);
A := cislo;
end;

procedure T.B;
begin
new(T,Priprav);
{ nove T ted bude prebirat metodu "this.A" }
end;

begin
new(T,Priprav);
while T.cislo < 10 then begin
if cislo = 7 then
T.B;
wrte(T.A);
end;
end.

Jako výstup bych tedy očekával 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 ...

Wimby
Pascal › Přetěžení metody v objektu
11. 12. 2008   #91603

Ahoj,

mám objekt, který má metody A a B. V metodě A vytvořím nový objekt. Šlo by v Pascalu udělat, aby ten nový objekt, přetěžil metodu B prvního (současného) objektu?

Pascal › Optimalizace spojového seznamu
20. 10. 2008   #87936

To Mircosoft : To neni špatnej nápad :-)
Akorát nevim jak by se to dalo udělat...

teď ta struktura symbolů vypadá přibližně nějak takhle:

symbol = record

jmeno : string;
dalsi : ^symbol;
{...}
case typ : (konstanta,promenna,typ{...}) of
konstanta : (definiceKonstanty : ^definice;
hodnotaKonstanty : hodnota);
promenna : (definicePromenne : ^definice;
typPromenne : typyPromennych);
typ : (definiceTypu : ^definice);
{...}
end;


to by to pak vypadalo nějak takhle?

seznam = record

uzel : ^uzel;
dalsi : seznam;
end;

uzel = record
pismeno : char;
seznamSymbolu : ^seznam;
symbol : ^symbol;
end;


přičemž by to začínalo řekněme uzlem s písmenem 'A', kterej by odkazoval pomocí seznamu symbolu na všechny uzle začínající písmenem A a nějak pokračující a pokud by se vyskytnul symbol s názvem 'A', tak by se přidal do uzle pod položku 'symbol'?

Je fakt, že tohle by se docela mohlo vyplatit, protože už sem mnohokrát viděl symboly začínající stejně, například Read, Get nebo Put... ale zajímalo by mě jestli je to potom rychlejší než binární strom a okolik víc paměti to veme... :-)

Pascal › Optimalizace spojového seznamu
19. 10. 2008   #87826

To Laaca : Asi na to teda kašlu... ale pořád na to musim myslet, že je tam něco, co vim že by nějak šlo zrychlit a nedává mi to spát :-)
Taky nechci dělat dvě verze kompileru, ale jednu pořádnou :-)
Ale nechám to teda na poslední fázi... což stejně už bude brzy :-) a pak teda asi udělám normální binární vyhledávací strom a po každym insertu ho převážim, to bude rychlejší než spojový seznam a bude to delší jenom o pár desítek řádků :-)

Pascal › Optimalizace spojového seznamu
19. 10. 2008   #87798

Jj, hashe dělat nebudu...

To Laaca : Je to něco mezi 1) a 2) :-)
Je to na strukturu symbolů v kompileru. Na začátku vkládám přibližně 50 údajů-identifikátorů (standatdní názvy typů, funkcí, operátorů, konstant a proměnných) a pokaždé když při kompilaci kódu narazim na identifikátor, tak se hledá, jestli náhodou už neexistuje. Ovšem od těch identifikátorů očekávám, že v tom seznamu nejsou, proto se musí, podle mě zbytečně, projíždět celej spojovej seznam a to pokaždý, když se narazí na identifikátor... je to sice prkotina, ale už mam kompiler "skoro" hotovej, tak se koukám, co by tam šlo zrychlit :-)
A taky chci mít úpravy co nejsnazší, abych nemusel přepisovat celej kompiler :-)
Jo a ještě co se týče toho seznamu identifikátorů, tak ten se maže naráz na konci kompilace...

Napadla mě ještě jedna věc, menuje se to myslim přeskokovej seznam a vypadá to nějak takhle:

4---------------8---------------nil
2-------4-------6-------8---nil
1---2---3---4---5---6---7---8---9---nil

Kde když budu chtít 8, tak jí budu mít na dva kroky, ale nevim pořádně jak to udělat a taky mi přijde, že ty stromy budou rychlejší a zaberou míň paměti

Pascal › Optimalizace spojového seznamu
18. 10. 2008   #87750

To je fakt, na to sem nějak zapomněl :-D

čili to bude vypadat nějak takhle:

type

pStrom = ^tStrom;
tStrom = record
jmeno : string;
vlevo : pStrom;
vpravo : pStrom;
end;


function PorovnejJmena(jmeno1,jmeno2) : shortint;
var
i : byte;
begin
for i := 1 to length(jmeno) do
if ord(jmeno1[i]) < ord(jmeno2[i]) then begin
PorovnejJmena := 1;
exit;
end else if ord(jmeno1[i]) > ord(jmeno2[i]) then begin
PorovnejJmena := -1;
exit;
end;
if length(jmeno1) = length(jmeno2) then
PorovnejJmena := 0
else
PorovnejJmena := 1;
end;

function Hledej(vetev : pStrom; jmeno : string) : pStrom;
var
cislo : shortint;
begin
while assigned(vetev) do begin
cislo := PorovnejJmena(vetev^.jmeno,jmeno);
if cislo = 0 then begin
Hledej := vetev;
exit;
end else if cislo < 0 then
vetev := vetev^.vlevo
else
vetev := vetev^.vpravo;
end;
Hledej := nil;
end;

Pascal › Optimalizace spojového seznamu
18. 10. 2008   #87734

teď to vypadá asi takhle:

type

pSeznam = ^tSeznam;
tSeznam = record
jmeno : string;
dalsi : pSeznam;
end;

function Hledej(polozka : pSeznam; jmeno : string) : pSeznam;
begin
while assigned(polozka) do begin
if polozka^.jmeno = jmeno then begin
Hledej := polozka;
exit;
end;
polozka := polozka^.dalsi;
end;
Hledej := nil;
end;


Potřeboval bych něco jako MD5, který by mi udělalo z "jmena" unikátní číslo, takže bych pak měl strom:

type

pStrom = ^tStrom;
tStrom = record
jmeno : string;
cislo : dword;
vlevo : pStrom;
vpravo : pStrom;
end;


function VypocitejCisloPodleJmena(jmeno) : dword;
{...}

function Hledej(vetev : pStrom; jmeno : string; cislo : dword) : pStrom;
begin
while assigned(vetev) do begin
if vetev^.cislo = cislo then begin
Hledej := vetev;
exit;
end else if cislo < vetev^.cislo then
vetev := vetev^.vlevo
else
vetev := vetev^.vpravo;
end;
Hledej := nil;
end;


Nebo nějakou proceduru, která by porovnala dva řetězce a rozhodla by (pokaždý stejně) jestli to patří doprava nebo doleva nebo jestli se rovnají...

Do hashů se mi moc pouštět nechce... :-)

Pascal › Optimalizace spojového seznamu
18. 10. 2008   #87731

Jo, ty stromy sou mi jasný, ale jak mam udělat to lexikografický uspořádání? Nejlepší by bylo, aby pro každej název šlo udělat nějaký unikátní číslo, který bych porovnával jenom jestli je větší, menší nebo se rovná.

Pascal › Optimalizace spojového seznamu
18. 10. 2008   #87678

Jenže pro hash musim znát počet prvků ne? A to já nevim, může jich bejt 100, může jich bejt 500, může jich bejt ale i třeba 2 000 000...

Pascal › Optimalizace spojového seznamu
18. 10. 2008   #87660

Ahoj,

Nevíte jakym způsobem by šlo urychlit procházení spojového seznamu kde závisí na názvu položky?
příklad:

polozka = record

nazev : string;
dalsi : ^polozka;
end;


Položek není mnoho (kolem 500-5000), ale jsou velice často hledány právě podle názvu, takže je kolikrát nutné projet celý seznam...

Napadlo mě, že bych mohl udělat strom, který by se řadil v závislosti na názvu větví:

strom = record

nazev : string;
cislo : dword;
vlevo : ^strom;
vpravo : ^strom;
end;


Napřed by se podle názvu vypočítalo číslo (a = 1, b = 2, c = 3 ... => 'ahoj' = 1 + 8 + 15 + 10 => cislo := 34) a pokud by číslo bylo menší než číslo v kořenu stromu, pak by se hledalo vlevo a pokud by bylo větší, tak by se hledalo vpravo... Bohužel spousta slov může tvořit stejné číslo... a pak to má ještě jednu nevýhodu, a to že pokud jako první bude nějaký slovo s vysokým číslem, pak to bude stejný jako spojovej seznam, protože všechny slova budou vlevo...

Nevíte někdo nějakej lepší způsob jak zrychlit hledání?

Wimby
Pascal › Operační systém Pascalu
18. 10. 2008   #87640

To Matrix17 : Tak Vám nevím, ale všechny diskuse na téma Pascal vs. C mi přijdou na jedno brdo. Zohledňuje se jenom to jestli je blbý psát "BEGIN" místo "{" a "END" místo "}" nebo jestli je pohodlnější psát "VOID" a "FUNCTION" místo "PROCEDURE" atp.
Pokud píšu třeba KOMPILER, WEBOVEJ PROHLÍŽEČ nebo OPERAČNÍ SYSTÉM, pak je mi jedno jestli jsem musel napsat 5 písmenek pro začátek bloku kódu a 4 znaky pro napsání END se středníkem. Taky je mi jedno jestli píšu funkci u který nechci, aby něco vracela jako PROCEDURE nebo jinak... tohle je věc programátorskýho stylu a stejně tak jako jiní, i já v tom mám systém a ve svém kódu se velice dobře vyznám. Jde spíš o ZVYK. V celkové době psaní operačního systému je zanedbatelných nějakých pět písmen na každej begin, protože tam nejde o to to NADATLIT do nějakýho štrůdlu kódu, kterej se pak nějak bude chovat. Jde tam o strukturu, o algoritmy, o celkový řešení problému. Ne nějaký blbý beginy. A z celkovýho hlediska knihoven: :-)
knihovna NEPATŘÍ k jazyku! Je hloupé tvrdit, že Pascal má jednotku CRT a C může mít jinou, ale třeba i mnohem lepší... to koneckonců může mít Pascal taky... a pokud jde o práci s GUI nebo API, tak pravděpodobně JEDINEJ rozdíl je tam mezi klíčovýma slovama USES a INCLUDE :-)
Dál už sem tu diskusi na téma Pascal vs. C nečetl... četl sem jiné téhle podobné. Bohužel nikdo nedokázal C obhájit nějakym konkrétnim příkladem, kterej by v Pascalu nešel vyřešit. A na druhou stranu nikdo nedokázal Pascal obhájit nějakym konkrétním příkladem, kterej by v C nešel vyřešit :-)

Pokud se na to podívám z větší vejšky než ze svojí židle, tak ZÁSADNÍ rozdíl nevidim. Vidim rozdíl mezi Javou a C, vidim rozdíl mezi Prologem a Pascalem, a vidim rozdíl mezi Assemblerem a Fortamen. Ale nevidim rozdíl mezi C a Pascalem, když pominu rozdíly v klíčových slovech a minimální odlišnosti, který se daj snadno nahradit v obou jazycích... Je to individuální jestli programovat v C nebo v Pascalu... Pravděpodobně si mnoho lidí k Pascalu vytvořilo nechuť právě kvůli tomu, že se to učí na školách... něco jako povinná četba... :-)

Myslím si, že jádro Linuxu by šlo přepsat do Pascalu bez změn v kódu. :-)

To Laaca : Je pravda, že sem to trochu přehnal tim slovem nestačí... ale i tak bych to asi raději psal v assembleru... i když, když nad tim tak přemejšlim, tak Filesystem, případně i to TUI bych řešil Pascalem. :-)

Wimby
Pascal › Přetypování operátorů
18. 10. 2008   #87637

To Laaca : Díky moc, to je přesně to co sem hledal. A je to standard Pascalu nebo je to jen nadstavba FreePascalu?

Wimby
Pascal › Přetypování operátorů
17. 10. 2008   #87588

Dík, ale já myslel přetypování operátorů... myslim, že se k tomu používá klíčový slovo OPERATOR :-)
Jako že si třeba z plusu uděláš mínus :-)

Wimby
3D Studio MAX › V čem se dělaj hry
17. 10. 2008   #87584

Mno, tak tedy k tvorbě hry :)

Není vůbec důležitý v čem se to dělá, důležitej je pouze výslednej model. Viděl jsem jak někdo udělal v malování obrázek, kterej vypadal jako fotka. Jsou programátoři, kteří na to maj vlastní nástroje... Prostě výstup u bitmapovýho obrázku musí obsahovat definici barvy jednotlivých bodů a informaci o rozměrech obrázku. Co se týče 3D grafiky, tak tam jsou nutný 3 čísla pro každej bod (pozice X,Y a Z), potom relace mezi bodama, který definujou polygony a pak ještě informace o tom, kde se bod nachází na textuře, informce o materiálech, informace o kostech, pomocný objekty, nastavení, klíčový snímky, textury... vlastně výslednej soubor může bejt SKRIPT, definující například kam až se může ohnout ruka a tak :-)
Tohle samozdřejmě může bejt zapsaný jakkoliv. Hra se potom chová jako RENDER, kterej vykresluje objekty podle různých algoritmů. Případně to vykreslí grafická karta, ale procedury na čtení modelů si stejně musí udělat programátor :-)
Proto tohle dělá tým lidí, kteří si to nechávají solidně proplatit.
Na výslednou hru si pak udělaj nejlépe nějakou ochranu za kterou taky něco zaplatí, a kterou v mnoha případech neni těžký najít a obejít, a pak pár dobráků nasdílí hru i s crackem a producent má další ztráty zisku :-)

Wimby
Pascal › Přetypování operátorů
17. 10. 2008   #87575

Ahoj, píšu kompiler na Pascal a už sem se dostal k přetypování operátorů, ale nenašel sem nějak vhodnou dokumentaci, která by plně popisovala jak se zapíše přetypování... nevíte někdo jak to dělá třeba Delphi?

Anonymní uživatel
Pascal › Operační systém Pascalu
17. 10. 2008   #87571

Že byl Pascal původně navrženej jako jazyk na výuku strukturovanýho programování vůbec neznamená, že se v něm nedá naprogramovat něco pořádnýho, stějně tak, jako to neznamená, že v něm jde udělat všechno... Jsou věci na který Pascal ani C nestačí, jako třeba BootLoader nebo internetová stránka nebo něco na co se používá funkcionální programování.
Nechci tady vyvolat další válku na téma Pascal vs. C, podle mě jsou to velice podobné jazyky u kterých spíš než na návrhu jazyka samotnýho závisí na samotných překladačích. Opravte mě jestli se mýlím, ale nějak šetrně, protože už půl roku programuju kompiler na Pascal :-)
P.S.: Slova jako NESMYSL a jim podobná jsou bez podložení BEZ VÝZNAMU, jenom vypadaj drsně. Například Pascal má typ String nebo má přepínač pro záznam, což nevim jestli má C...
P.S.2: Jeden operační systém jsem myslim viděl v Pascalu, jmenoval se Glider nebo tak nějak

Wimby
Pascal › Operační systém Pascalu
15. 10. 2008   #87439

To KIIV : V Pascalu neni o tolik víc kontrol oproti C nebo dokonce Assembleru... Co se týče třeba ukazatelů, tak v C se musí stejně tak kontrolovat jako v Pascalu, a obecně: čim nižší jazyk, tim víc kontrol, takže v Assembleru si je budeš muset tuplem hlídat. Totéž platí třeba u indexů polí. Dle mýho názoru Assembler na tvorbu OS neni úplně to pravý ořechový. Je lepší mít OS napsanej v abstraktnim kódu, než v konkrétnim. Třeba pokud budeš chtít z 32-bitovýho kódu udělat 64-bitovej, tak to co změníš v abstraktnim kódu je oproti tomu Assemblerovskýmu velikej rozdíl. Většinou stačí jenom upravit pár funkcí, nejlépe jednu knihovnu a zkompilovat 64-bitovým kompilerem, kdežto v Assembleru je to většinou přepsat hafo kódu.
A co se týče toho jestli se C hodí víc na tvorbu OS než Pascal, tak si myslim, že je to jedno... Mezi Pascalem a C je tak málo odlišností oproti těm velkým podobnostem (procedurální programování, objekty, strukturovanej jazyk, téměř stejná úroveň...), že neni nutný se tim moc zabývat. Mě osobně vyhovuje víc Pascal. Spíš je tady problém absence kompileru na Pascal, protože Turbo Pascal je už trochu out a ten opravdu neni na tvorbu OS psanej... Ale Pascal jako jazyk je "stejnej" jako C jako jazyk, stejně jako Object Pascal jako C++, viz třeba Delphi 7.

 

 

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