• Nem Talált Eredményt

A Pascal unit

In document Számítástechnika I. (Pldal 154-166)

A szegmensek tËrgyalËsakor mËr emlÖtÒst tettãnk a unitrÛl, mint a Pascal kãlső szegmensÒről (5.4. pont). A unit a Pascal ÞnËllÛ szegmense, vagy mËs szÛval kãlső modulja, amely lefordÖtott (tËrgykÛdà) formËban egÒszÖt ki valamely programot. A unit lehetővÒ teszi nagymÒretű alkalmazËsok kÒszÖtÒsÒt PASCAL kÞrnyezetben. Alapvetően kÒtfÒle unit van: standard unit, ami a nyelv rÒszekÒnt előre definiËlva van, Òs a programozÛ Ëltal kÒszÖtett unit.

5.10.1 Standard unit

A standard unitok gyűjtemÒnye a feltelepÖtett fejlesztő rendszerben lefordÖtott vËltozatban a bgi kÞnyvtËrban rendelkezÒsre Ëll. A Turbo Pascal ezeket tpu (Turbo Pascal Unit) kiterjesztÒssel azonosÖtja. A standard unitok hasznËlatËhoz ismerni kell a benne lÒvő eljËrËsok Òs fãggvÒnyek neveit, feladatukat, valamint paramÒterezÒsãk mÛdjËt. Az utasÖtËslistËt a Pascal nem kÞzli.

Delphi fejlesztői kÞrnyezetben a standard unitok kiterjesztÒse dcu (Delphi Compiled Unit) Òs a lib kÞnyvtËrban talËljuk meg ezeket forrËskÛdjukkal (pas kiterjesztÒs) egyãtt. Ezek kÞzãl Ëlljon itt nÒhËny.

SysUtils amely a Consol Application alaprutinjait tartalmazza. Ez szãksÒges a Pascal szimulËciÛhoz Delphi kÞrnyezetben. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, stb a Delphi alap unitjai, amelyeket minden alkalmazËs indÖtËsakor felkÖnËl. Ezekkel rÒszletesen a SzË-mÖtËstechnika II. c. jegyzetben foglalkozunk.

5.10.2 Unitok definiËlËsa Òs hasznËlata

SzËmunkra most a sajËt unitunk kÒszÖtÒse fontos. Ehhez elsőkÒnt a unit szerke-zeti felÒpÖtÒsÒt kell megismerni. Amint a tÞbbi szegmens (fãggvÒny, eljËrËs) Òs

unit kulcsszÛ Òs a nÒv (szimbolikus nÒv) Ëll. Az interface kulcsszÛ utËn, de mÒg a fejrÒszben az abszolàt globËlis deklarËciÛk, Òs definÖciÛkat talËljuk. Az itt megadott mennyisÒgek nem csak jelen unitban, hanem mËs programokbÛl is elÒrhetők, amelyek ezt a unitot hasznËljËk. A unit tÞrzsben az implementation kulcsszÛ utËn, de a begin előtt a unit lokËlis mennyisÒgeket adjuk meg. Ezek csak jelen unit belsejÒben ÒrvÒnyesek. A begin Òs az ezt kÞvető utasÖtËsok nem kÞtelezőek. Az itt megÖrt programrÒszek a unit meghÖvËsakor azonnal vÒgrehaj-tËsra kerãlnek, s főkÒnt a unit vËltozÛinak inicializËlËsËra hasznËlatosak. A unit ÞnmagËban nem futtathatÛ, kiprÛbËlËsËra segÒdprogramot kÒszÖtãnk. A unit lÒtrehozËsËnak lÒpÒsei Delphi kÞrnyezetben:

– Delphi: File/New/Unit kivËlasztËs – EditËlËs (a unit megÖrËsa)

– MentÒs lemezre, azonos névvel mint a unit nÒv – FordÖtËs F9 (ellenőrizzãk a kÞnyvtËrat  nev.dcu) – File/New/Consol Application kivËlasztËsa

– A főprogram megÖrËsa – Uses unit nev beillesztÒse – Főprogram futtatËsa.

72. ábra: A unit szerkezete

Első pÒldËnkban kÒszÖtãnk small nÒven unitot, amelynek eljËrËsa egy stringet kisbetűsre konvertËl. Unitunk fejrÒsze az alËbbi lesz.

TÞrzsÒbe az alËbbiakat Örjuk.

Most elmentjãk small.pas nÒven, Òs lefordÖtjuk a unitot. Ellenőrizzãk, hogy kÞnyvtËrunkban megjelent a small.dcu file. Jelen fËzisban csak szintaktikai el-lenőrzÒs tÞrtÒnik. Ezek utËn Örjunk programot, amely kÒt kãlÞnbÞző idÒzetre alkalmazza a megÖrt, Òs unitban elhelyezett eljËrËst. A program utasÖtËslistËja a kÞvetkező.

// Unit alkalmazËsa // VÖg Jenő 2009.04.23.

program convert;

uses small in ’small.pas’; // A unit alkalmazËsa

var msg : t_str; // A unit abszolàt globËlis tÖpusËnak hasz//nËlata

begin

str := 'Ali BABA'; // Abszolàt globËlis str vËltozÛ hasznËlata

lower (str); // A unitban megÖrt eljËrËs hÖvËsa

writeln (str); //  ali baba

msg := 'LeiLA'; // A program globËlis msg vËltozÛjËnak

//hasznËlata lower(msg);

Programunk futËsi kÒpe az alËbbi.

73. ábra: A unitot használó példaprogram képernyőképe 5.10.3 A vËltozÛk, modulok hatËskÞre

Mielőtt mËsodik mintapÒldËnkra rËtÒrnÒnk ismertetjãk, hogy a unitokat is hasz-nËlÛ elemek mikÒnt hasznËlhatÛk fel. MËsszÛval a lËthatÛsËgukat (visibility) vizsgËljuk. Ezt leginkËbb egy olyan struktàrËn szemlÒltethetjãk, amely kÒt uni-tot is alkalmaz. KÒsőbbi Delphi alkalmazËsainknËl ez gyakori eset lesz.

74. ábra: Az egyes program elemek érvényessége

A legelső, first nevű unitunkban deklarËlt x vËltozÛ mindenãtt lËthatÛ, mÖg y csak a first belsejÒben. A mËsodik, subunit z vËltozÛja a first-ben nem, mËshol lËthatÛ. A prg program w vËltozÛja csak sajËt tÞrzsÒben lËthatÛ. Az elmondot-tak a konstansokra, eljËrËsokra Òs fãggvÒnyekre is ÒrvÒnyesek.

Ezek utËn kÒszÖtsãnk programot, amely szÞgek ËtvËltËsËt (Descartes/PolËr Òs PolËr/Descartes) valÛsÖtja meg. A konvertËlÛ eljËrËsokat unitban helyezzãk el.

CÒlszerű megtervezni programunk szerkezeti felÒpÖtÒsÒt. Ezt az alËbbi Ëbra szemlÒlteti.

75. ábra: A unitok és a program terve Első unitunk utasÖtËs listËja a kÞvetkező.

// Unit_dp_pd

// Vas ÁdËm 2008.11.01.

unit pd_dp;

var x,y,r,fi: single;

procedure print(a,b : single; pddp : boolean); // kiÖratËs interface

procedure print; // Itt nem kell a paramÒter listËt ismÒtelni begin

if pddp then writeln ('x = ', a:8:3,' y = ',b:8:3); // Descartes alak else writeln ('r = ',a:8:3, ' fi = ',b:8:3); // Polar alak end;

end.

Mentsãk (pd_dp.pa), Òs fordÖtsuk le (pd_dp.dcu) unitunkat. MËsodik, konvertË-lÛ unitunk utasÖtËs listËja a kÞvetkező lesz.

// Unit_conv

// Vas ÁdËm 2008.11.01.

unit conv;

interface

uses pd_dp; // Fő Unit

procedure pol_desc(var a,b : single); // PolËr-Descartes procedure desc_pol(var a,b : single); // Descartes-PolËr

implementation

IsmÒt mentÒs (conv.pas)Òs fordÖtËs (conv.dcu)kÞvetkezik, ezutËn a program.

// Unit_prÛba

// Vas ÁdËm 2008.11.01.

program pd_test;

uses pd_dp, conv; // A unitok alkalmazËsa var ch : char; // Program globËlis vËltozÛk a,b : single;

begin repeat

write('Polar-Descartes(P) vagy Descartes-Polar(D) konvertËlËs? ');

readln(ch);

ch:=upcase(ch); // VËlasz nagybetűsre vËltËsa

until ch in [‘P’,’D’]; // Csak P vagy D lehet

write ('r = '); readln(r); // abszolut ÒrtÒk bekÒrÒse write ('fi = '); readln(fi); // szÞg bekÒrÒse fokban

fi := fi*pi / 180; // fokbÛl radiËn

pol_desc (r,fi); // eljËrËs hÖvËsa r Òs fi paramÒterekkel print (r,fi, true); // eredmÒny kiÖrËsa Descartes alakban end

else begin

write (‘x = '); readln (a); // x koordinËta bekÒrÒse a globËlis //vËltozÛba write (‘y = '); readln (b); // y koordinËta bekÒrÒse b globËlis //vËltozÛba desc_pol (a,b); // eljËrËs hÖvËsa a Òs b paramÒterekkel print (a,b, false); // eredmÒny kiÖrËsa PolËr alakban end;

readln;

end.

Programunk futËsi kÒpe mindkÒt esetre az alËbbiakban lËthatÛ.

76. ábra: A Descartes<->polár konvertáló program képernyőképe

Gyakorló feladat

F01. KÒszÖtsãnk unitot, amelyben a tax nevű fãggvÒny egy ËrukÒszlet eladË-sa utËn fizetendő ÁFA Þsszeget (25%) szËmÖtja. A program kÒt kãlÞn-bÞző Ëru kÒszletet olvas be 2 rekord tÖpusà file-bÛl, majd a unit fãggvÒ-nyÒt aktivizËlja, Òs kÒpernyőre Örja a fizetendő ÁFA Þsszegeket.

Ellenőrző kérdések

K01. Mik a unit fő rÒszei?

K02. Mit Òrtãnk abszolàt globËlis vËltozÛ alatt ? 5.11 Külső modulok (DLL)

A unit a szegmentËciÛ egyik eszkÞze. Ez a kãlső szegmens Pascal kÞrnyezet-ben, Pascal nyelven kÒszãl. HasznËlata Pascal, vagy Delphi alkalmazËsokban lehetsÒges. SzËmos alkalmazËs megkÖvËnhatja, hogy olyan kãlső modulokat is hasznËljunk, amelyek nem Pascal nyelven ÖrÛdtak. Erre is van lehetősÒg, ha ezek a modulok DLL (Dinamic Link Library) formËban Ëllnak rendelkezÒsre.

EzeknÒl a moduloknËl – mivel bËrmilyen programnyelvű alkalmazËsba beil-leszthetők – mËr nem ismerjãk a forrËsnyelvű alakot, de erre nincs is szãksÒg.

EzÒrt nevezzãk ezeket dinamikusan becsatolhatÛ moduloknak. HasznËlatukhoz ismernãnk kell a benne lÒvő eljËrËsok hÖvËsi alakjËt Òs paramÒtereit. A DLL a Microsoft fejlesztÒse, hasznËlata Windows Òs OS/2 operËciÛs rendszerek alatt lehetsÒges.

5.11.1 DLL lÒtrehozËsa

Az univerzËlisan felhasznËlhatÛ DLL modult Pascal nyelven is kÒszÖthetãnk.

Ennek mÛdjËt mutatjuk be.

A Delphi kÞrnyezetben a File/New/DLL Wizard kivËlasztËsa utËn a fejlesztő az alËbbi ablakot nyitja meg.

77. ábra: A Delphi DLL projekt ablaka

A DLL modul szerkesztÒsi neve library lesz. Ez az elnevezÒs arra utal, hogy a nyilvËnos kÞnyvtËr rÒsze kÒszãl. A fejrÒsz itt is a deklarËciÛkat tartalmazza.

KÒszÖtsãnk DLL kÞnyvtËri modult, amely 2 egÒszszËm legnagyobb kÞzÞs osz-tÛjËt, Òs legkisebb kÞzÞs tÞbbszÞrÞsÒt szËmÖtÛ fãggvÒnyeket tartalmazza. Az utasÖtËslista a kÞvetkező lesz.

// DLL modul // Kő PËl 2010.05.22.

library dll_mat;

uses SysUtils, Math, Classes; // Standard unitok hasznËlata

{$R *.res} // FordÖtÛ direktÖva

// KÒt szËm legnagyobb kÞzÞs osztÛja function lko( a,b: integer): integer; stdcall;

var n: integer;

begin

n := min (a,b); // A kisebb szËmot adja

while (a mod n > 0) or (b mod n > 0) do dec (n);

result := n; // VisszatÒrÒsi ÒrtÒk

end;

// KÒt szËm legkisebb kÞzÞs tÞbbszÞrÞse function lkt( a,b: integer): integer; stdcall;

var n: integer;

begin

n := max (a,b); // A nagyobb szËmot adja

while (n mod a > 0) or (n mod b > 0) do inc (n);

result := n;

end;

exports lko, lkt; // ExportËlandÛ fãggvÒnyek

end.

Mentsãk el programunkat, majd a Compile/ Build funkciÛ kivËlasztËsËval hoz-zuk lÒtre Òs ellenőrizzãk le a dll_mat.dll kÞnyvtËri modult. EzutËn mËr megÖr-hatjuk programunkat, amely felhasznËlja az elkÒszÖtett modult.

// DLL modul // Kő PËl 2010.05.22.

program dll_alk;

function lko (a,b: integer):integer; stdcall; external 'dll_mat.dll';

function lkt (a,b: integer):integer; stdcall; external 'dll_mat.dll';

var x,y: integer;

begin

writeln (’x = ’); readln (x); // Egyik szËm bekÒrÒse writeln (’y = ’); readln (y); // Egyik szËm bekÒrÒse writeln (’Legnagyobb kÞzÞs osztÛ : ’, lko (x,y) );

writeln (’Legkisebb kÞzÞs tÞbbszÞrÞs : ’, lkt (x,y) );

readln;

end.

LËthatjuk, hogy csak nÒhËny kulcsszÛ szãksÒges a kãlső modulban lÒvő, mËr lefordÖtott fãggvÒny hasznËlatËhoz. A fordÖtÛnak ismernie kell a DLL modul elÒrÒsi àtvonalËt is, ha az nem az aktuËlis kÞnyvtËrban van. Programunk futËsi kÒpe az alËbbi.

78. ábra: A DLL-t használó példaprogram képernyőképe Gyakorló feladat

F01. KÒszÖtsãnk DLL kÞnyvtËri modult, amely kÒt komplex szËm ÞsszegÒt, kãlÞnbsÒgÒt Òs szorzatËt szËmÖtja. Írjunk programot, amely aktivizËlja a megÖrt eljËrËsokat.

Ellenőrző kérdések

K01. Mi a DLL hasznËlatËnak előnye?

K02. Milyen kulcsszÛ hasznËlatos a DLL rutinok kÒszÖtÒsekor?

K03. Hogyan hivatkozunk a programban a kãlső (DLL) rutinokra.

Jelen fejezet cÒlja, hogy kidolgozott pÒldËkkal segÖtsãk a tananyag megÒrtÒsÒt.

Az előadËsokon bemutatott anyagrÒszeket a hallgatÛk a laborban szËmÖtÛgÒpen gyakorolhatjËk Sok Òves tapasztalatunk szerint a rendelkezÒsre ËllÛ idő (heti egy alkalommal) nem elegendő az ÞnËllÛ feladatmegoldÛ kÒpessÒg kialakÖtËsË-hoz. KãlÞnÞsen azok szËmËra okoz nehÒzsÒget a tantËrgy kÞvetelmÒnyeinek teljesÖtÒse, akik előtanulmËnyaik sorËn nem talËlkoztak program nyelvekkel.

PÒldatËrunk szerkezeti felÒpÖtÒse igazodik az elmÒletet tËrgyalÛ fejezetek struk-tàrËjËhoz.

In document Számítástechnika I. (Pldal 154-166)