unit etiketadun mezuak erakusten. Erakutsi mezu guztiak
unit etiketadun mezuak erakusten. Erakutsi mezu guztiak

2024(e)ko apirilaren 8(a), astelehena

35. Ariketa: unitateak (IV)

ZER DAKIDAN:
Unitate bat ezin daiteke exekutatu. Unitate batek bi zati ditu: INTERFACE zati publikoa eta IMPLEMENTATION zati pribatua. Pascal lengoaiak unitate desberdinak eskaintzen dizkio gure bezero-programari, adibidez crt unitatea (non clrscr prozedura garatuta dagoen).



ZER IKASIKO DUDAN:
Unitate batek eskaintzen duen azpiprogramaren izena, guk geuk, gure bezero-programan erabiltzen badugu zer gertatzen da? Konpilazio errorerik sortuko da? Konpilazio errorerik ez bada, bietarik zein azpiprograma exekutatuko da? Bezero-programan idatzitakoa ala unitatean lehendik garaturik zegoena?





crt UNITATEAREN clrscr PROZEDURA, ETA abs FUNTZIO ESTANDARRA

Dakigunez, crt unitateari esker clrscr prozedura erabil dezakegu. Badakigu ere abs funtzio estandarra lengoaiaren oinarrizko azpiprograma dela, eta funtzio hori aplikatzeko ez dela unitaterik deklaratu behar.




Ariketa__35_IV.pas BEZERO-PROGRAMA

Jarraian erakusten den programa birritan exekutatu. Lehenik iruzkina mantenduz (bezero-programaren clrscr prozedura eta abs funtzioa indargabeturik). Eta ondoren iruzkina kenduz (bezero-programaren clrscr prozedura eta abs funtzioa erabilgarri direlarik):  

{--------------------------------------------------------------
Programaren helburua: unitateetako azpiprogramak "estaltzen"
--------------------------------------------------------------}

program Ariketa__35_IV;
uses
crt;

(*
procedure clrscr;
begin
writeln;
writeln;
writeln;
writeln('KUKU!!!');
writeln;
end;

function abs(iOsoa: integer): integer;
begin
abs := 2*iOsoa;
end;
*)

{ ---------------------programa nagusia--------------------- }
var
iZbk: integer;
begin
writeln('Programaren hasierako mezua');
writeln('---------------------------');
write('RETURN tekla sakatu exekuzioarekin jarraitzeko... ');
readln;

clrscr;

writeln;
write('Zenbaki oso bat eman: ');
readln(iZbk);
writeln;
writeln('iZbk=', iZbk, 'abs(iZbk)=':20, abs(iZbk));

writeln;
writeln;
writeln;
writeln('Programaren bukaerako mezua');
writeln('---------------------------');
write('EDOZEIN tekla sakatu exekuzioa amaitzeko... ');
repeat until keypressed;
end.

Unitate batek eskaintzen duen azpiprogramaren izena, guk geuk, gure bezero-programan erabiltzen badugu zer gertatzen da? Adibidez, guk clrscr edo abs programatzen baditugu.

Galdera hauei erantzun:

  • Konpilazio errorerik sortuko da?
  • Konpilazio errorerik ez bada, bietarik zein azpiprograma exekutatuko da? Bezero-programan idatzitakoa ala unitatean garaturik zegoena?
Bezero-programan clrscr prozedura eta abs funtzioa iruzkinduta mantentzean, crt unitatearen clrscr prozedurak lan egingo du eta abs funtzio estandarrak lan egingo du (batek pantaila garbituko du, eta besteak sarrerako zenbakiaren positiboa itzuliko du)
 
Bezero-programan clrscr prozedura eta abs funtzioa indarrean jartzean, crt unitateko clrscr prozedura "estalirik" geratzen da eta abs funtzio estandarra ere "ordezkaturik" geratzen da. Ondorioz, batek mezu bat idatziko du eta besteak sarrerako zenbakiaren doblea itzuliko du
 

34. Ariketa: unitateak (III)

ZER DAKIDAN:
Karpeta batean kokaturik dagoen .PAS iturburu-programa batetik abiatuta .EXE programa exekutagarria lortzen ikasi dut. Bestalde, badakit ere unitate bat sortzen eta konpilatzen aurreko 32. Ariketa: unitateak (I) atalean ikasi dudalako. Bestalde, badakit aurrekonpilatutako unitate bat erabiltzen 33. Ariketa: unitateak (II) atalean ikasi dudalako. 



ZER IKASIKO DUDAN:
Aurrekonpilatutako Unitateak erabiltzen dakidanez, hori praktikatuko dut direktorio bateko fitxategien izenak array batean gordez.




diskoa izeneko unitatea

Programa bat idatziko dugu diskoa izeneko unitatea erabiliko duena, bezero-programa honi FitxategiakDirektorioan.pas deituko diogu, eta bere kodea programatuko duen programatzaileak unitatearen interfazea ezagutu behar du (INTERFACE blokea ezagutu behar du). Ikusi diskoa unitateak eskaitzen duen interfazea:

{---------------------------------------------------------------------------}
unit diskoa ;

INTERFACE
const KOPURUMAX = 200 ;

type tasFitxIzenak = array[1..KOPURUMAX] of string ;

procedure DirektorioarenEdukia(sZer: string) ;

procedure FitxategienIzenak( sZer: string ;
var asFitxIzenak: tasFitxIzenak ;
var liLuzera: longint) ;
{---------------------------------------------------------------------------}

Lau elementu hauek partekatzen ditu diskoa unitateak:

  • KOPURUMAX konstante bat
  • Kateen array bat eraezagutzen duen tasFitxIzenak datu-mota
  • Karpeta edo direktorio batean dauden fitxategien zerrenda pantailaratzen duen DirektorioarenEdukia prozedura. Datutzat prozedura honek karaktere-kate bat behar du, zer itxurako fitxategiak pantailaratu nahi diren adierazten duen karaktere-katea
  • Karpeta edo direktorio batean dauden fitxategien izenak array batera igarotzen dituen FitxategienIzenak prozedura, honek hiru parametro beharko ditu:
    1. sZer karaktere-katea, zer itxurako izenak gorde nahi diren adierazten duena 
    2. asFitxIzenak karaktere-kateen arraya, sZer aurreko moldearekin bat egiten duten fitxategien izenak gordeko dituen arraya
    3. liLuzera kopuru osoa, asFitxIzenak arrayaren luzera efektiboa

Dakigunez diskoa unitatea eta FitxategiakDirektorioan.pas bezero-programa karpeta jakin batean egongo dira, helburu den FitxategiakDirektorioan.exe bezero-programa exekutagarria lortze aldera. FitxategiakDirektorioan.exe bezero-programa egikaratzean bere karpetako fitxategiak arakatuko ditu. Beste karpeta batzuen fitxategiak eskuratzeko Chdir prozedura aplikatuko dugu.


FitxategiakDirektorioan.exe fitxategia lortzen

Ordenadorearen disko gogorreko edozein tokitan (mahaigainean adibidez) karpeta bat sortuko dugu, esate baterako IzenakHartu izeneko karpeta. IzenakHartu karpetan hiru fitxategi hauek kokatuko ditugu konpilazioa hasi aurretik:

  1. FitxategiakDirektorioan.pas iturburu-programa
  2. diskoa.ow unitatearen objektu-kodea
  3. diskoa.ppw unitate konpilatua


FitxategiakDirektorioan.pas bezero-programa konpilatu ondoren eta dena ondo badoa, IzenakHartu karpetan bost fitxategi hauek izango ditugu:

  1. FitxategiakDirektorioan.pas iturburu-programa
  2. diskoa.ow unitatearen objektu-kodea
  3. diskoa.ppw unitate konpilatua
  4. FitxategiakDirektorioan.ow iturburu-programaren objektu-programa
  5. FitxategiakDirektorioan.exe programa exekutagarria


FitxategiakDirektorioan.pas fitxategiak diskoa izeneko unitatea erabili behar du, horregatik derrigorrezkoak dira diskoa.ow eta diskoa.ppw fitxategi aurrekonpilatuak IzenakHartu karpetan.


FitxategiakDirektorioan.exe fitxategia exekutatzen

FitxategiakDirektorioan.exe fitxategia exekutatzean bera dagoen karpetako fitxategi guztien zerrenda agertuko du pantailan, horretarako sZer datuak molde hau '*' edukiko du. Ondoren, baldin eta Datuak direktorioa existitzen bada, Datuak karpetara mugitu eta 'A_*.DAT' betetzen dtuen fitxategien zerrenda agertuko du pantailan. Helburuko fitxategien izenak pantailan erakutsi ondoren, Datuak karpetako 'A_*.DAT' betetzen duten fitxategien izenak asFitxIzenak arrayan gordeko dira. Bukatzeko, asFitxIzenak arrayaren edukia erakutsiko da.




FitxategiakDirektorioan.pas iturburu-programa

FitxategiakDirektorioan.pas itrurburu-programa dela eta, ondoko hauetan arreta jarri:

  • DirektorioarenEdukia prozedura diskoa unitatean garaturik dago
  • FitxategienIzenak prozedura diskoa unitatean garaturik dago
  • DirectoryExists funtzio boolearra FileExists funtzio boolearraren antzekoa da (Pascal instalazio batzuetan ez dabil, horregatik iruzkinduta utzi dugu)
  • Uneko karpetaren eduki osoa adierazteko '*' moldea erabili behar da, fitxategi eta direktorio guztiek betetzen duten moldea da
  • Chdir uneko direktoriotik beste direktorio batera aldatzeko:
    • Uneko direktorioa '.' da
    • Uneko direktorioaren gurasoa '..' da
    • Uneko direktorioaren menpekoa den 'Datuak' karpetara joateko Chdir('Datuak') egin behar da
  • Uneko karpeta zein den ikusteko GetCurrentDir funtzioari dei egitea aski da (GetCurrentDir funtzioak karaktere-kate bat itzultzen du)
  • Uneko karpetaren eduki zati bat adierazteko 'A_*.DAT' moldea erabili da ('A_'-tik hasten den edozein fitxategi eta 'DAT' luzapena duena)

{
INTERFACE
const KOPURUMAX = 200;
type tasFitxIzenak = array[1..KOPURUMAX] of string;
procedure DirektorioarenEdukia(sZer: string);
procedure FitxategienIzenak( sZer: string;
var asFitxIzenak: tasFitxIzenak;
var liLuzera: longint);
}

program FitxategiakDirektorioBateanBilatzen ;

uses
sysutils, diskoa ;

procedure FitxategienIzenakIkusi(const asFitxIzenak: tasFitxIzenak; liLuzera: longint) ;
var
n: longint ;
begin
for n:=1 to liLuzera do
begin
writeln(n:5, '. fitxategia: ', asFitxIzenak[n]) ;
end ;
end ;

{------------------------------------------- Programa Nagusia -------------------}

var
sZer: string ;
asFitxIzenak: tasFitxIzenak ;
liLuzera: longint ;

begin
writeln ;
writeln ;
writeln('=============================================================================') ;
writeln('Uneko direktorioa: ', GetCurrentDir) ;
writeln('Uneko direktorioan ''Datuak'' izeneko karpeta sorturik dagoela ziurtatu!!!') ;
writeln('=============================================================================') ;
writeln ;
writeln ;

sZer := '*' ;
DirektorioarenEdukia(sZer) ;

//if DirectoryExists('Datuak') then
//begin
Chdir('Datuak') ;
sZer := 'A_*.DAT' ;
DirektorioarenEdukia(sZer) ;

writeln ;
writeln('Uneko direktorioa: ', GetCurrentDir) ;
writeln('''Datuak'' karpetatik ''A_*.DAT'' irizpideko fitxategiak arrayra') ;
writeln ;
FitxategienIzenak(sZer, asFitxIzenak, liLuzera) ;

writeln('Hauek dira ''Datuak'' karpetan dauden ''A_*.DAT'' irizpideko fitxategiak:') ;
writeln ;
FitxategienIzenakIkusi(asFitxIzenak, liLuzera) ;
//end
//else
// writeln('Ez da aurkitu ''Datuak'' karpeta (direktorioa)') ;

readln;
end. { PROGRAMAREN BUKAERA }

FitxategiakDirektorioan.exe programa exekutagarria egikaratzean, IzenakHartu\Datuak direktorioaren edukia hau bada:


Emaitza hau litzateke:


Non:

  1. IzenakHartu direktorioaren fitxategi guztien (datua'*' izan da) informazioa erakusten da pantailan. Orotara 5 fitxategi eta 3 direktorio, hauek:
    • . puntuak adierazten duen uneko direktorioa
    • .. puntuek adierazten duten uneko direktorioaren gainekoa
    • Uneko direktorioaren azpian dagoen Datuak direktorioa
  2. Datuak direktorioa unekoa izan dadila eta 'A_*.DAT' moldea betetzen duten fitxategien informazioa erakutsi, guztira 4 fitxategi dira adibidean
  3. Datuak uneko direktorioa delarik, 'A_*.DAT' moldea betetzen duten fitxategien izenak asFitxIzenak arrayan gorde eta arrayaren edukia pantailan erakutsi





    Windows:
Arik-34.zip   bere barnean IzenakHartu izeneko karpeta bat ondoko edukiarekin:
  • Programa-bezeroaren FitxategiakDirektorioan.pas iturburu-kodea
  • diskoa.ow unitatearen objektu-kodea
  • diskoa.ppw unitate konpilatua
  • Datuak karpeta (datu-fitxategi batzuekin) 
    Mac:

 

33. Ariketa: unitateak (II)

ZER DAKIDAN:
Karpeta batean kokaturik dagoen .PAS iturburu-programa batetik abiatuta .EXE programa exekutagarria lortzen ikasi dut. Bestalde, badakit ere unitate bat sortzen eta konpilatzen aurreko 32. Ariketa: unitateak (I) atalean ikasi dudalako. 



ZER IKASIKO DUDAN:
Aurrekonpilatutako Unitateak erabiltzen ikasiko dut, datu-fitxategi bat sortzen duen unitatea erabiltzen ikasiko dut hain zuzen ere.




Fitxategiak kokatzeko karpetak 

Unitateak direla eta, gaiaren nondik norako teorikoak Konpiladorea eta estekatzailea artikuluan biltzen dira eta oinarrizko adibide bat Unitateak artikuluan erakusten da, beste bi adibide aberatsago 10. astea | itsas-bataila (I) artikuluan eta 10. astea | itsas-bataila (II) artikuluan kontsulta daitezke.

Orain unitate bat erabiltzen ikasiko dugu, eta unitate horrek datu-fitxategiekin lan egingo duenez karpeten antolaketa egoki bat egitea premiazkoa da. Baina, prozesua osoa bi ataletan banatuko dugu:

  • Programa exekutagarria lortzeko behar diren fitxategiak eta hauek kokatzeko karpeta
  • Programa exekutagarria egikaritzeko (exekutatzeko) behar diren fitxategiak eta hauek kokatzeko karpeta

Gure iturburu-programa Bezeroa.pas bada, hura konpilatu eta Bezeroa.exe lortu nahi dugu.




unitatea izeneko unitatearen interfazea

Unitate honek, bi datu-mota eta bi prozedura partekatzen ditu bezero-programarekin. Horrez gain, integer datu-mota longint bihurtzen du unitate honek:

{---------------------------------------------------------------------------} 
INTERFACE

type
integer = longint ; (* INTEGER-entzat 4 byte erabili *)
tfrAbiadurak = file of real ;
tsKate250 = string[250] ;

procedure UNITATEA_Real_FitxategiaSortu(sFitxIzen: tsKate250) ;
procedure UNITATEA_Real_FitxategiaIkusi(sFitxIzen: tsKate250) ;
{---------------------------------------------------------------------------}

unitatea delako unitatea zenbaki errealen fitxategiak lantzeko erabil daiteke, hau da, unitatea unitateari esker errealen fitxategi bat sortu eta erakusten da.

Bezeroa.exe programak hainbat abiaduren batezbesteko aritmetikoa kalkulatuko du, datuak fitxategi batetik hartuz. Horretarako, bezero-programak unitatea izeneko unitatea erabiliko du, zeinek abiaduren fitxategia sortzen duen eta bere edukia erakusten duen.




Bezeroa.exe fitxategia lortzen

Ordenadorearen disko gogorreko edozein tokitan (mahaigainean adibidez) karpeta bat sortuko dugu, esate baterako Enekuri izeneko karpeta. Enekuri karpetan hiru fitxategi hauek kokatuko ditugu konpilazioa hasi aurretik:

  1. Bezeroa.pas iturburu-programa
  2. unitatea.ow unitatearen objektu-kodea
  3. unitatea.ppw unitate konpilatua


Bezeroa.pas fitxategia konpilatu ondoren eta dena ondo badoa, Enekuri karpetan bost fitxategi hauek izango ditugu:

  1. Bezeroa.pas iturburu-programa
  2. unitatea.ow unitatearen objektu-kodea
  3. unitatea.ppw unitate konpilatua
  4. Bezeroa.ow iturburu-programaren objektu-programa
  5. Bezeroa.exe programa exekutagarria


Bezeroa.pas fitxategiak unitatea izeneko unitatea erabili behar du, horregatik derrigorrezkoak dira unitatea.ow eta unitatea.ppw fitxategi aurrekonpilatuak Enekuri karpetan.


Bezeroa.exe fitxategia exekutatzen

Bezeroa.exe fitxategia exekutatzean datu-fitxategi bat sortuko da, adibidez Abiadurak.dat izeneko datu-fitxategia, datu-fitxategi horrek ibilgailuen abiadurak adierazten dituzten zenbaki errealak biltzen ditu. Ez bada besterik adierazten, Abiadurak.dat datu-fitxategia Bezeroa.exe exekutagarria dagoen Enekuri karpetan sortuko da. Horregatik Bezeroa.exe fitxategia exekutatu ondoren Enekuri karpetaren edukia hau izango da:

  1. Bezeroa.pas iturburu-programa
  2. unitatea.ow unitatearen objektu-kodea
  3. unitatea.ppw unitate konpilatua
  4. Bezeroa.ow iturburu-programaren objektu-programa
  5. Bezeroa.exe programa exekutagarria
  6. Adibideak.dat datuen fitxategia

Erabaki daiteke ere, Bezeroa.exe fitxategiaren exekuzioaren ondorioz Abiadurak.dat datu-fitxategia beste kapeta desberdin batean sortzea. Esate baterako, Enekuri karpeta barruko Datuak izeneko karpetan.




Bezeroa.pas fitxategitik Bezeroa.exe fitxategira

Orain programa bat idatziko dugu unitatea izeneko unitatea erabiliko duena, programa honi Bezeroa.pas deituko diogu, eta bere kodea programatuko duen programatzaileak unitatearen interfazea ezagutu behar du (INTERFACE blokea ezagutu behar du). Ikusi Bezeroa.pas iturburu-programaren kodea:

{------------------------------------------------------------------------
'Bezeroa.exe' programak hainbat abiaduren batezbesteko aritmetikoa
kalkulatuko du, datuak fitxategi batetik hartuz. Horretarako, bezero-
programak 'unitatea' izeneko unitatea erabiliko du, zeinek abiaduren
fitxategia sortzen duen eta bere edukia erakusten duen.

'unitatea' delako unitatea erabili errealen fitxategiak lantzeko.
'unitatea' unitatean errealen fitxategi bat sortu eta erakusten da,
bere TYPE atalean Integer datu-mota Longint bihurtzen da.
------------------------------------------------------------------------}

{------------------------------------------------------------------------
INTERFACE

type
integer = longint ; (* INTEGER-entzat 4 byte erabili *)
tfrAbiadurak = file of real ;
tsKate250 = string[250] ;

procedure UNITATEA_Real_FitxategiaSortu(sFitxIzen: tsKate250) ;
procedure UNITATEA_Real_FitxategiaIkusi(sFitxIzen: tsKate250) ;
------------------------------------------------------------------------}

program Bezeroa ;

uses
unitatea,
sysutils ; { fileexists() funtzioak behar duelako }


function fnrBatezBestekoaKalkulatu(sFitxIzen: tsKate250): real ;
var
f: tfrAbiadurak ;
rAbiadura, rMetatua: real ;
begin
assign(f, sFitxIzen) ;
reset(f) ;

rMetatua := 0.0 ;
while not eof(f) do
begin
read(f, rAbiadura) ;
rMetatua := rMetatua + rAbiadura ;
end ;

fnrBatezBestekoaKalkulatu := rMetatua / filesize(f) ;

close(f) ;
end ;

{------------------------------------------- Programa Nagusia -------------------}

var
sFitxIzen: tsKate250 ;
rBatezBestekoa: real ;

begin
writeln ;
writeln ;
writeln('================================================================================') ;
writeln(' Uneko direktorioa: ', GetCurrentDir) ;
writeln('================================================================================') ;
writeln ;
writeln ;

writeln('================================================================================') ;
writeln(' ''Enekuri'' izeneko karpeta bat sortu eta fitxategi hauek bertan kokatu:') ;
writeln(' - ''unitatea.ow'' objektu-kodea') ;
writeln(' - ''unitatea.ppw'' unitate konpilatua') ;
writeln(' - ''Bezeroa.pas'' programaren iturburu-kodea') ;
writeln ;
writeln(' ''Enekuri'' karpetan beste karpeta bat sortu ''Datuak'' izenekoa bertan kokatu:') ;
writeln(' - ''Abiadurak.dat'' datuen fitxategia') ;
writeln(' - ''Autoak.dat'' datuen fitxategia') ;
writeln(' - ''Bolidoak.dat'' datuen fitxategia') ;
writeln(' - ...') ;
writeln ;
writeln(' ''Bezeroa.exe'' fitxategia ''Enekuri'' karpetan badago, bere datu-fitxategiak') ;
writeln(' ''Enekuri\Datuak'' karpetan badaude, fitxategi horien bidea ''.\Datuak\'' da,') ; (* WINDOWS sistemetan *)
writeln(' beste bide egoki bat ''Datuak\'' da. Sarrera bat ''Abiadurak.dat'' adibidez.') ; (* WINDOWS sistemetan *)
//writeln(' ''Enekuri/Datuak'' karpetan badaude, fitxategi horien bidea ''./Datuak/'' da.') ; (* MAC sistemetan *)
writeln('================================================================================') ;
writeln ;

writeln('Ibilgailuen abiadura gordeko duen fitxategiaren izena eman ezazu.') ;
write('Adibidez, ''Abiadurak.dat'' izena: ') ;
readln(sFitxIzen) ;

//sFitxizen := '.\Datuak\' + sFitxIzen ; (* WINDOWS sistemetan *)
sFitxizen := './Datuak/' + sFitxIzen ; (* MAC sistemetan *)
writeln('Datuen-fitxategia: ', sFitxIzen) ;
writeln ;

UNITATEA_Real_FitxategiaSortu(sFitxIzen) ;
writeln ;

if FileExists(sFitxIzen) then { Konprobatu ea existitzen den ala ez }
begin
writeln(sFitxIzen, ' fitxategiaren edukia:') ;
writeln('----------------------------------------------------------------------') ;
UNITATEA_Real_FitxategiaIkusi(sFitxIzen) ;
writeln('----------------------------------------------------------------------') ;
writeln ;
rBatezBestekoa := fnrBatezBestekoaKalkulatu(sFitxIzen) ;
writeln('Abiaduren batezbestekoa = ', rBatezBestekoa:0:2, ' Km/h') ;
end
else
begin
writeln(sFitxIzen, ' fitxategirik ez dago. Gogoratu ''unitatea'' izeneko unitatea') ;
writeln('behar dela. Beraz, fitxategi hauek karpeta berean kokatu behar dira:') ;
writeln(' - ''unitatea.ow'' objektu-kodea') ;
writeln(' - ''unitatea.ppw'' unitate konpilatua') ;
writeln(' - ''Bezeroa.pas'' programaren iturburu-kodea') ;
writeln ;
writeln('Hiru fitxategi horiekin ''Bezeroa.exe'' programa exekutagarria lor daiteke:') ;
writeln(' - ''unitatea.ow'' objektu-kodea') ;
writeln(' - ''unitatea.ppw'' unitate konpilatua') ;
writeln(' - ''Bezeroa.pas'' programaren iturburu-kodea') ;
writeln(' - ''Bezeroa.exe'' programaren exekutagarria') ;
writeln ;
writeln('''Bezeroa.exe'' exekutatzean ''Abiadurak.dat'' fitxategia lor daiteke:') ;
writeln(' - ''unitatea.ow'' objektu-kodea') ;
writeln(' - ''unitatea.ppw'' unitate konpilatua') ;
writeln(' - ''Bezeroa.pas'' programaren iturburu-kodea') ;
writeln(' - ''Bezeroa.exe'' programaren exekutagarria') ;
writeln(' - ''Abiadurak.dat'' datuen fitxategia') ;
end ;

writeln ;
writeln('Programa amaitzeko RETURN tekla sakatu') ;
readln ;

end. { PROGRAMAREN BUKAERA }

Bezeroa.exe programa exekutagarria eskuratzeko, Bezeroa.pas programaren iturburu-kodea konpilatu beharra dago. Horretarako, Bezeroa.pas programaren iturburu-kodea eta unitatea izeneko unitatea karpeta berean kokatu behar ditugu. Gure helburua den Bezeroa.exe programa exekutagarria eskuratzeko, hiru fitxategi hauek beharko ditugu Enekuri karpetan:

  1. Bezeroa.pas programaren iturburu-kodea,
  2. unitatearen unitatea.ow objektu-programa eta
  3. unitatearen unitatea.ppw unitate konpilatua

Azken bi fitxategiak unitatea.pas unitatearen konpilaziotik eratorriak dira eta baliteke programatzaileak unitatea.pas iturburu-koderik ez izatea.




Bezeroa.exe exekutagarria eta Abiadurak.dat datuen fitxategia

Bezero-programaren Bezeroa.pas iturburu-kodea konpilatu/estekatu ondoren Bezeroa.exe programa exekutagarria eskuratuko dugu, eta azken hau exekutatzean Abiadurak.dat datu-fitxategia lortuko dugu. Baina, non, zein karpetatan, sortuko da Abiadurak.dat datu-fitxategia?

Goiko galderaren erantzuna Bezeroa.pas iturburu-kodean bilatu behar dugu, baina ezer baino lehen gomendio garrantzitsu bat eman dezagun: fitxategiak sortuko dituen programa bat exekutatzerakoan ez exekutatu Dev-Pas ingurunetik, joan programa exekutagarria dagoen karpetara eta programa exekutagarriaren gainean klikatuz hura exekutatu. Ondoko irudia ikusi, non Bezeroa.exe programa exekutagarria Enekuri karpetan dagoen, gorriz egingo ez duguna eta berdez gomendatzen duguna:


Datu-fitxategia non sortzen den goiko galderaren erantzuna, Bezeroa.pas iturburu-kodea aztertuz asmatuko dugula aurreratu dugu lehenago. Demagun Bezeroa.exe programa exekutagarria Enekuri karpetan dagoela eta Abiadurak.dat datu-fitxategiaren izena teklatuz irakurri ondoren hiru kate hauek eraikitzen ditugula:

  1. Datu-fitxategiaren izen soila: Esate baterako, Abiadurak.dat katea bada, datu-fitxategia sortuko da Bezeroa.exe programa exekutagarria dagoen tokian, hots, Abiadurak.dat datu-fitxategia Enekuri karpetan sortuko da
  2. Datu-fitxategiaren izena eta bidea:
    • ./Datuak/Abiadurak.dat katea bada, datu-fitxategia Enekuri karpeta barruan dagoen Datuak karpetan sortuko da, hots, Abiadurak.dat datu-fitxategia Enekuri/Datuak karpetan sortuko da
    • Datuak/Abiadurak.dat katea bada, lehentxoago bezala, datu-fitxategia Enekuri/Datuak karpetan sortuko da

Iturburu-programa aztertuz, datu-fitxategiaren izen soila: 

...
writeln('Ibilgailuen abiadura gordeko duen fitxategiaren izena eman ezazu.') ;
write('Adibidez, ''Abiadurak.dat'' izena: ') ;
readln(sFitxIzen) ; (* Abiadurak.dat karaktere-katea eman teklatuz *)

UNITATEA_Real_FitxategiaSortu(sFitxIzen) ;
writeln ;
...

Iturburu-programa aztertuz, datu-fitxategiaren izen konposatua (bidea gehi izena):

...
writeln('Ibilgailuen abiadura gordeko duen fitxategiaren izena eman ezazu.') ;
write('Adibidez, ''Abiadurak.dat'' izena: ') ;
readln(sFitxIzen) ; (* Abiadurak.dat karaktere-katea eman teklatuz *)
sFitxizen := '.\Datuak\' + sFitxIzen ; (* bidea ezarri fitxategiari *)

UNITATEA_Real_FitxategiaSortu(sFitxIzen) ;
writeln ;
...

Laburbilduz, datu-fitxategiaren izen soila ematen badugu (biderik gabe), datu-fitxategia sortuko da programa exekutagarrian dagoen tokian: Bezeroa.exe programa eta Abiadurak.dat datu-fitxategia elkarrekin aurkituko dira. Baina, datu-fitxategiaren izena zehaztean, diskoaren bide bat jarri bada, Abiadurak.dat datu-fitxategia sortuko da bide horrek adierazten duen karpetan.






    Windows:
Enekuri.zip   bere barnean Enekuri izeneko karpeta bat ondoko edukiarekin:
  • Programa-bezeroaren Bezero.pas iturburu-kodea
  • unitatea.ow unitatearen objektu-kodea
  • unitatea.ppw unitate konpilatua
  • Datuak karpeta (datu-fitxategi batekin) 
    Mac:
  • Bezeroa.pas   bezero-programaren iturburu-kodea
  • unitatea.o   unitatearen objektu-kodea
  • unitatea.ppu   unitate konpilatua
  • Bezeroa   programa exekutagarria (beharbada fitxategi hau jasotzea antibirusak ukatuko du, goikoekin lor daiteke)
  • Abiadurak.dat   datuen fitxategia


 

32. Ariketa: unitateak (I)

ZER DAKIDAN:
Karpeta batean kokaturik dagoen .PAS iturburu-programa batetik abiatuta .EXE programa exekutagarria lortzen ikasi dut, badakit ere .EXE programa exekutagarria karpeta berean sortuko dela, hots, iturburu-programaren karpetan.



ZER IKASIKO DUDAN:
Unitate bat sortzen ikasiko dut. Unitate bat ezin daiteke exekutatu. Unitate batek bi zati ditu: INTERFACE zati publikoa eta IMPLEMENTATION zati pribatua.





UNITATE BATEN BARNE EGITURA 

Unitateak direla eta, gaiaren nondik norako teorikoak Konpiladorea eta estekatzailea artikuluan biltzen dira eta oinarrizko adibide bat Unitateak artikuluan erakusten da, beste bi adibide aberatsago 10. astea | itsas-bataila (I) artikuluan eta 10. astea | itsas-bataila (II) artikuluan kontsulta daitezke.

Orain unitate bat sortzen ikasiko dugu. Unitate batek bi zati ditu, zati publikoa eta zati pribatua:

  • INTERFACE, unitatearen zati publikoa da. Hemen adierazten diren elementu guztiak bezero-programak erabili ahal izango ditu
  • IMPLEMENTATION, unitatearen zati pribatua da. Hemen dagoena bezero-programak ezin du atzitu. IMPLEMENTATION zati pribatuan garatzen da INTERFACE zati publikoan adierazten dena

Gure unitatearen iturburu-programa unitatea.pas izango da, eta konpilatu ondoren unitatea.ow eta unitatea.ppw fitxategiak lortuko ditugu.




unitatea.pas

Unitate bat programatuko dugu bere barnean bi prozedura izango dituena, prozedura batek datu-fitxategi bat sortzeko balio du eta bigarren prozedurak datu-fitxategiaren edukia pantailaratzeko balio du. Unitateari unitatea deituko diogu eta, horregatik, unitatearen iturburu-programari unitatea.pas deituko diogu, bere kodea ondoko hau da: 

{================================================unitatearen hasiera=======}
UNIT unitatea ;

{------------------------------------------------zati publikoa-------------}
INTERFACE

type
integer = longint ; { INTEGER-entzat 4 byte }
tfrAbiadurak = file of real ;
tsKate250 = string[250] ;

procedure UNITATEA_Real_FitxategiaSortu(sFitxIzen: tsKate250) ;
procedure UNITATEA_Real_FitxategiaIkusi(sFitxIzen: tsKate250) ;


{------------------------------------------------zati pribatua-------------}
IMPLEMENTATION

procedure UNITATEA_Real_FitxategiaSortu(sFitxIzen: tsKate250) ;
var
f: tfrAbiadurak ;
rAbiadura: real ;
iZenbat, k: integer ;
begin
assign(f, sFitxIzen) ;
rewrite(f) ;

repeat
write('Zenbat auto izango dira? ') ;
readln(iZenbat) ;
until iZenbat > 0 ;

for k:=1 to iZenbat do
begin
write(k, '. abiadura adierazten duen zenbaki erreala eman: ') ;
readln(rAbiadura) ;
write(f, rAbiadura) ;
end ;

close(f) ;
end ;


procedure UNITATEA_Real_FitxategiaIkusi(sFitxIzen: tsKate250) ;
var
f: tfrAbiadurak ;
rAbiadura: real ;
begin
assign(f, sFitxIzen) ;
reset(f) ;

while not eof(f) do
begin
read(f, rAbiadura) ;
writeln(filepos(f), '. autoaren abiadura = ', rAbiadura:0:2, ' Km/h') ;
end ;

close(f) ;
end ;

END.
{================================================unitatearen amaiera=======}

Unitateren egiturak bi zati ditu, bat publikoa eta bestea probatua. Zati publikoa INTERFACE blokean zehazten da, deklarazio bat besterik ez da, eta programa-bezeroak ezagutu behar du derrigorrez. Zati pribatua IMPLEMENTATION blokean garatzen da eta bere kodea bezeroak ez du zertan ezagutu behar.

Adibidearen unitatea.pas iturburu-programa konpilatu ondoren unitatea.ow objektu-programa eta unitatea.ppw unitate konpilatua lortzen dira. Berez, unitate bat ezin da exekutatu, bere barneko bi prozedurak beste programa batek (unitatearen bezeroak) erabiliko ditu. 





Bezeroa.pas

Orain programa bat idatziko dugu unitatea izeneko unitatea erabiliko duena, programa honi Bezeroa.pas deituko diogu, eta bere kodea programatuko duen programatzaileak unitatearen interfazea ezagutu behar du (INTERFACE blokea ezagutu behar du):

{---------------------------------------------------------------------------}  
INTERFACE

type
integer = longint ; { INTEGER-entzat 4 byte }
tfrAbiadurak = file of real ;
tsKate250 = string[250] ;

procedure UNITATEA_Real_FitxategiaSortu(sFitxIzen: tsKate250) ;
procedure UNITATEA_Real_FitxategiaIkusi(sFitxIzen: tsKate250) ;
{---------------------------------------------------------------------------} 

Bezeroa.pas programan UNITATEA_Real_FitxategiaSortu prozedura edo UNITATEA_Real_FitxategiaIkusi prozedura edo tsKate250 datu-mota edo tfrAbiadurak datu-mota  erabili nahi badira, lehendik unitatea delako unitateaz baliatuko dela adierazi behar du programatzaileak uses klausularen bidez. Ikusi Bezeroa.pas iturburu-programaren kodeak zer nola hasiera izan behar duen:

{---------------------------------------------------------------------
Bezeroak ezagutzen duena:
---------------------------------------------------------------------
INTERFACE

type
integer = longint ; (* INTEGER-entzat 4 byte erabili *)
tfrAbiadurak = file of real ;
tsKate250 = string[250] ;

procedure UNITATEA_Real_FitxategiaSortu(sFitxIzen: tsKate250) ;
procedure UNITATEA_Real_FitxategiaIkusi(sFitxIzen: tsKate250) ;
----------------------------------------------------------------------}

program Bezeroa ;

uses
unitatea,

...

Bezeroa.exe programa exekutagarria eskuratzeko, Bezeroa.pas programaren iturburu-kodea konpilatu beharra dago. Horretarako, Bezeroa.pas programaren iturburu-kodea eta unitatea izeneko unitatea karpeta berean kokatu behar ditugu. Gure helburua den Bezeroa.exe programa exekutagarria eskuratzeko, hiru fitxategi hauek beharko ditugu:

  1. Bezeroa.pas programaren iturburu-kodea,
  2. unitatearen unitate.ow objektu-programa eta
  3. unitatearen unitate.ppw unitate konpilatua

Azken bi fitxategiak unitate.pas unitatearen konpilaziotik eratorriak dira. Aipatutako hiru fitxategi horiek karpeta berean kokatu behar dira Bezeroa.exe programa exekutagarria lortzearren.