Limbajul c si C++ abc-doar


un pointer spre sirul care contine calea de acces.Functia cauta initial



Yüklə 4,6 Mb.
səhifə50/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   47   48   49   50   51   52   53   54   55

un pointer spre sirul care contine calea de acces.Functia cauta initial

in directorul curent,apoi in toate directoarele din calea de acees,pana

cand gaseste fila specificata.Cand gaseste fila,returneaza un sir care

contine calea completa de acces la fila.Sirul returnat poate fi utilizat

pentru a accesa fila respectiva.Sirul returnat este continut intr-un

tampon static de memorie (accesat prin pointer) si este suprascris la

fiecare apel al functiei searchpath().

Functia returneaza pointerul spre sirul returnat,sau NULL in caz de eroare

EXEMPLU: #include

#include

#include

char *cale;

main()

{ cale=searchpath("Tlink.exe");

printf("Calea spre fila Tlink.exe este: %s \n",cale);

sleep(3);

}
FUNCTIA setdisk()

-seteaza unitatea activa de memorie

SINTAXA GENERALA este: int setdisk(int drive);

Functia seteaza unitatea activa de memorie,utilizand codul numeric (0=A,

1=B,2=C etc.).Functia modifica unitatea activa de memorie,inclusiv pentru

procesul (programul) parinte (sursa).

Functia returneaza numarul total de unitati de memorie accesibile.

EXEMPLU: #include

#include

#include

#include


main()

{ setdisk(0);

system("DIR");

sleep(3);

setdisk(2);

system("DIR");

sleep(3);

}
CONSTANTE,TIPURI DE DATE si VARIABILE GLOBALE
DIRECTORY,DRIVE,EXTENSION,FILENAME,WILDCARDS sunt constantele returnate

de functia fnsplit() pentru a specifica ce parti componente a identificat

in cursul procesului de descompunere a caii de acces (vezi fnsplit() )

ffblk -este structura pentru blocul de control al filei(vezi findfirst)

MAXPATH,MAXDRIVE,MAXDIR,MAXFILE,MAXEXT sunt constante si specifica numarul

maxim de caractere pentru componentele caii de acces (vezi fnsplit() )


-381- [ alloc.h-calloc() si farcalloc() ]

BIBLIOTECA C fila antet

-contine functii pentru administrarea memoriei (alocare,dealocare etc.)
FUNCTIA calloc()

-aloca din memoria principala

SINTAXA GENERALA este: void *calloc(size_t nitems,size_t size);

Functia permite accesul la stiva de memorie a programului C.Stiva poate

fi accesata pentru alocarea dinamica a unor blocuri de memorie cu dimen-

siune variabila.Acest gen de alocare a memoriei este necesar pentru unele

tipuri de date,cum sunt structurile,arborii de directoare,listele etc.

Poate fi accesat tot spatiul de memorie cuprins intre segemntul de date

si varful arhivei,cu exceptia unei benzi inguste,situata la limita infe-

rioara a arhivei,banda care arhiveaza informatii despre cresterea stivei

si respectiv un spatiu ingust necesar pentru sistemul de operare.

In modelele mari sau cu memorie extinsa,intreaga memorie fizica situata

in afara arhivei este accesibila pentru alocare.

Functia aloca un bloc de memorie egal cu produsul dintre numarul de ele-

mente specificat prin nitems si dimensiunea fiecarui element specificata

prin size.Blocul creat este adus la 0 (sters).Dimensiunea maxima a blo-

cului este de 64 K (maximum pentru unsigned int).Pentru blocuri de date

mai mari de 64 K,apelati functia farcalloc().

Functia returneaza un pointer spre blocul de memorie nou alocat.In caz

ca nu exista suficienta memorie,sau in caz ca numarul de elemente este 0,

functia returneaza NULL.

EXEMPLU: #include

#include

#include

#include

char *sir1[5];

unsigned x,y;

main()

{ x=29;

y=14;

sir1[1]=calloc(x,y);

printf("Blocul de memorie ocupa: %u bytes \n",x*y);

strcpy(sir1[1],"Mesaj de salut");

printf("sirul contine: %d caractere \n",strlen(sir1[1]));

printf("Blocul contine: %d adrese \n",sir1[5]-sir1[0]);

free(sir1[1]);

sleep(3);

}
FUNCTIA farcalloc()

-aloca memorie din stiva FAR (din memoria de RAM)

SINTAXA GENERALA este:

void far *faralloc(unsigned long nunits,unsigned long unitsz);

Functia aloca un bloc de memorie format din nunits unitati,fiecare unitate

cu dimensiunea egala cu cea specificata prin unitsz.

Spre deosebire de calloc(),se poate accesa toata memoria de RAM (inclusiv

memoria extinsa),blocurile pot fi mai mari de 64 K (maximum pentru unsig-

ned long este 4 G),iar pointerii returnati sunt de tip far.


-382- [ alloc.h-farfree() si farmalloc()]

Functia returneaza un pointer de tip far orientat spre blocul de memorie

creeat,sau returenaza NULL daca nu exista suficienta memorie pentru bloc.

ATENTIE: pointerii de tip FAR se apeleaza cu un F inaintea tipului de

data (EXEMPLE: %Fp,%Fd,%Fs etc.)

EXEMPLU: #include

#include

#include

#include

char far *pf;

char *sir="Salutari din RAM !";

int main()

{ pf=farcalloc(20,sizeof(char));

movedata(FP_SEG(sir),FP_OFF(sir),FP_SEG(pf),FP_OFF(pf),20);

printf("Sirul transferat in memoria de RAM este: \n");

printf("%Fs \n",pf);

printf("situat la adresa: %Fp \n",pf);

sleep(3);

farfree(pf);

}
FUNCTIA farfree()

-elibereaza (dealoca) un bloc de memorie din stiva FAR (din RAM)

SINTAXA GENERALA este: void farfree(void far *block);

Functia elibereaza blocul de memorie specificat prin block (care a fost

alocat anterior in memoria de RAM).In modelele de memorie mici si medii,

cele doua stive de memorie sunt distincte,astfel incat blocurile create

cu farmalloc nu pot fi eliberate cu free (doar cu farfree) iar cele create

cu malloc() nu pot fi eliberate cu farfree(ci doar cu free).Pentru mode-

lele foarte mici(tiny),functia farfree() nu poate fi apelata de loc.

Functia nu returneaza nici o valoare.

EXEMPLU: vezi mai sus (pentru farcalloc)
FUNCTIA farmalloc()

-aloca memorie pentru RAM (stiva FAR)

SINTAXA GENERALA este: void far *farmalloc(unsigned long nbytes);

Functia aloca in RAM,un bloc de memorie cu lungimea specificata prin

nbytes.Se poate utiliza intreaga memorie de RAM,blocurile pot fi mai mari

decat 64 K (unsigned long permite pana la 4 gigabytes),iar pointerii re-

turnati sunt de tip FAR.Functia returneaza un pointer FAR spre blocul nou

creat sau NULL in caz ca nu exista suficienta memorie.

EXEMPLU: #include

#include

#include

#include

char far *p,*nr="123456789";

main()

{ p=farmalloc(20);

movedata(FP_SEG(nr),FP_OFF(nr),FP_SEG(p),FP_OFF(p),10);

printf("Blocul contine sirul: %Fs \n",p);

farfree(p);

sleep(3); }


-383- [ alloc.h -farrealloc() ]

FUNCTIA farrealoc()

-realoca memoria extinsa

SINTAXA GENERALA este: void *realloc(void *block,size_t size);

Functia se utilizeaza pentru a extinde sau a ingusta un bloc de memorie

alocat anterior(cu farcalloc() sau farmalloc() ).Blocul de memorie spe-

cificat prin block va fi redimensiunat la dimensiunea specificata prin

size.Daca dimensiunea specificata prin size este zero,blocul va fi NULL.

Dupa redimensionare,daca este cazul,datele continute in blocul de memorie

vor fi copiate la noua locatie(sau sterse,daca blocul va fi mai mic).

Functia returneaza adresa blocului realocat,adresa care poate fi diferita

de cea initiala(sistemul identifica locatia la care incape blocul redi-

mensionat).Daca blocul nu poate fi realocat sau daca size este zero,fun-

ctia returneaza NULL.

EXEMPLU: #include

#include

#include

#include

char far *str;

char *a="Hello";

int main()

{ str=farmalloc(10);

movedata(FP_SEG(a),FP_OFF(a),FP_SEG(str),FP_OFF(str),6);

printf("Sirul este: %Fs \n Adresa este: %Fp \n",str,str);

str(farrealloc(str,20);

printf("Dupa realocarea memoriei: \n");

printf("Sirul este: %Fs \n Adresa este: %Fp \n",str,str);

sleep(3);

farfree(str);

return(0);

}
Versiunea C++ include si urmatoarele functii: heapcheck(),heapcheckfree(),

heapchecknode(),heapfillfree() si heapwalk() destinate pentru evaluarea

stivei principale a memoriei C++.Descrierea acestor functii nu face

obiectul acestui manual(nu sunt destinate incepatorilor).Sunt utile doar

pentru cei care doresc sa dezvolte sisteme de operare bazate pe C++.
CONSTANTE,TIPURI DE DATE si VARIABILE GLOBALE
NULL - pointerul NULL este o constanta compatibila cu orice tip de pointer

Atunci cand un pointer este NULL,este garantat ca nu pointeaza

spre nici un tip de data si spre nici un obiect din program.Este

declarat in stddef.h
ptrdiff_t -este o constanta de tip int si reprezinta rezultatul dife-

rentei dintre doi pointeri (rezultatul scaderii).Este decla-

rata tot in stddef.h
size_t -este o constanta de tip unsigned int si reprezinta rezultatul

returnat de operatorul sizeof.Este declarata in stddef.h

-384- [ assert.h - assert() ]

BIBLIOTECA C fila antet

-contine un macro de evaluare a codului,utilizat pentru depanare
FUNCTIA assert()

-evalueaza o conditie si eventual intrerupe executia

SINTAXA GENERALA este: void assert(int test);

Functia evalueaza o expresie,iar atunci cand rezultatul este FALSE,afi-

seaza un mesaj de diagnostic si intrerupe executia programului.

Practic,functia este un macro care se comporta la fel ca si o comanda

IF.Evalueaza expresia si daca rezultatul returnat este zero,intrerupe

executia prin apel al functiei abort() si afiseaza un mesaj de tipul:

Assertion failed: test,file filename, line linenum

respectiv afiseaza numele filei sursa si numarul liniei de cod care a

generat rezultatul FALSE.

Se utilizeaza de obicei pentru a identifica erorile de tip logic (logica

booleana) rezultate prin executia unui program.Dupa ce depanarea progra-

mului este completa,evaluarea prin assert poate fi anulata fara a mai

modifica fila sursa prin declararea identificatorului NDEBUG.Identifica-

torul NDEBUG se poate introduce cu o directiva de tip #define NDEBUG

amplasata inaintea celei de #include .In acest mod,macroul

assert() va fi anulat,dar va putea fi reluat ori de cate ori este necesar

prin stergerea identificatorului NDEBUG.

Functia nu returneaza valori.

EXEMPLU: #include

#include

#include

char *sir1="abcdefg";

char *sir2="lmnopr";

char *sir3=NULL;

analiza(char *string);

main()

{ printf("Analiza primului sir= %s \n",sir1);

analiza(sir1);

printf("Analiza urmatorului sir= %s \n",sir2);

analiza(sir2);

printf("Analiza urmatorului sir= %s \n",sir3);

analiza(sir3);

sleep(3);

}

analiza(char *string)

{ assert(strlen(string)<9); /*sir mai surt de 9 bytes*/

assert(string != NULL); /*sirul nu poate fi NULL */

assert(string !='/0'); /*sirul nu poate fi vid */

assert(strlen(string)>3); /*sir mai lung de 3 bytes*/
}

Apasati tastele Alt si F5 (impreuna) pentru a observa rezultatul evaluarii

sau introduceti pe prima linie a programului #define NDEBUG pentru a

anula rezultatul evaluarii si a verifica programul fara depanare.In mod

similar,puteti introduce functii de depanare in oricare dintre aplicatiile

programate de d-voastra (mai ales in cele care sunt depanate frecvent).


-385- [ bios.h -bioscom() ]

BIBLIOTECA C fila de antet

-contine functii pentru rutinele BIOS de tip IBM-PC ROM
FUNCTIA bioscom()

-realizeaza diferite tipuri de comunicatie RS-232 prin porturile I/O

SINTAXA GENERALA este: int bioscom(int cmd,char abyte,int port);

Pentru porturile de comunicatie,0 corespunde la COM1,1 la COM2 etc.

Functia utilizeaza functia de intrerupere BIOS 0x14.

Functia se utilizeaza pentru comunicatie de tip telegrafic.

Pentru comanda specificata prin cmd,functia accepta urmatoarele valori:

0 -seteaza parametrii de comunicatie la valoarea din abyte

1 -transmite pe linia de comunicatie caracterul din abyte

2 -accepta un caracter de pe linia de comunicatie

3 -returneaza statusul curent al liniei de comuniciatie

Pentru abyte se pot utiliza urmatoarele combinatii de biti:

0x02 -7 biti de date 0x00 110 baud (baud=biti/secunda)

0x03 -8 biti de date 0x20 150 baud

0x40 300 baud

0x00 -1 bit de stop 0x60 600 baud

0x04 -2 biti de stop 0x80 1200 baud

0x00 -fara paritate 0xA0 2400 baud

0x08 -odd parity 0xC0 4800 baud

0x18 -even parity 0xE0 9600 baud

(EXEMPLU: valoarea 0xEB pentru abyte echivalenta cu (0xE0|0x08|0x00|0x03)

seteaza portul de comunicatie la un transfer de informatie de 9600 baud

(9600 biti/secunda),cu paritate incrucisata(odd parity),cu un bit de stop

si 8 biti de date)

Functia se grupeaza sub forma de algoritimi care contin diverse combinatii

ale functiei,astfel incat sa permita transferul de blocuri de caractere,

transmise serial (caracter cu caracter),prin intermediul modem-ului.

Functia returneaza o valoare de tip int,reprezentata pe 16 biti.In valoa-

rea returnata,cei 8 biti superiori contin statusul iar cei 8 biti infe-

riori depind de comanda din cmd.Cei 8 biti superiori pot fi:

bit 15 Time out (pauza)

bit 14 Transmit shift register empty(registru de transmisie gol)

bit 13 Transmit holding register empty(registru acumulator gol)

bit 12 Break detect (s-a detectat o intrerupere)

bit 11 Framing error (eroare de incadrare)

bit 10 Parity error (eroare de paritate)

bit 9 Overrun error (eroare de suprarulare)

bit 8 Data ready (datele sunt gata pregatite)

Daca valoarea din abyte nu a putut fi transmisa,rezultatul returnat va

contine bitul 15 setat 1.Pentru restul situatiilor,se va seta 1 bitul

corespunzator (EXEMPLU: xxxxxxxx-00100000 inseamna eroare de incadrare

deoarece bitul 11 este setat 1)

Pentru cmd=2,valoarea returnata este la nivelul bitilor inferiori (daca

nu a intervenit nici o eroare).In caz ca a intervenit o eroare,cel putin

unul dintre bitii superiori este setat 1 (vezi mai sus).Daca niciunul

dintre bitii superiori nu este setat 1,inseamna ca byte-ul transmis a

fost receptionat fara eroare.

Pentru statusul porturilor de comunicatie se utilizeaza cmd=3.


-386- [ bios.h- biosdisk() ]

Daca cmd=3,valoarea returnata va fi la nivelul bitilor inferiori si poate

fi dupa cum urmeaza:

bit 7 Received line signal detect (receptionat semnal de linie)

bit 6 Ring indicator (indicator de bucla)

bit 5 Data set ready (set de date gata pregatit)

bit 4 Clear to send (gata de transmisie)

bit 3 Change in receive line signal detector (schimbare se semnal)

bit 2 Trailing edge ring detector (detector de coada de bucla)

bit 1 Change in data set ready (schimbare in datele pregatite)

bit 0 Change in clear to send (nu este gata de transmisie)

Functia se utilizeaza in mod curent sub forma de protocoale de transmisie

prestabilite si standardizate.Nu este recomandabil sa incercati sa

realizati protocoale proprii de comunicatie,deoarece nu vor fi compatibile

cu cele utilizate de alte persoane (utilizati protocoalele standardizate)

EXEMPLU: #include

#include

#include

int nr;

main()

{ nr=bioscom(3,0,1);

printf("Statusul actual PORT 1= %d \n",nr);

nr=bioscom(3,0,2);

printf("Statusul actual PORT 2= %d \n",nr);

sleep(3);

}
FUNCTIA biosdisk()

-permite operatii direct in BIOS

SINTAXA GENERALA este:

int cmd,drive,head,track,sector,nsects;

int biosdisk(cmd,drive,head,track,sector,nsects,void *buffer);

In versiunea C++,functia are forma _bios_disk(),utilizeaza o structura

de tip diskinfo_t pentru specificarea parametrilor si are forma generala:

unsigned _bios_disk(unsigned cmd,struct diskinfo_t *dinfo);

Structura are forma generala:

struct diskinfo_t { unsigned drive,head,track,sector,nsectors;

void far *buffer;

};

Functia apeleaza intreruperea BIOS 0x13 pentru a realiza operatii direct

in BIOS.Prin comanda cmd se specifica tipul de operatie efectuata dupa

cum urmeaza: _DISK_RESET 0 /* reseteaza hard-ul */

_DISK_STATUS 1 /* statusul ultimei operatii */

_DISK _READ 2 /*citeste sectoare */

_DISK_WRITE 3 /*scrie sectoare */

_DISK_VERIFY 4 /*verifica sectoare */

_DISK_FORMAT 5 /*formateaza pista */

Prin drive se specifica unitatea de memorie (0=A,1=B etc.)Pentru harddisc

se utilizeaza codurile 0x80 =primul,0x81=al doilea etc.In cazul harddisc-

urilor se specifica unitatea fizica nu cea din partitia de disc.La nevoie

programul va interpreta singur tabela de partitie(pot apare confuzii ).

Pentru incepatori nu se recomanda apelarea functiilor BIOS.


-387- [ bios.h- biosdisk() ]

Ceilalti parametri specifica numarul capului de citire,pista,sectorul de

la care incepe citirea,numarul de sectoare citite si respectiv tamponul

de memorie in care se face citirea.In versiunea C++,toti acesti para-

metri sunt inclusi in structura de tip diskinfo_t.

Optiunea _DISK_READ citeste unul sau mai multe sectoare de pe disc.Pentru

fiecare sector se citesc in tamponul de memorie 512 bytes.Daca citirea

este fara eroare,octetul superior din valoarea returnata va fi zero iar

cel inferior (cei 8 biti inferiori) va contine numarul de sectoare citite.

In caz de eroare,octetul superior (cei 8 biti superiori) va contine una

dintre urmatoarele valori:

0x01 Bad command Comanda gresita

0x02 Adress mark not found Adresa nu a fost gasita

0x03 Atempt to write to Disc protejat la scriere

write-protected disc

0x04 Sector not found Sectorul nu a fost gasit

0x05 Reset failed(hard disk) Resetare intrerupta

0x06 Disk changed sice last operation Discul s-a modificat

0x07 Drive parameter activity fail Eroare de parametru

0x08 Direct memory acces overrun Incalcare de acces DMA

0x09 Attempt to perform DMA across Incercare de acces DMA

64 K boundary dincolo de limita de 64 K

0x0A Bad sector detected Sector gresit

0x0B Bad track detected Pista gresita

0x0C Unsupported track Pista in afara formatului

0x10 Bad CRC/EEC on disk read Greseala CRC/ECC(CRC=cyclic

redundancy check)

0x11 CRC/ECC corected data error Eroare de corectie CRC/ECC

0x20 Controler has failed Eroare de controler

0x40 Seek operation failed Operatie de cautare esuata

0x80 Atachment failed to respond Atasare nereusita

0xAA Drive not ready(hard disk only) Unitatea nu este activa

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   47   48   49   50   51   52   53   54   55




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