Limbajul C++ si oop abc-doar


data al fiecarui parametru.Este mult mai usor decat pare la prima vedere



Yüklə 1,36 Mb.
səhifə8/18
tarix12.09.2018
ölçüsü1,36 Mb.
#81721
1   ...   4   5   6   7   8   9   10   11   ...   18

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

Yüklə 1,36 Mb.

Dostları ilə paylaş:
1   ...   4   5   6   7   8   9   10   11   ...   18




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin