Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Delphi
Přetěžování operátorů ve Free Pascalu - 2. část
14. ledna 2002, 00.00 | Dnes dokončíme rozdělaný příklad unity pro práci se zlomky a tím také skončíme s celým tématem přetěžování operátorů v seriálu Free Pascal.
V předchozím dílu jsme se rozhodli vysvětlit si přetěžování operátorů na příkladu knihovny pro práci se zlomky. Prošli jsme teorii přetěžování a nakonec jsme si ujasnili, které operátory a jak potřebujeme přetížit. Pro připomenutí znovu zopakuji seznam z minulého dílu:
- TZlomek := Integer
- TZlomek <aritmetický_operátor> TZlomek
- TZlomek <relační_operátor> TZlomek
Tak, jdeme na to.
PřiřazeníRaději než zdlouhavě vysvětlovat syntaxi a všechny pravidla, ukážeme si vše přímo na zdrojovém kódu. Začneme s přetěžováním operátoru přiřazení:
|
Je celkem vidět, že syntaxe přetíženého operátoru je velmi podobná psaní funkce. V podstatě pouze místo klíčového slova function použijeme operator a místo názvu funkce zapíšeme operátor, který chceme přetížit. V případě přiřazovacího operátoru je parametrem výraz napravo od operátoru a výsledkem pak tentýž výraz zkonvertovaný do potřebného typu. Všimněte si, že výsledek musí být pojmenován (zde "O"), protože nemáme žádný název funkce a potřebujeme nějak pojmenovat místo, kam ukládáme výslednou hodnotu. Poznamenejme ještě, že stejně jako ve volání funkcí je v definici přetíženého operátoru povoleno používat proměnnou Result se stejným účelem, jako u funkce, tj. jako místo, kde je uložená momentální návratová hodnota.
Aritmetické operátoryAritmetické operátory mají narozdíl od přiřazovacího dva parametry (aby taky ne - jsou binární) a samozřejmě výsledek; v naší implementaci vše bude typu TZlomek:
|
Doufám, že z kódu je vše celkem dobře vidět; jak se počítá se zlomky snad nikomu připomínat nemusím. Ve všech definicích po provedené operaci výsledný zlomek upravíme do základního tvaru. Čistě teoreticky bychom to dělat nemuseli, funkce by počítaly stejně dobře i bez této úpravy, ale při velmi dlouhých výpočtech by se mohlo stát, že by došlo k přetečení. To se teď může stát sice také, ale je to méně pravděpodobné (resp. dojde k tomu ve většině případů podstatně později).
Někdo by se možná zeptal, jak je to s unárním mínusem. Odpověď zní, že tento operátor ve Free Pascalu přetížit nejde. Podivné bylo, že když jsem zkoušel nahradit v kódu výrazy typu 0 - Z nebo (-1) * Z, doufaje přitom že 0 a -1 se automaticky zkonvertují na typ TZlomek, program se sice zkompiloval, ale nefungoval správě (vypsal Run-time error případně úplně zatuhl). Na některých věcech budou muset vývojáři Free Pascalu ještě trochu zapracovat.
Relační operátoryRelační operátory se liší od aritmetických jen tím, že "návratová hodnota" (psáno v uvozovkách, protože nejsme u funkcí) musí být typu Boolean. Uvedu zde jen definice operátoů = a <, ostatní si již určitě dokážete domyslet sami:
|
Někoho by možná napadlo, že u operátoru = stačí porovnávat pouze čitatele, protože všechny zatím definované funkce a operátory se zlomky vždy po provedení příslušné operace zlomek převedly do základního tvaru, takže stejné zlomky nemůžou mít různého jmenovatele. To je sice pravda, ale nikdo neříká, že uživatel (tj. programátor využívající naší unitu) nebude zasahovat do prvků struktury TZlomek přímo a pokud tak učiní, může do ní bezpochyby zapsat i zlomek, který v základním tvaru není. S tímto případem je tedy také nutné počítat a všechny funkce psát obecně pro zlomky v jakémkoliv tvaru.
Knihovna + kalkulačkaNyní máme unitu pro počítání se zlomky v postatě
hotovou. Stačí jen všechny kousky kódu sepsat pod sebe a přidat
sekci interface. Výsledkem je soubor zlomky.pp
. Aby bylo trochu jasné i použití,
vytvořil jsem i jednoduchou kalkulačku pro počítání se
zlomky. Je opravdu jednoduchá - načte dva zlomky z klávesnice
a provede s nimi všechny možné aritmetické operace a porovnání
s tím, že vše samozřejmě vypíše na obrazovku. Zdrojový kód
je v souboru kalkulacka.pp
. Uvedené soubory spolu se zkompilovanou verzí pro případ,
že nemáte Free Pascal, si můžete stáhnout zde.
Tímto s přetěžováním operátorů skončíme. Věřím, že pokud někdy budete ve Free Pascalu programovat nějaký větší projekt, určitě na potřebu této vlastnosti narazíte - a pak si jen vzpomeňte, že jste o tom na Builderu přece kdysi něco četli...
P.S.: Když jsem po dopsání článku celou hotovou unitu procházel, zjistil jsem, že jsem úplně zapomněl na ošetření případu dělení nulou. Případné dopsání této funkce budiž tedy ponecháno čtenáři za domácí úkol :-)
Obsah seriálu (více o seriálu):
- Rozšíření Free Pascalu
- Free Pascal Editor
- Ladění ve Free Pascalu poprvé
- Ladění ve Free Pascalu podruhé
- Ladění ve Free Pascalu pořetí a naposled
- Unita GetOpts poprvé
- Unita GetOpts podruhé
- Přetěžování operátorů ve Free Pascalu - 1. část
- Přetěžování operátorů ve Free Pascalu - 2. část
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007