Limbajul c si C++ abc-doar


xBB Undefined error occured Eroare nedefinita



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

0xBB Undefined error occured Eroare nedefinita

0xCC Write fault occured Eroare la scriere

0xE0 Status error Eroare de status

0xFF Sense operation failed Operatie nereusita

Functia returneaza valoarea registrului AX setata de apelul INT 0x13 BIOS.

EXEMPLU: #include

#include

#include

char *date;

unsigned int nr;

main()

{ nr=biosdisk(2,0,1,1,20,1,&date);

printf(%u \n",nr);

if (nr & 0x0A)

printf("Sector defect !");

else

printf("Sector citit corect !");

sleep(3);

}

Pentru executie introduceti o discheta.Nu se recomanda incepatorilor.


-388- [ bios.h - biosequip() ]

FUNCTIA biosequip()

-verifica echipamentul

SINTAXA GENERALA este: int biosequip(void);

Functia apeleaza intreruperea BIOS 0x11 pentru a returna o valoare de

tip int care descrie codificat echipamentul conectat.

Valoarea returnata este de tip int pe 16 biti(2 octeti) si poate fi in-

terpretata dupa cum urmeaza:

biti 14-15 nr de imprimante pe port paralel (00=niciuna,01=1,10=2,11=3)

bit 13 imprimanta atasata pe port serial

bit 12 adaptor pentru jocuri (placa I/O)

bit 9-11 numarul de porturi de comunicatie COM ( 000=0,001=1,010=2,

011=3,100=4,101=5,110=6,11=7) adica maxim 8 porturi COM

bit 8 DMA(memoria cu acces direct) (0=exista DMA 1=nu exista DMA)

bit 6-7 Numar de unitati de memorie( 00=1,01=2,10=3,11=4)

bit 4-5 Modul video initial (00=nefolosit 01=40x25 BW 10=80x25BW

11=80x25 BW monocrom)

bit 2-3 Memoria de RAM (00=16K 01=32K 10=48K 11=64K )

bit 1 coprocesorul matematic in virgula mobila

bit 0 bootare(pornire) de pe disc

Functia se utilizeaza pentru detectarea hard-ului instalat.

EXEMPLU: #include

#include

#include

int nr;

#define CO_PROCESSOR 0x002

#define RAM16 0x0001

#define RAM32 0x0012

#define RAM64 0x0112

main()

{ nr=biosequip();

printf("Codul pentru echipamentul instalat este: %d \n",nr);

if (nr & CO_PROCESSOR)

printf("Coprocesorul matematic este instalat ! \n");

else

printf("Nu exista coprocesor matematic ! \n");

if (nr & RAM16)

printf("Placa de baza are 16 K de RAM \n");

if (nr & RAM32)

printf("Placa de baza are 32 K de RAM \n");

if (nr & RAM64)

printf("Placa de baza are 64 K de RAM \");

sleep(3);

}

Calculatoarele moderne au mai mult de 64 K de RAM,astfel incat toate

cele trei optiuni vor fi pozitive.Incercati sa scrieti un program care

sa testeze secvential memoria de RAM sau numarul de porturi COM.)

Functia nu reseteaza niciuna dintre valorile returnate,astfel incat poate

fi utilizata si de catre incepatori,fara nici un risc.Functiile care

scriu direct in BIOS pot modifica radical parametrii de lucru ai sis-

temului de operare,pot sterge unitatile instalate sau pot reformata discul

determinand uneori erori irecuperabile.


-389- [ bios.h-bioskey() si biosmemory()]

FUNCTIA bioskey()

-executa diverse operatii cu tastatura utilizand intreruperea BIOS 0x16

SINTAXA GENERALA este: int bioskey(int cmd);

Functia executa diverse operatii pentru tasatura.Operatia executata este

determinata de comanda specificata prin cmd.

Functia returneaza o valoare de tip int determinata de operatia executata

Comanda specificata prin cmd poate fi:

0 -daca bitii din octetul inferior sunt nonzero,functia returneaza

codul ASCII pentru caracterul aflat pe linie de asteptare,sau

ultima tasta apasata de la tastatura.Daca bitii din octetul infe-

rior sunt zero,bitii din octetul superior(8-15) sunt expandati la

codul extins al tastaturii,conform cu standardul IBM-PC.

1 -testeaza daca o anumita tasta poate fi citita.Daca functia retur-

neaza zero inseamna ca nici o tasta nu este disponibila.Daca functia

returneaza -1 (0xFFFFF) inseamna ca este apasata combinatia de taste

Ctrl-Brk.In orice alta situatie se returneaza valoarea ultimei taste

apasate,care urmeaza sa fie executata la proxima apelare a functiei

bioskey().

2 -solicita statusul actual al tastelor de control.Valoarea poate fi:

bit 7 0x80 Insert on

bit 6 0x40 Caps on

bit 5 0x20 Num Lock on

bit 4 0x10 Scroll Lock on

bit 3 0x08 Alt este apasata

bit 2 0x04 Ctrl este apasata

bit 1 0x02 Left arrow si Shift sunt apasate

bit 0 0x01 Right arrow si Shift sunt apasate

Functia se utilizeaza pentru a verifica sau seta tastele de control.

EXEMPLU: #include

#include

#include

int nr;

#define Scroll 0x0010

main()

{ nr=bioskey(2);

printf("Codul pentru tastele de control= %d \n",nr);

if (nr & Scroll)

printf("Tasta Scroll Lock este ON ! \n");

else

printf("Tasta Scroll Lock este OFF ! \n");

sleep(3);

}
FUNCTIA biosmemory()

-returneaza dimensiunea memoriei de RAM

SINTAXA GENERALA este: int biosmemory(void);

Functia apeleaza intreruperea BIOS 0x12 pentru a returna dimensiunea

memoriei de RAM instalate(fara a include memoria extinsa,memoria expandata

sau memoria adaptorului pentru afisaj,placa grafica etc.).

Functia returneaza dimensiunea memoriei de RAM in blocuri de 1 K (maxim

pana la 640 K ).


-390- [ bios.h - biosprint() ]

EXEMPLU: #include

#include

#include

int nr;

main()

{ nr=biosmemory();

printf("Memoria de RAM instalata este: %d K \n",nr);

sleep(3);

}
FUNCTIA biosprint()

-efectueaza operatii asupra imprimantei identificate

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

Functia apeleaza intreruperea BIOS 0x17 pentru a executa diferite operatii

asupra imprimantei instalate (identificata pe portul specificat prin port)

Valaorea 0 pentru port corespunde pentru LPT1,valoarea 1 corespunde pentru

LPT2 etc.

Comanda specificata prin cmd poate fi:

0 imprima caracterul specificat prin abyte

1 initializeaza portul imprimantei

2 citeste statutul imprimantei

Valoarea pentru abyte poate fi intre 0 si 255 (cod numeric ASCII).

Valoarea returnata de oricare dintre operatiile efectuate este corespun-

zatoare cu statusul imprimantei (obtinut de catre ORing-adica de catre

bucla de control) si poate fi una dintre urmatoarele valori:

bit 0 0x01 Device time out unitate nefunctionala

bit 3 0x08 I/O error eroare de intrare/iesire

bit 4 0x10 Selected unitatea este selectata

bit 5 0x20 Out of paper imprimanta nu are hartie

bit 6 0x40 Acknowledge semnalizare de avertizare

bit 7 0x80 Not busy nu este in lucru

EXEMPLU: #include

#include

#include

int status;

main()

{ status=biosprint(2,0,2);

if (status & 0x01)

printf("imprimanta nu este conectata ! \n");

if (status & 0x08)

printf("Eroare I/O (intrare-iesire)! \n");

if (status & 0x10)

printf("Imprimanta este selectata ! \n");

if (status & 0x20)

printf("Nu este hartie ! \n");

if (status & 0x40)

printf("Semnalizare ! \n");

if (status & 0x80)

printf("Imprimanta nu este in lucru ! \n");

sleep(3);

}


-391- [ bios.h -biostime() ]

FUNCTIA biostime()

-citeste sau seteaza ceasul BIOS-ului

SINTAXA GENERALA este: long biostime(int cmd,long newtime)

Functia citeste sau reseteaza valoarea ceasului de BIOS care numara im-

pulsurile care au rezultat incepand cu miezul noptii si pana in momentul

respectiv,la o rata a impulsurilor egala cu cea setata in constanta

CLK_TCK declarata in time.h (respectiv _BIOS_CLK_TCK in versiunea C++).

Pentru executie,functia apeleaza intreruperea BIOS 0x1A.

Daca cmd este 0,functia returneaza valoarea actuala a timerului iar daca

cmd este 1,ceasul (timerul) va fi resetat la valoarea specificata prin

newtime.

Functia returneaza valoarea actuala (numarul de impulsuri de la ora 0.00)

EXEMPLU: #include

#include

#include

#include

long timp;

main()

{ timp=biostime(0,0);

printf("De la miezul noptii au trecut: \n");

printf("%lu impulsuri=batai de ceas (CLK_TCK): \n",timp);

printf("adica %lu secunde \n",timp/18);

printf("adica %lu minute \n",timp/1080);

printf("adica %lu ore \n",timp/64800);

sleep(3);

}

Exercitiul este conceput pentru versiunea Turbo C la care CLK_TCK este

definita cu valoarea 18.2.In versiunea C++,constanta CLK_TCK este definita

cu valoarea de 1000.0 iar exercitiul necesita corectarile de rigoare.

Puteti utiliza si constanta CLK_TCK sau respectiv _BIOS_CLK_TCK).

Functia se poate utiliza in programare pentru a executa anumite operatii

la un moment predefinit al zilei,pentru a cronometra sau controla temporal

executia aplicatiilor sau pentru a efectua intreruperi secventiale dupa

un grafic prestabilit etc.
BIBLIOTECA C fila antet

-defineste constante mnemotehnice pentru codurile de eroare
CONSTANTE,TIPURI DE DATE si VARIABILE GLOBALE
_doserrno este o variabila globala care arhiveaza in paralel cu errno

codurile de eroare identificate de sistemul de operare.Functia perror

nu apeleaza _doserrrno direct ci apleaza errno,care este o variabila

asemanatoare mostenita de la sistemul de operare UNIX.La orice eroare

identificata de sistemul de operare,_doserrno arhiveaza codul mnemo-

tehnic,care poate fi utilizat in procesul de depanare/optimizare.

Pentru informatii suplimentare despre erori si coduri de eroare con-

sultati manualul tehnic al sistemului de operare (DOS).

Prin intermediul variabilei errno ,codul mnemotehnic poate fi extins

uneori la un mesaj complet de eroare prin apelarea sirurilor echivalente

din _sys_errlist.


-392- [ errno.h -errno ]

Codurile mnemotehnice returnate de _doserrno pot fi:

E2BIG Bad environ Mediu de operare gresit

EACCES Access denied Acces interzis

EACCES Bad acces Greseala de acces

EACCES Is curent dir Directorul este cel curent

EBADF Bad handle Cod de manipulare gresit

EFAULT Reserved Rezervat

EINVAL Bad data Data(valoare) gresita

EINVAL Bad function Functie gresita

EMFILE Too many open Prea multe file deschise

ENOENT No such file Nu exista fila sau directorul

or directory

ENOEXEC Bad format Format gresit

ENOMEM Mcb destroyed Bloc de memorie distrus

ENOMEM Out of memory Nu exista suficienta memorie

ENOMEM Bad block Bloc de memorie gresit

EXDEV Bad drive Unitate gresita

EXDEV Not same device Nu este aceeasi unitate
errno -este o variabila globala asemanatoare cu _doserrno utilizata

pentru a arhiva erorile identificate de catre sistemul de operare

si respectiv apelata de catre functia perror() pentru a afisa

mesajele de eroare.Uneori este echivalenta cu _doserror,dar exista

si erori care sunt arhivate in error dar nu si in _doserror.

Are forma generala: extern int errno;

Principalele coduri mnemotehnice din errno sunt:

EZERO Error 0 Eroare zero

EINVFNC Invalid function unmber Numar de functie invalid

ENOFILE File not found Fila nu a fost gasita

ENOPATH Path not found Calea nu a fost gasita

ECONTR Memory blocks destroyed Blocuri de memorie distruse

EINVMEM Invalid memory block address Adresa gresita

EINVENV Invalid enviroment Mediu de operare eronat

EINVFMT Invalid format Format gresit

EINVACC Invalid acces code Cod de acces invalid

EINVDAT Invalid data Data(valoare) gresita

EINVDRV Invalid drive specified Unitate specificata gresit

ECURDIR Atempt to remove Curdir Nu se sterge direct. curent

ENOTSAM Not same device Nu este aceeasi unitate

ENMFILE No more files Nu mai sunt file

ENOENT No such file or directory Nu exista fila sau direct.

ENOMEM Not enough core Insuficienta memorie

EMFILE Too many open files Prea multe file deschise

EACCESS Permision denied Acces interzis

EXDEV Cross-device link Conectare incrucisata

EDOM Math argument Argument matematic

ERANGE Result too large Rezultat prea mare

EFAULT Unknown error Rezultat necunoscut

EBADF Bad file number Numar eronat al filei

EINVAL Invalid argument Argument invalid

E2BIG Arg list too long Prea multe argumente


-393- [ fcntl.h- _pipe() ]

BIBLIOTECA C fila antet

-defineste flag-urile pentru functiile de deschidere a filelor
_fmode -este o variabila globala care determina modul text sau modul

binar de deschiderea a unei file.Accepta valorile O_TEXT si

respectiv O_BINARY.Variabila este setata implicit O_TEXT.

Diferenta intre cele doua moduri consta in modul de interpretare

a caracterelor functionale CR/LF,respectiv in modul de sfarsit

a fiecarui rand(vezi open() ).
O_xxx -sunt constante si definesc argumentele de definitie a filelor

Sunt utilizate pentru functiile: _dos_open,fdopen,fopen,freopen,

_fsopen,open,_rtl_open,sopen.Pot fi:

O_APPEND Adauga date intr-o fila (pointeaza sfarsitul filei)

O_BINARY Deschide fila in mod binar (explicit)

O_CHANGED Deschide fila doar pentru citire (special DOS)

O_CREAT Creaza si deschide fila

O_DENYALL Returneaza eroare pentru open cu O_RDWR

O_DENYNONE Permite accesul concurential

O_DENYREAD Returneaza eroare pentru open cu O_RDONLY,O_RDWR

O_DENYWRITE Returneaza eroare pentru open cu O_WRONLY,O_RDWR

O_DEVICE Deschide fila doar pentru citire (special DOS)

O_EXCL Deschide fila exclusiv (doar cu O_CREAT)

O_NOINHERIT Procesele copil mostenesc fila deschisa

O_RDONLY Deschide fila doar pentru citire

O_RDWR Deschide fila pentru citire si scriere

O_TEXT Deschide fila explicit in mod text

O_TRUNC Deschide fila cu trunchiere

O_WRONLY Deschide fila doar pentru scriere
FUNCTIA _pipe() [ in versiunea C++ declarata in io.h ]

-creaza un canal de comunicatie pentru scriere sau citire

SINTAXA GENERALA este: int _pipe(int *handles,unsigned int size,int mode);

Functia creaza un canal de comunicatie(un fel de stream) care poate fi

utilizat pentru a transfera informatie intre doua procese diferite.Canalul

de comunicatie poate fi scris si citit la fel ca o fila de pe disc,dar nu

are un nume de identificare sau o adresa fixa de stocare (este doar un

tampon volatil de memorie).Dimensiunea tamponului de memorie asociat cu

canalul de comunicatie este cea specificata prin size (se recomanda sa

fie de minimum 512 bytes).Modul de deschidere poate fi O_TEXT sau O_BINARY

(la fel ca pentru file).

FUNCTIA returneaza 0 in caz de succes sau -1 in caz de eroare(+ errno).

EXEMPLU: [ C++] #include

#include

int handles[2],int nr;

main()

{ handles[1]=7;

nr=_pipe(handles,1024,O_TEXT);

printf("nr=%d \n",nr);

getc(stdin);

}


-394- [float.h-_clear87() si _control87()]

BIBLIOTECA C fila antet

-contine parametrii necesari pentru operatiile cu virgula mobila
FUNCTIA _clear87()

-sterge statusul din registrul virgulei mobile (1 word=2 bytes)

SINTAXA GENERALA este: unsigned int _clear97(void);

Functia sterge statusul virgulei mobile,care este rezultatul combinatiei

dintre un word 80x87(2 bytes din coprocesorul matematic) si diferite alte

conditii detectate de catre controler-ul de exceptii al coprocesorului

matematic (80x87).

Functia returneaza valoarea indicata pentru statusul virgulei mobile

inainte de a fi sters.Pentru amanunte despre statusul virgulei mobile

vezi constantele definite in float.h.

EXEMPLU: #include

#include

#include

float x;

double y=1.5e-100;

main()

{

printf("\nStatus 8087 inainte de eroare=%X \n),_status87());

x=y; /*se introduce eroarea de domeniu */

printf("Status 8087 dupa eroare= %X \n",_status87());

_clear87();

printf("Status 8087 dupa clear= %X \n",_status87());

y=x;

sleep(3);

return(0);

}

Inainte de a rula exercitiul verificati daca aveti coprocesor matematic

8087 instalat.(vezi si _status87() )
FUNCTIA _control87()

-manevreaza registrul de control al virgulei mobile (1 word)

SINTAXA GENERALA este:

unsigned int _control87(unsigned int newcw,unsigned int mask);

Functia citeste sau reseteaza statusul virgulei mobile.Statusul virgulei

mobile este un word (2 bites) care contine o valoare de tip unsigned int

reprezentata pe 16 biti(2 bytes) si care specifica bit cu bit un pachet

de informatii ce contin:numele,precizia,modul infinit si modalitatea de

rotunjire a valorilor.Prin schimbarea acestor parametrii,valorile expri-

mate in virgula mobila pot contine sau pot exclude exceptiile precizate

prin domeniul astfel specificat (Exemplu: rotunjirea se poate face spre

valoarea cea mai mare sau spre cea mai mica,precizia poate fi crescuta

sau scazuta etc.).

La executia functiei,daca valoarea specificata pentru mask este 0,functia

returneaza valoarea pentru registrul virgulei mobile,fara a opera nici o

modificare ( EXEMPLU: _control87(0,0) ).

Daca valoarea specificata pentru mask este 1,atunci fiecare bit din va-

loarea specificata in newcw va inlocui pe cel similar din registrul de

control al virgulai mobile.


-395- [ float.h - _fpreset() ]

EXEMPLU: word initial 0100 0011 0110 0011

mask 1000 0001 0100 1111

newcw 1110 1001 0000 0101

biti modificati 1xxx xxx1 x0xx 0101

Functia returneaza noua valoare a registrului de control al virgulei

mobile(al coprocesorului matematic 8087).

EXEMPLU: #include

#include

#include

#include

float nr;

main()

{ nr=0.1*0.000000001;

printf("Numarul rezultat este: %.15e \n",nr);

_control87(PC_24,MCW_PC);

printf("Afisat cu precizie de 24 biti este: %.15e \n",nr);

_control87(CW_DEFAULT,0xfffff);

printf("Dupa resetare numarul este: %.15e \n",nr);

sleep(3);

}

Observati ca prin resetarea preciziei de reprezentare,diferenta apare

dupa primele 8 zecimale.

Functia este importanta in cazul calculelor matematice extrem de exacte,

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