Přetěžování operátorů ve Free Pascalu - 2. část - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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í:

operator := (I: Integer) O: TZlomek;
begin
  O.C := I;
  O.J := 1;
end;

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átory

Aritmetické 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:

operator + (Z1, Z2: TZlomek) O: TZlomek;
begin
  O.C := Z1.C * Z2.J + Z2.C * Z1.J;
  O.J := Z1.J * Z2.J;
  Zkrat(O);
end;

operator - (Z1, Z2: TZlomek) O: TZlomek;
begin
  O.C := Z1.C * Z2.J - Z2.C * Z1.J;
  O.J := Z1.J * Z2.J;
  Zkrat(O);
end;

operator * (Z1, Z2: TZlomek) O: TZlomek;
begin
  O.C := Z1.C * Z2.C;
  O.J := Z1.J * Z2.J;
  Zkrat(O);
end;

operator / (Z1, Z2: TZlomek) O: TZlomek;
begin
  O.C := Z1.C * Z2.J;
  O.J := Z1.J * Z2.C;
  Zkrat(O);
end;

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átory

Relač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:

operator = (Z1, Z2: TZlomek) O: Boolean;
begin
  O := Z1.C * Z2.J = Z2.C * Z1.J;
end;

operator < (Z1, Z2: TZlomek) O: Boolean;
begin
  O := Z1.C * Z2.J < Z2.C * Z1.J;
end;

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čka

Nyní 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.

Závěr

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):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: