V minulém dílu jsme také mimo jiné rozebírali rozdíl mezi kódem projektu generovaném Eclipse a GPS. Zkusíme tedy změnit původně generovaný kód tak, jak by vypadal v GPS:
with Ada.Text_IO; use Ada.Text_IO; --1 procedure main is --2 begin --3 Put_Line ("Hello World - Ada!"); --4 end main; --5
Po uložení změn se provede automatické sestavení, ale překlad nikoliv. Pokud tedy zkusíme spustit novou verzi aplikace pomocí prostřední ikony ve třetí sekci zleva (bílá šipka v zeleném kroužku Run main.adb), objeví se formulář, který je vidět na prvním obrázku první galerie. Pokud necháme nastavení beze změny a stiskneme tlačítko Run, dole v konzoli se sice objeví výsledek, ale pořád ještě z původního kódu – viz další obrázek. Spustíme proto příkaz hlavního menu Project → Rebuild Current Project, který proběhne bez problémů. Pokud znovu spustíme ikonu Run main.adb a z následného formuláře tlačítko Run, dostaneme již nový výsledek – viz třetí obrázek první galerie.
Nyní se blíže podíváme na to, co nám vytvoření nového projektu „provedlo“ v pracovním adresáři Eclipse (workspace). Když si otevřeme příslušný adresář, zjistíme, že je v něm kromě jiného nový podadresář s názvem hello1 a v něm dva další podadresáře obj a src a soubor hello1.gpr. Soubor zatím necháme stranou a podíváme se na obsah uvedených adresářů. V ../obj je celkem 7 souborů Z toho tři jsou nám již známé – main.ali, main.o a spustitelný soubor main. Dále jsou zde další 4 soubory s názvem b~main a příponami .adb, .ads. ali a .o. Kdo chce, může si prohlédnout jejich obsah, ale v rámci článku se jím zabývat nebudeme. Obsah všech uvedených adresářů je na čtvrtém obrázku v první galerii.
Abychom mohli alespoň trochu srovnat výsledky generování nového projektu v GPS a GNATbench, zkusíme vytvořit novou verzi našeho posledního projektu na výpočet kořenů kvadratické rovnice. Než se ale pustíme do práce, ukážeme si úpravu vývojového prostředí tak, abychom měli k dispozici i novější verzi nástrojů jazyka Ada. Otevřeme tedy menu Window → Preferences → Ada → Toolchains a otevře se před námi formulář velmi podobný tomu, který jsme viděli při zakládání nového projektu. Tam jsme zkoušeli funkci Scan, která ale nebyla funkční. Nyní použijeme další dostupnou funkci – Add. Po jejím spuštění se otevře další formulář – viz pátý obrázek v první galerii. V něm je nutné vyplnit několik editačních polí. První pole s názvem Name obsahuje rozbalovací box s množstvím platforem, pro které je možné v jazyce Ada vyvíjet. Pro nás tam ale není nic zajímavého, takže prohlídku necháme pouze a jenom na případných zájemcích. My provedeme minimální nastavení nástrojů, které je vidět na dalším obrázku první galerie. Název je libovolný, ale další tři položky Ada Compiler, GNAT List a GNAT Driver se musí odkazovat na konkrétní aplikace s konkrétním umístěním. Pokud jsme provedli nastavení správně, po stisku tlačítka OK se objeví předchozí formulář, kde jsou ale k dispozici již dvě sady nástrojů – viz sedmý obrázek první galerie. Jak je z obrázku patrné, objevil se zde námi zadaný název (sloupec Name), umístění nástrojů (Location, vychází z námi zadaného adresáře s příslušnými aplikacemi) a verze (Version, opět automaticky načtená z příslušných adresářů). Jasně zde vidíme, že nová sada obsahuje nejnovější verzi Ada nástrojů, které jsme instalovali v minulých dílech. Nové nastavení uložíme pomocí tlačítek Apply a OK.
Nyní už se můžeme pustit do vytvoření nového projektu, jak jsme avizovali výše v textu. Spustíme tedy funkci New Ada Project a nazveme projekt starým názvem Kvadrov. Hlavní jednotku necháme přednastavenou, ale hlavní podprogram nastavíme jinak a necháme vygenerovat příslušný soubor solve – viz první obrázek druhé galerie. Nastavení adresářů neměníme, ale parametry sestavení už ano. Použijeme verzi Ada 2012 a nově vytvořenou sadu nástrojů GNAT 2014 (je možné použít i více sad současně, ale my použijeme pouze jednu) – viz další obrázek ve druhé galerii. Po nastavení parametrů projektu a zahájení jeho generace se ale bohužel objeví chybové hlášení a projekt nelze založit – viz třetí obrázek ve druhé galerii (nedojde k vytvoření adresáře ../src a v něm očekávaného souboru solve.adb). Přerušíme tedy vytváření projektu a začneme znovu. Vše bude stejné, jenom na posledním formuláři nastavíme použití verze Ada 2012 a ponecháme nastavenou sadu nástrojů native 4.8.2. Pak proběhne založení projektu bez problémů a objeví se v přehledu projektů včetně potřebné adresářové struktury.
Bylo by ale škoda nevyužít možností nejnovější sady nástrojů GNAT a proto se pokusíme provést změnu následně. Jak vidíme na čtvrtém obrázku druhé galerie, je součástí projektu Kvadrov také Ada Runtime verze GNAT 4.8.2. Otevřeme menu Project → Properties → GNATbench Properties a změníme sadu nástrojů – viz další obrázek ve druhé galerii. Změnu uložíme tlačítky Apply a OK a pravým tlačítkem myši otevřeme kontextové menu projektu a vybereme položku Refresh (v nápovědě je i možnost stisku tlačítka F5). Změna se okamžitě projeví a je viditelná na předposledním obrázku druhé galerie. Nyní se znovu vrátíme k příkladu, který pouze implementujeme v novém prostředí. Nejde ani tak o samotný příklad, ale o jeho uspořádání. Jedná se o to, že jako hlavní podprogram v projektu není možné použít balíček, který je součástí dvojice specifikace/implementace. Vždy je nutné mít nějaký soubor, který je deklarován jako procedura a určen za hlavní podprogram projektu a teprve z něj je možné volat další balíčky a procedury už bez ohledu na jejich formát.
Pokud si otevřeme nově vytvořenou proceduru solve.adb, má velmi jednoduchý obsah:
procedure solve is begin null; + nápověda end solve;
Ještě než začneme tento a další soubor upravovat, vytvoříme si další dva potřebné soubory – kvadrov.ads a kvadrov.adb. K tomu potřebujeme dva kroky – ve struktuře projektu vybrat adresář src a použít prostřední ikonu ve druhé sekci zleva – New Ada Source File. Pak stačí pouze zadat název obou souborů včetně přípon a vytvořit je. Jako první otevřeme soubor kvadrov.ads a vložíme do něj již známý kód:
package kvadrov is procedure Quadra (A, B, C : in Float; R1, R2, I1, I2 : out Float; Result : out Character); end kvadrov;
Při psaní kódu si můžeme všimnout, že Eclipse označuje klíčová slova, ale nenapovídá jejich názvy a neumožňuje vybrat jejich doplňování. Po vložení kódu soubor uložíme a pokračujeme tělem balíčku kvadrov.adb:
with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions; package body kvadrov is procedure Quadra (A, B, C : in Float; R1, R2, I1, I2 : out Float; Result : out Character) is D, Z : Float; chyba : exception; begin if A = 0.0 then raise chyba; end if; D := B**2 - 4.0 * A * C; Z := 2.0 * A; if D < 0.0 then Result := 'K'; R1 := -B / Z; R2 := R1; I1 := Sqrt (-D) / Z; I2 := -Sqrt (-D) / Z; elsif D = 0.0 then Result := 'D'; R1 := -B / Z; R2 := R1; I1 := 0.0; I2 := I1; else Result := 'R'; R1 := (-B + Sqrt (D)) / Z; R2 := (-B - Sqrt (D)) / Z; I1 := 0.0; I2 := I1; end if; exception when chyba => Result := 'E'; return; end Quadra; begin null; end kvadrov;
Při psaní je možné si opět všimnout dvou věcí: Eclipse krásně odsazuje úseky kódy a psaní je pak jednodušší a rychlejší. Na rozdíl od GPS ale nenapovídá ani při psaní „tečkových“ notací, a to je docela zásadní problém. Soubor opět uložíme a vrátíme se k souboru solve.adb, který upravíme následovně:
with Ada.Text_IO; with Ada.Float_Text_IO; with Ada.Integer_Text_IO; with kvadrov; procedure solve is package TIO renames Ada.Text_IO; package FIO renames Ada.Float_Text_IO; package DIO is new Ada.Text_IO.Float_IO(Float); package IIO renames Ada.Integer_Text_IO; r1,r2,i1,i2 :Float; vysledek : Character; int : Integer := 10; begin kvadrov.Quadra(1.0,3.0,1.0,r1,r2,i1,i2,vysledek); if vysledek = 'E' then TIO.Put_Line(" Vypocet prerusen z duvodu spatneho zadani koeficientu!"); return; end if; TIO.Put_Line("Vysledky reseni: " & vysledek); TIO.Put("K1 = " ); FIO.Put(Item => r1, Fore => 3, Aft => 6, Exp => 0); TIO.Put(" "); FIO.Put(Item => i1, Fore => 3, Aft => 6, Exp => 0); TIO.Put(" i"); TIO.New_Line; TIO.Put("K2 = " ); DIO.Put(Item => r2, Fore => 3, Aft => 6, Exp => 0); TIO.Put(" "); DIO.Put(Item => i2, Fore => 3, Aft => 6, Exp => 0); TIO.Put(" i"); TIO.New_Line; TIO.Put("INT-B10 = "); IIO.Put(Item => Int, Width => 3, Base => 10); TIO.New_Line; TIO.Put("INT-B2 = "); IIO.Put(Item => Int, Width => 8, Base => 2); TIO.New_Line; TIO.Put("INT-B8 = "); IIO.Put(Item => Int, Width => 8, Base => 8); TIO.New_Line; TIO.Put("INT-B16 = "); IIO.Put(Item => Int, Width => 8, Base => 16); end solve;
Jenom krátce k psaní kódu: při odkazu na proceduru Kvadrov.Quadra se nápověda objeví a s ní i přehled procedur v daném balíčku obsažených. Po uložení kódu je nutné spustit nové přeložení příkazem Project → Rebuild Current Project. Pokud jsou v kódu nějaké chyby, tak se objeví ve spodní části Problems. Pokud je vše v pořádku, můžeme aplikaci spustit a v konzoli vidíme, že to bylo úspěšné – viz poslední obrázek ve druhé galerii
Kompletní kód výše uvedených procedur a balíčků je v přílohách solve.adb, kvadrov.adb a kvadrov.ads.
Výše v textu jsme si popsali, jak nastavit novější sadu nástrojů v Eclipse. Jisté je, že to nebylo úplně jednoduché a přímočaré. Zkusíme to tedy obdobným způsobem u GPS a uvidíme, jaký bude výsledek. Spustíme tedy GPS včetně nějakého projektu, konkrétně Regres (jedná se o projekt, který byl vytvořen v rámci výukového kurzu a v článcích se o něm jinak nepíše. Není to ale podstatné, postup je stejný pro libovolný projekt GPS!). Použijeme ikonu v přehledu struktury projektu – Open the project properties editor a otevřeme okno s nastavením projektu. Přejdeme na záložku Languages a uvidíme stav, který ukazuje první obrázek ve třetí galerii. Jak je z obrázku patrné, je situace stejná, jako ve standardním nastavení Eclipse+GNATbench. Je to asi logické, že je to opět verze 4.8.2 pocházející z GCC-GNAT. K dispozici jsou dvě ovládací tlačítka – Scan a + Add. Vyzkoušíme to první a výsledek se nebude moc odlišovat od původního stavu – viz druhý obrázek třetí galerie. Na tomto obrázku je okno zvětšené, takže je v dolní části vidět oddíl Details → Tools a Compilers, kde jsou základní systémové nástroje pro práci s projekty GPS Ada. Nápověda nám přímo vnucuje použití tlačítka pro přidání další sady nástrojů, takže toho zkusíme využít. Klikneme tedy na tlačítko + Add a otevře se další okno New toolchain, do kterého doplníme název sady tak, jak jsme to dělali u Eclipse. Okno je vidět na třetím obrázku galerie. Po zadání názvu se na dalším obrázku objeví dvě sady nástrojů. Na tomto obrázku si povšimněte červených popisů u jednotlivých nástrojů a hlavně toho v prvním řádku – GNAT Driver. Z obrázku jsou patrné dvě věci:
- položku nelze následně uživatelsky změnit či nastavit
- název položky se nastaví automaticky podle vzoru ZadanyNazev-gnat
Pátý obrázek třetí galerie ukazuje zásadní problém, který tím vzniká – žádný soubor tohoto názvu není k dispozici v systémové cestě. On ani vlastně být nemůže, protože žádný takový soubor neexistuje! Jediné, co máme k dispozici, je systémová proměnná, která ukazuje do adresáře /usr/gnat/2014/bin a zde je soubor s názvem gnat. Poslední tři obrázky ve třetí galerii ukazují několik marných pokusů. Zde jsem zkoušel různá zadání názvu s odkazy na příslušné adresáře, vytvoření odkazu na soubor gnat s příslušným názvem atd. Nebudu zde vše zbytečně popisovat, protože to vždy skončilo nějakým nezdarem – častými pády GPS, problémy s hlášením, že některé nástroje jsou definované dvakrát, odmítnutí překladu apod. To bylo docela nepříjemné překvapení a musel jsem se zamyslet nad tím, jak celou situaci řešit. Bylo samozřejmě možné používat Eclipse a GPS nechat stranou. Druhou možností bylo použití GPS jenom pro systémovou sadu nástrojů. Oboje mi ale přišlo nepříliš vhodné. GPS má totiž svoje neoddiskutovatelné výhody a určitě by bylo nepříjemné nemoci použít nejnovější verzi GNAT. Hledal jsem tedy nějaké rozumné a schůdné řešení. Zdá se (nemám to ale ověřeno), že ve verzi GNAT PRO jde položka GNAT Driver nastavit v GPS podobně, jako v Eclipse. Nakonec se podařilo uspokojivé řešení najít a popis nutných kroků k jeho realizaci si necháme na příští díl.
V dnešním dílu jsme se vývojovým prostředím Eclipse zabývali trochu podrobněji a zahájili práci na úpravě GPS na nejnovější sadu nástrojů GNAT. V příštím dílu si ukážeme, jak tuto úpravu provést a také si porovnáme obě popsaná vývojová prostředí. Zahájíme také popis nástroje pro vývoj aplikací s grafickým rozhraním GtkAda.