Lepší je používat explicitní přetypování, t.j.:
[code]
b:byte;
c:char;
i:integer;
b:=byte(c);
c:=char(b);
i:=integer(c); {Teoreticky lze, ale program pak může fungovat chybně, proto nepoužívat}
i:=byte(c); {Lze, neni problem
[/code]}
Zdar programátoři! Jestli vás zajímají pojmy z názvu tématu, tak si můžete přečíst moje povídání na INT21h.
Tam je ostatně i spousta jiných článků o pascalu, něco by vás mohlo zaujmout.
http://www.int21h.ic.cz/?id=102
No, přeskokový seznam mi příjde složitý na naprogramování. Potíž je, že s každou modifikací toho hlavního seznamu bys musel synchronizovaně měnit i přeskoky. To už mi příjde schůdnější přidat do spojového seznamu odkazy na abecedně vyšší a abecedně nižší prvek.
Spíš bych ti ale radil se v první fázi na třídění spojového seznamu vykašlat, napsat první neoptimalizovanou verzi kompilátoru a eventuálně se k tomu vrátit až později, kdy budeš program optimalizovat na rychlost.
Můžeš třeba zjistit, že pro normální programy bude i zcela neoptimalizovaný překladač na dnešních průměrných počítačích rychlý zcela dostatečně.
Já bych se rozhodoval podle toho, jak často bys měnil prvky v seznamu - tedy jak často bys je přidával a ubíral.
1) Jestli je to tak, že na začátku programu vytvoříš spojový seznam a potom ho už neměníš a jenom z něho čteš, tak bych ho převedl na obyčejné setříděné pole.
2) Jestli ho intenzívně měníš, tak je nejlepší řešení binární strom. Na hashování bych se být tebou vybodnul - uvědom si, že MD5 hash má 16 bajtů, kdežto ty zas tak často nebudeš řešit případ, kdy by se odlišnost v řetězcích projevovala až na 17. znaku či dále. Pro porovnávání řetězců ani není nutné psát funkce pro převod na číslo; klidně můžeš napsat: if S1>S2 then ...
3) Jestli ho měníš jenom občas, tak můžeš buďto zase použít binární strom nebo se můžeš pokusit o tabulku odkazů uvnitř spojového seznamu. Struktura by potom vypadala takto:
polozka = record
nazev:string;
dalsi:^polozka;
vestsi,mensi:^polozka;
end;
Proč proboha XML ???
Ukládej to normálně do textového souboru třeba po řádkách
první řádka: znění otázky
druhá: číslo správné odpovědi
třetí-šestá: varianta odpovědi
sedmá: prázdný řádek
osmá: znění další otázky
...
Takovýhle soubor napíšeš v Notepadu, nebo v textovém editoru pascalu za pár minut a bezbolestně. Ještě je rozumné ještě před zněním prvním otázky uložit počet otázek v souboru - v programu to pak zjednoduší čtení z tohoto souboru.
Začni s tím, že si určíš, jakou použiješ datovou strukturu - tedy jakým způsobem budou v paměti uloženy testovací otázky a správné odpovědi. Z toho pak vyplyne všechno ostatní. Jedna možnost je toto:
type Totazka = record
zneni:string; {zneni otazky}
mozne_odpovedi:array[1..4] of string {predpokladame-li ctyri mozne varianty odpovedi}
spravna_odpoved:byte; {ktera z odpovedi 1..4 je ta spravna}
end;
...
var otazky:TOtazky;
To se týká pascalu jenom nepřímo. Spíše je to záležitost operačního systému, v našem případě DOSu. Znamená to, že vstup nebo výstup se nebude provádět na klávesnici a na obrazovce, ale do jiného zařízení či souboru. Příklad:
dir *.* > vystup.txt
seznam souborů se neobjeví na obrazovce, ale bude zapsán do souboru vystup.txt
V pascalu se dají tato přesměrování do jisté míry ovládat. Napiš ale, o co ti přesně jde.
Práci doporučuju začít prošmejděním Mircosoftových (ten člověk, co psal předchozí přízpěvek, ne M$ z Kalifornie) stránek a postahováním jeho jednotek na práci s grafikou,klávesnicí, časovačem atd. Nic lepšího neseženež, je to česky a se spoustou komentářů.
Převod z EXE zpět na C kód samozřejmě možný je. Předpokladem ale je, že program byl přeložen se zapnutou debuggovací informací. Použij příslušný debugger (Turbo debug, GDB,...)
I windowsí verze Freepascalu? To snad ne.
Uff, to je síla. Nevim, kolik by to stálo, já ti to ale dělat nebudu.
Pro inspiraci ohledně parseru se nicméně koukni do tohodle vlákna:
http://programujte.com/index.php?akce=diskuze&kam=vlakno&tema=9051-vyhodnocovani-matematickych-vyrazu-parser-
Já totiž chci do svýho GUI přidat označování textu. Text půjde označovat buďto tažením myši (to bude ta obtížnější část) nebo pomocí Shift+šipka. No, a já potřebuju, aby stejně jako v TP šla použít šipka normální i numerická.
Takže, jak na to?
Alespoň ve Freepascalu EXE do PAS převést jde, a to v případě, že překládáš se zapnutým Debuggining mode.
Jestli jsi to doopravdy překládal s tímhle nastavením, tak tohle EXE otevři v GDB a nech si vypsat zdroják programu. Musím tě ale varovat - GDB má příkazové ovládání (žádné IDE). Je možné, že nějaké IDE pro GDB existuje, ale já ho neznám.
Výpis stromových struktur do přehledného stromového formátu jsem nikdy nepotřeboval řešit, ale napsal jsem celý objekt pro práci se stromy. Ukládá se do binárního souboru, ne textového. Možná z toho přesto něco použitelného vytáhneš:
http://www.laaca.borec.cz/soubory/wokna32.rar - v archíve je soubor vaznik.pas a v něm je deklarovaný objekt TStrom, tak se na to když tak mrkni.
Dík, koukal jsem se na to, ale nakonec jsem to udělal jinak:
http://www.laaca.borec.cz/soubory/venom.rar
To Blujacker :
No jo, ale půvab není v tom, jak se to syntakticky zpracuje do programovacího jazyka, ale ten princip. Ty moje tři možnosti jsou použitelné i pro assembler. V Pythonu se to sice zapíše hezky elegantně jednoduše bez pomocné proměnné, ale vnitřně se to stejně provede pomocí ní.
Oba pojmy - tabulka virtuálních metod (VMT) i inherited souvisejí s dědičností objektů. Mircosoft se o dědičnosti bohužel moc nerozepisuje. Jestl nebudu mít moc silnou kocovinu. tak se v neděli pokusím napsat něco jako pokračování jeho manuálu.
Inherited můžu ale vysvětlit už teď. Když máš tuhle definici:
type
objekt1=object
Procedure PredstavSe;
end;
objekt2 = object(objekt1)
Procedure PredstavSe;
end;
objekt3 = object(objekt2)
Procedure PredstavSe;
Procedure PredstavSeJinak;
end;
Procedure Objekt1.PredstavSe;
begin
Writeln('Objekt1');
end;
Procedure Objekt2.PredstavSe;
begin
inherited PredstavSe;
Writeln('Objekt2');
end;
Procedure Objekt3.PredstavSe;
begin
inherited PredstavSe;
Writeln('Objekt3');
end;
Procedure Objekt3.PredstavSeJinak;
begin
Objekt2.PredstavSe;
Writeln('Objekt3');
end;
Aha, ty chceš, aby se to psalo jenom do jedinného řádku. Já jsem naopak myslel, že chceš, aby se to přelévalo z řádku na řádek. To je jenom drobná úprava - až se dostanu domů, tak to udělám.
1) porovnáš počet číslic. To, které jich má víc, je větší. Pokud jich mají stejně, tak přejdeš na bod 2
2) pomocí cyklu budeš procházet obě čísla po jednotlivných cifrách s převodem na velká písmena:
a:=UpCase(prvni[i]);
b:=UpCase(druhe[i]);
if a>b then prvni_je_vetsi else if b>a then druhe_je_vetsi else pokracuj_v_cyklu
Přihřeju si vlastní polívčičku:
vyčerpávající, srozumitelný, dobře napsaný a hlavně můj :-) návod na práci se soubory v pascalu je tady:
http://www.int21h.ic.cz/?id=85
Máš to špatně. Na kód za end. se překladač nikdy nedostane. Pascal tedy vidí jenom:
Program Vypis;
uses crt;
begin
textcolor(white);
clrscr;
readkey;
end.