|
data al fiecarui parametru.Este mult mai usor decat pare la prima vedere
|
səhifə | 8/18 | tarix | 12.09.2018 | ölçüsü | 1,36 Mb. | | #81721 |
| data al fiecarui parametru.Este mult mai usor decat pare la prima vedere.
Solutiile prezentate mai sus,sunt utile doar pentru a deschide filele
in timpul executiei,sau dupa un anumit algoritm.Pentru a consulta pur si
simplu o fila de tip text,nu este necesar sa programati nici o aplicatie.
Este suficient sa utilizati din meniul File optiunea Open.Alegeti fila
dorita si confirmati cu OK.
O alta modalitate,extrem de simpla, este sa utilizati o fereastra de
tip Windows,care are un meniu complet pentru manipularea filelor de tip
text.Din meniul File,alegeti New si apoi AppExpert.Introduceti numele
aplicatiei (De exemplu: Fila1 -eventual in interiorul directorului Debug
pentru a fi mai usor de transferat in Recycle Bin) si confirmati cu Open,
apoi din ferestra "AppExpert Application Generation Options" alegeti
optiunea MainWindow si confirmati cu butonul Generate,apoi cu OK.Fara
nici o alta linie de cod,deschideti fila1app.cpp,compilati aplicatia,
apoi construiti proiectul cu Build All si Make all.
Puteti ignora avertizarea care va atentioneaza ca fila de definitie
are un tampon de memorie mai mic de 64K si va fi inlocuit automat cu un
tampon implicit de 1M.Apasati butonul Run (cel cu un trasnet) si execu-
tati aplicatia.Proiectul va deschide automat o fereastra de tip Windows
cu un meniu complet.In aceasta ferestra,puteti deschide in timppul exe-
cutiei orice fila de tip text,cu ajutorul optiunii Open din meniul File.
Este bine sa utilizati directorul Debug,pentru proiectele temporare,
sau pentru exercitiile de programare care nu urmeaza sa fie pastrate
definitiv.In momentul in care nu mai sunt necesare,pur si simplu puteti
muta tot directorul in Recycle Bin si deschideti un nou director Debug.
Acest exercitiu,deplaseaza aplicatiile C++ din mediul DOS in mediul
Windows.Bineinteles ca aplicatiile editate sub Windows sunt mult mai
complexe si spectaculoase,dar consuma incomparabil mai multa memorie de
operare si respectiv memorie fizica pentru arhivarea programelor.In
functie de necesitatile de programare si de hard-ul instalat,puteti alege
ce tip de aplicatii doriti sa generati.
Exista o serie intreaga de clase de obiecte destinate pentru operatii
cu file de un anumit tip.Aceste clase,vor fi prezentate impreuna cu
biblioteca din care fac parte,sau urmeaza sa le descoperiti si descifrati
singuri.Principiul de lucru este acelasi: se incarca fila sursa,se decla-
ra un obiect din tipul respectiv,se apeleaza constructorul si apoi meto-
dele specializate.
-48-
Bibliotecile sunt un alt tip de structuri de date,utilizate pentru a
arhiva variabile,obiecte si functii sau algoritmi de executie.Se utili-
zeaza atunci cand unele dintre structurile unui program urmeaza sa fie
utilizate de mai multe ori,de catre mai multi utilizatori sau de catre
mai multe aplicatii si programe diferite.Bibliotecile extind extrem de
mult paleta de optiuni a unui programator si reprezinta,probabil,cel mai
valoros concept de programare structurata,dintre cele dezvoltate pana in
prezent.
In functie de modul in care sunt incluse intr-un program,bibliotecile
pot fi statice (adica exista permanent in memoria de operare) sau pot fi
legate dinamic(DLL=Dinamic Link Library),adica nu sunt incarcate in
memoria de operare decat in momentul in care se apeleaza datele incluse
in biblioteca respectiva.
In functie de tipul datelor continute,bibliotecile pot fi biblioteci de
tip arhiva,biblioteci de functii,biblioteci de obiecte,biblioteci de pre-
setare sau preconfigurare a unitatilor hardware,biblioteci de resurse,
biblioteci pentru analiza sau depanarea programelor etc.In functie de
modul de operare asupra datelor,bibliotecile pot fi biblioteci de import.
biblioteci de export sau mixte (import/export).
Exista o terminologie foarte bogata referitoare la biblioteci,dar,
trasatura caracteristica cea mai importanta este cea referitoare la modul
in care interactioneaza cu procesorul (cu memoria de operare).Din acest
punct de vedere,bibliotecile se impart in biblioteci statice(header files)
si biblioteci cu legare dinamica (DLL).
Bibliotecile statice prezinta o serie de avantaje:
-sunt foarte usor de editat (se editeaza o fila de tip text)
-sunt foarte usor de depanat (codul este expus direct,fara conversie)
-sunt foarte usor de modificat,actualizat,inlocuit etc.
-ocupa un spatiu fix de memorie (nu exista riscul de a "dopa" memoria)
-pot fi transferate automat de la un program la altul (fara link)
-sunt foarte usor de exploatat (date se apeleaza direct)
-pot fi arhivate separat de programul care le utilizeaza
-nu creaza conflicte de identificator
-nu exista nici un hazard in gestionarea si adminisrarea memoriei RAM
Acest gen de biblioteci sunt utilizate pentru toate filele header(cele
care se introduc in program cu #include) si au fost concepute si dezvol-
tate cu mult inaintea celor dinamice.Pentru realizarea unei astfel de
biblioteci se utilizeaza acelasi limbaj de programare ca pentru o fila
de cod oarecare.Se poate utiliza orice editor de text,iar fila se va arhi-
va cu extensia .h .
EXEMPLU: //dosar1.h
class dosar
{ public:
dosar(){ };
~dosar() { };
char nume[200];
char prenume[200];
};
Fila de mai sus se va arhiva cu numele: dosar1.h.Pentru a putea fi apela-
ta direct,fara a specifica si calea de acces,se va arhiva in directorul
INCLUDE,impreuna cu filele header standard.
-49-
Daca este inclusa in directorul INCLUDE,fila dosar1.h va putea fi
inclusa un orice program cu comanda de precompilare: #include.
Daca realizati un program oarecare in care fila header va fi inclusa in
alt director,apelul va include calea de acces completa pana la fila res-
pectiva.(EXEMPLU: daca fila este inclusa in directorul MANUAL,va putea
fi apelata cu: #include )
Pe primul rand al bibliotecii se introduce sub forma de comentariu
numele bibliotecii (Nu este strict necesar,dar poate fi extrem de util
atunci cand in timpul unui proces de depanare deschideti toate filele
din program si doriti sa identificati cat mai usor fila respectiva).
In exemplul de mai sus,biblioteca statica nu contine decat o clasa,
denumita "dosar".Clasa contine constructorul,destructorul si membrii
clasei.Pentru a putea utiliza clasa "dosar" in programe,nu trebuie decat
sa includeti si fila header dosar1.h (dupa ce a fost arhivata in INCLUDE).
EXEMPLU: (vezi si cplus35.cpp )
#include
#include
#include
main()
{ dosar d1;
cout << "Introduceti numele: \n";
cin >> d1.nume;
cout << "Introduceti prenumele: \n";
cin >> d1.prenume;
cout << "\n\n Numele introdus este: " << d1.nume;
cout << "\n Prenumele este: " << d1.prenume;
getch();
return 0;
}
Am derivat un obiect din clasa "dosar",denumit d1,suficient pentru
a putea introduce direct datele in obiect.Acest gen de implementare este
util atunci cand o anumita clasa urmeaza sa fie utilizata foarte frecvent.
In general,bibliotecile statice se utilizeaza pentru date care se uti-
lizeaza frecvent sau repetat intr-un program,astfel incat sa se justifice
prezenta lor permanenta in memoria de operare.
Pentru a edita o biblioteca statica se pot include in memorie si alte
biblioteci statice sau dinamice,dar nu este recomandabil.Orice byte inclus
in biblioteca statica va fi pastrat in memoria RAM pentru intrega durata
de executie a programului.Nu se vor include in biblioteci date inutile,
comentarii,artificii tehnice sau artificii de prezentare si afisare a
datelor,etc. decat daca acesta este scopul specific al bibliotecii respec-
tive.Cu cat o biblioteca este mai mica,cu atat este mai usor de manevrat
si mai usor de inclus in orice aplicatie.Inainte de a include o biblioteca
statica,verificati cat spatiu de memorie aveti la dispozitie(pentru a nu
depasi memoria RAM).Daca doriti sa arhivati mai multe tipuri de date si
functii care sunt necesare frecvent,dar nu neaparat impreuna,este mai bine
sa editati mai multe biblioteci independente,decat sa introduceti toate
datele in aceeasi biblioteca (o parte nu vor fi utilizate de loc in
program).Este bine sa nu grupati in aceeasi fila header decat datele care
se utilizeaza de obicei impreuna,sau functiile care opereaza sinergic sau
simultan asupra aceluiasi tip de data.
-50-
Toate datele incluse in biblioteca statica vor fi introduse in memoria
de operare in etapa de precompilare.Orice greseala in editarea unei file
header blocheaza procesul de compilare.Verificati cu atentie fiecare
byte si fiecare functie din biblioteca inainte de a incepe exploatarea
filei respective.Pentru a optimiza munca procesorului,este bine ca filele
cele mai mari sa fie incluse primele,iar cele mai mici sa fie incluse
ultimele.Dupa ce a-ti inclus filele header,inainte de a incepe editarea
propriu zisa a programului,puteti verifica cat spatiu de memorie ocupa
filele header.Bibliotecile statice nu pot fi utilizate simultan de catre
mai multi utilizatori.Fiecare utilizator va trebui sa detina o copie
separata a bibliotecii respective (in momentul incarcarii in meorie fila
va fi blocata pentru scriere sau citire).
Este bine sa pastrati toate bibliotecile statice editate.Cu cat aveti
o colectie mai bogata de astfel de file,cu atat programele d-voastra vor
fi mai versatile si mai usor de editat.Nu editati biblioteci doar de
dragul de a scrie ceva.Bibliotecile trebuie sa contina date utile,functii
obiecte sau resurse,sau cel putin solutii tehnice care va usureaza mult
munca viitoare (Exemplu: algoritmi de sortare a datelor,algoritmi de
calcul al unor parametrii specializati etc.).
Bibliotecile DLL,sunt un alt tip de module independente ce pot fi
exploatate pentru a simplifica munca de programare.Bibliotecile DLL pre-
zinta urmatoarele avantaje:
-nu consuma memorie de RAM decat in momentul in care sunt apelate datele
-pot fi utilizate simultan de catre mai multi utilizatori (pentru fiecare
utilizator se va crea in memoria RAM o instanta a filei DLL)
-pot fi utilizate simultan in mai multe aplicatii
-actualizarea filei DLL,va actualiza automat toate aplicatiile in care
este apelata
-fila este criptata si nu poate fi evaluata decat daca se adauga si fila
sursa (sau cu un program de decompilare)
-fila DLL poate fi utilizata pentru a executa o serie de operatii si
setari independente de programul din care este apelata(se executa
strict in memoria de operare fara riscul de a corupe datele din
programul sursa)
-programul apelant poate fi compilat si depanat chiar daca fila DLL
contine erori,deoarce fila nu se incarca in memorie decat in momentul in
care este apelata o data inclusa in lista de export a filei DLL
-fila DLL nu poate fi utilizata decat dupa ce a fost link-ata de programul
apelant (nu poate fi "incarcata accidental")
-fila DLL poate importa date din alte file DLL,sau poate exporta date
in diverse alte module si programe(cu conditia sa existe un link valabil)
-fila DLL poate fi utilizata ca un subprogram independent (poate ini-
tializa sau prelucra date care nu sunt vizibile din programul apelant)
Filele DLL prezinta urmatoarele dezavantaje:
-sunt mai greu de editat si administrat
-este destul de greu de gestionat spatiul de memorie RAM atunci cand se
utilizeaza simultan mai multe file DLL
-filele DLL pot "dopa" memoria de RAM pentru a genera inevitabilul mesaj
de eroare "Out of memory !"
-filele DLL link-ate activ creaza un spatiu virtual de memorie in care
pot apare conflicte de identificator,supraincarcari etc.
-51-
Nu exista o metoda unica pentru editarea bibliotecilor DLL.Cea mai
simpla metoda este urmatoarea:
EXEMPLU (vezi si directorul DLLTest)
Salvati un director nou,pentru programul ce urmeaza sa fie editat
(de exemplu DLLTest).Din meniul File alegeti New,apoi Project si apoi
optiunile: Application (.exe) Target Model= Console si Frameworks =
Class Library.Cu butonul Browse selectati directorul dorit (DLLTest) si
introduceti numele aplicatiei (Test1.cpp).Confirmati cu OK.
Din proiectul dezvoltat,stergeti filele .def si .rc si utilizati fila
.cpp pentru a realiza scheletul viitoarei aplicatii:
#include
#include
main()
{
cout << "text";
getch();
return 0;
}
Compilati,construiti cu Build All apoi cu Make All.Proiectul va contine
fila executabila (.exe) si fila sursa (.cpp) afisate astfel:
-test1.exe [.exe]
|
-test1.cpp [.cpp]
Salvati fila .cpp si apoi inchideti toate filele generate.Pentru a gene-
ra o fila DLL se va utiliza un mecanism similar.
Din meniul File,alegeti New,apoi Project si apoi: Dynamic Library [.dll]
Target Model = Console,Framework = Class Library.Cu butonul Browse se-
lectati tot directorul DLLTest,apoi adaugati numele filei DLL1.
Se va genera un proiect asemanator cu cel precedent,dar prima fila din
proiect va fi intitulata dll1.dll iar celelalte vor fi .cpp,.def si .rc.
Cu un click drept de mouse,alegeti Delete node si eliminati din proiect
filele .def si .rc.Deschideti fila .cpp si editati urmatorul text:
extern int _export Max1(int a){ a=a*a; return a; };
extern int _export Min1(int a){ a=a-1; return a; );
int WEP(int b)
{
b=1;
return b;
}
Compilati,construiti cu Build All,apoi cu Make All.Salvati fila,apoi
inchideti toate filele si programul principal (Borland C++) pentru ca
fila dll nou generata sa fie inclusa in lista programului principal.
Se observa ca pentru a exporta a functie se utilizeaza cuvantul cheie
"_export".Cuvantul cheie "extern" este necesar pentru a specifica daca
elementul respectiv va avea vizibilitate si in alt modul decat cel actual.
In rest,fila contine si o functie oarecare,denumita functie de intrare,
care are rolul de asigura iesirea din fila DLL.Aceasta functie poate sa
execute si o serie de operatii cu vizibilitate locala,dar este preferabil
sa nu execute nici o operatie care incarca memoria de operare.Pentru
aplicatiile Windows se utilizeaza functii specializate: DLLMain,LibMain,
sau WEP iar pentru restul aplicatiilor se poate utiliza orice functie.
-52-
Daca utilizati un utilitar de tipul Norton Commander si deschideti
directorul DLLTest,puteti observa ca programul a generat automat urma-
toarele file: dll1.dll,dll1.dsw,dll1.ide,dll1.lib,dll1.mbt,dll1.mrt,
dll1.obj si dll1.obr cu dimensiuni variabile.Fila dll1.dll ocupa circa
9541 bytes iar fila dll1.lib ocupa 1024 bytes.Aceste doua file sunt
necesare pentru a realiza link-ul.
Pentru a lega(linka) fila DLL1 de proiectul Test1,reporniti programul
C++,deschideti proiectul Test1 cu Project si Open,urmat de View si Project
si apoi utilizati un click de mouse drept si Add Node pentru a adauga
fila dll1.dll la fila test1.cpp.Apoi puteti adauga si fila dll1.cpp la
fila dll1.dll.In final,proiectul va arata in felul urmator:
test1.exe [.exe]
|
test1.cpp [.cpp]
|
dll1.dll [.dll]
|
dll1.cpp [.cpp]
Efectuati un nou click drept de mouse si alegeti optiunea Link.
Inchideti proiectul si apoi din meniul File deschideti fila Test1.cpp.
Pentru a putea exploata functiile exportate din fila DLL1,modificati
fila Test1.cpp astfel:
#include
#include
#pragma comment (lib,"DLL1.LIB")
extern _import Max1(int a);
extern _import Min1(int a);
main()
{
int b;
b=Max1(5);
int c;
c=Min1(5);
cout << "Functia Max1() returneaza: \n";
cout << b;
cout << "\nFunctia Min1() returneaza: \n";
cout << c;
getch();
return 0;
}
Compilati,construiti si executati aplicatia.
Observati ca importul functiilor se face cu cuvantul cheie _import.Pentru
a specifica explicit link-ul spre fila DLL se utilizeaza directiva de
precompilare #pragma comment(lib,"numele filei .LIB generata de DLL).
Observati ca mecanismul de editare este mai complex decat pentru biblio-
tecile statice.Sunt necesare operatii succesive si se genereaza un numar
destul de mare de file.Pentru cele doua functii (a caror definitie ocupa
cateva zeci de bytes) s-au generat mai multe file care ocupa cateva zeci
de kilobytes.Este usor de observat cu nu are rost sa generati o biblioteca
DLL doar pentru cateva functii utilizate sporadic.Pentru o astfel de apli-
catie este mult mai usor de utilizat o biblioteca statica.
-53-
Exemplul prezinta insa cel mai simplu mecanism de editare a unei
file DLL.O alta metoda este prin utilizarea filei .DEF in care se va
specifica numele filei dupa LIBRARY iar elementele exportate vor fi
incluse in lista dupa EXPORTS.In acest caz,functiile exportate pot fi
asociate si cu un cod numeric,astfel incat apelul lor sa poata fi facut
prin numarul de ordine.Pentru exemplul de mai sus,fila .DEF ar trebui sa
arate cam asa:
LIBRARY DLL1
EXPORTS
Max1 @1
Min1 @2
Se poate utiliza oricare dintre metode,sau o combinatie a lor.
O biblioteca DLL se justifica atunci cand arhiveaza zeci sau sute de
functii,constante si variabile.In acest caz,este destul de greu de tinut
evidenta fiecarei functii sau variabile.Pentru a simplifica munca de
programare,se poate forma o biblioteca de import in care sa fie arhivate
toate datele exportate.Biblioteca de import se creaza sub forma de fila
header si se incarca in etapa de compilare.In aplicatie,functiile pot fi
apelate direct,ca si cand ar fi preluate din biblioteca statica:
EXEMPLU: (vezi si directorul DLLTest2 )
Se procedeaza identic ca mai sus.Se deschide directorul,se formeaza
schita proiectului,se arhiveaza,apoi se deschide un nou proiect de tip
Dynamic Library [.dll] si in fila de tip .cpp se introduce un text de
genul:
extern int _export Maxim(int a,int b){ if (a>b) return a; else return b;};
extern int _export Minim(int a,int b){ if (a
int WEP (int b)
{
b=1;
return b;
}
Compilati,construiti cu Build All si Make All,apoi salvati si inchideti
programul pentru actualizare.
Redeschideti programul si realizati link-ul la fel ca in exemplul de mai
sus. Pentru importul datelor editati o biblioteca statica de genul:
//test2.h
#pragma comment(lib,"DLL2.LIB")
extern _import Maxim(int a,int b);
extern _import Minim(int a,int b);
Salvati fila cu numele de Test2.h in directorul INCLUDE.Pentru utilizarea
Dostları ilə paylaş: |
|
|