anul).Structura de tip date are forma generala
səhifə 46/55 tarix 07.05.2018 ölçüsü 4,6 Mb. #50260
anul).Structura de tip date are forma generala:
struct date{ int da_year; /* anul curent */
char da_day; /* ziua din luna */
char da_mon; /* luna din an (1=Ian)*/
}
Functia nu returneaza nici o valoare (nu este depanabila automat).
-348- [dos.h-setdta() si settime() ]
EXEMPLU: #include
#include
struct date salvare,actuala;
main()
{ getdate(&salvare);
system("date");
actuala.da_year=2007;
actuala.da_day=10;
actuala.da_mon=7;
setdate(&actuala);
printf("Dupa resetare data actuala este:");
system("date");
setdate(&salvare);
}
Pentru afisarea datei,in exercitiu se utilizeaza comanda MS-DOS "date",
apelata cu system().La comanda Enter new date,tastati Enter (sau o data
valida oarecare).Exercitiul reseteaza automat data initiala.
FUNCTIA setdta()
-reseteaza adresa de transfer a datelor
SINTAXA GEMERALA este: void setdta(char far *dta);
Functia schimba adresa DOS de transfer a datelor cu cea specificata prin
pointerul far *dta. (DTA=disk-transfer address)
Functia nu returneaza valori.
EXEMPLU: #include
#include
char far *salvare,far *citire;
char setare[80]="Adresa de transfer pentru date";
main()
{ salvare=getdta();
printf("dta= %Fp\n",salvare);
setdta(setare);
citire=getdta();
printf("dupa resetare dta= %Fp \n",citire);
setdta(salvare); /*reseteaza adresa initiala */
printf("Apasati orice tasta ! \n");
getch();
}
Functia este utila pentru a putea transfera datele in memoria extinsa,sau
pentru a desemna "discuri virtuale" etc.
FUNCTIA settime()
-reseteaza ceasul sistemului
SINTAXA GENERALA este: void settime(struct time *timep);
Functia utilizeaza o structura de tip time (definita in dos.h-vezi tipu-
rile de date),pentru a reseta ceasul sistemului (ora,minutul,secumda)
struct time { unsigned char ti_min; /* minute */
unsigned char ti_hour; /*ore */
unsigned char ti_hund; /*sutimi de secunda */
unsigned char ti_sec; /*secunde */
Functia nu returneaza nici o valoare.
-349- [ dos.h- setvect() ]
EXEMPLU: #include
#include
struct time salvare,resetare,t;
int x;
main()
{ gettime(&salvare);
resetare.ti_hour=10;
resetare.ti_min=33;
settime(&resetare);
gettime(&t);
printf("Dupa resetare este ora: \n");
printf("%d %d \n",t.ti_hour,t.ti_min+1);
sleep(3);
settime(&salvare);
}
FUNCTIA setvect()
-seteaza un vector de intrerupere
SINTAXA GENERALA este: void setvect(int nr,void interrupt (*isr)() );
Orice procesor din familia 8086 include un set de vectori de intrerupere
numerotati de la 0 la 255.Fiecare vector contine cate o valoare formata
din 4 bytes,care este de fapt adresa de locatia a unei functii de intre-
rupere.Functia setvect() seteaza valoarea pentru vectorul specificat prin
nr la cea specificata prin pointerul *isr,care este un pointer de tip far
spre adresa care contine functia dorita.Adresa unei functii C poate fi
transferata pointerului isr doar daca functia respectiva a fost declarata
ca functie de intrerupere.In versiunea C++ pot fi declarata ca functii de
intrerupere doar functiile fara membri sau cele cu membri statici.Functia
se poate utiliza pentru a transfera adresa unei functii de intrerupere,
indiferent de modelul de memorie utilizata(mica,medie,larga,extinsa etc.)
Pentru a citi valoarea unui vector se poate utiliza functia getvect().
Functia nu returneaza valori.
EXEMPLU: #include
#include
main()
{ printf("INT 254= %x \n",getvect(254));
setvect(254,getvect(1));
printf("dupa resetare: \n");
printf("INT 254= %x \n",getvect(254));
setvect(254,getvect(253));
sleep(3);
printf("se revine la setarea initiala: \n");
printf("INT 254= %x \n",getvect(254));
sleep(3);
}
In exemplul de mai sus am utilizat doi vectori 254 si 253 cu valoarea 0
(adica nu contin nici o adresa-sunt programabili) si un vector pozitiv (1)
Nu va jucati cu vectorii de intrerupere,decat daca stiti exact ce rezultat
obtineti,deoarece riscati ca versiunea d-voastra de program sa devina
incompatibila cu toate programele standard.Este recomandabil sa nu
resetati decat vectorii programabili(verificati cu getvect() ).
-350- [ dos.h-setverify() si sleep() ]
FUNCTIA setverify()
-seteaza statusul pentru steguletul de avertizare (flag)
SINTAXA GENERALA este: void setverify(int value);
Functia seteaza statusul pentru flag (steguletul de control al scrierii
pe disc).Valorile acceptate sunt 0 (off) si 1 (on).Steguletul de control
semnaleaza modul de control al scrierii pe disc.Daca steguletul este
setat OFF (0),inscriptionarile nu sunt verificate,iar daca steguletul este
setat ON (1),toate inscrierile pe disc sunt verificate astfel incat sa
asigure scrierea corecta a datelor (verifica datele bit cu bit).
Functia nu returneaza nici o valoare (nu este depanabila automat).
EXEMPLU: #include
#include
main()
{ printf("Steguletul este setat: %d \n",getverify());
setverify(1);
printf("dupa resetare este: %d \n",getverify());
setverify(0);
sleep(3);
}
Valoarea implicita este 0 (OFF).
FUNCTIA sleep()
-suspenda executia pentru intervalul specificat(in secunde)
SINTAXA GENERALA este: void sleep(unsigned seconds);
Functia suspenda executia programului pentru numarul de secunde specificat
prin seconds.Intervalul de timp al fiecarei intreruperi are o acuratete de
o sutime de secunda,sau are acuratetea generala a ceasului de sistem (daca
sistemul are o acuratete mai mica decat o sutime de secunda).
Functia nu returneaza nici o valoare.
EXEMPLU: #include
#include
int x;
main()
{ for (x=0;x<5;x++)
{ printf("Pauza de %d secunde ! \n\n",x);
sleep(x);
}}
In manual am abuzat de functia sleep() pentru a intarzia cu 2-3 secunde
executia exercitiilor,astfel incat se se poata vizualiza fereastra DOS
suficient timp,pentru a intelege rezultatul functiei.In versiunea C++ si
in alte versiuni,functia sleep() nu poate fi intotdeauna apelata.Utilizati
o alta functie de intrerupere (gen getch() ),sau pur si simplu puteti
utiliza combinatia de taste Alt+F5 pentru a vizualiza fereastra DOS,dupa
care reveniti in fereastra C cu Enter sau tot cu Alt+F5.Functia este utila
mai ales pentru rutine grafice sau pentru afisarea unor mesaje de averti-
zare,dar poate fi utilizata si ca functie de intrerupere,pentru orice gen
de aplicatie numerica.Versiunea Visual C++ include o functie sleep() care
suspenda executia pentru intervalul specificat in milisecunde (DWORD).
Atentie:-daca utilizati functia sleep() cu o valoare infinita (ca rezultat
al unei operatii matematice) programul va executa o bucla infinita (se va
bloca in executia unei pauze nedeterminate in timp).
-351- [ dos.h -sound() si unixtodos() ]
FUNCTIA sound()
-executa un sunet cu frecventa specificata (in Hz)
SINTAXA GENERALA este: void sound(unsigned frequency);
Functia executa un sunet generat de difuzorul incorporat la frecventa
specificata prin frequency,exprimata in Hz(cicli per secunda).Pentru a
intrerupe sunetul este necesara apelarea functiei nosound().
Functia nu returneaza nici o valoare (nu este depanabila automat).
EXEMPLU: #include
int x;
main()
{ for (x=1;x<100;x++)
{ sound(x*10);
delay(1000);
sound(x*100);
delay(1000);
}
nosound();
}
Puteti utiliza functia pentru a genera diverse aplicatii:sonerii,sirene,
melodii,semnale de avertizare,semnale sonore asociate functiilor etc.
FUNCTIA unixtodos()
-converteste data calendaristica din format UNIX in format DOS
SINTAXA GENERALA este:
void unixtodos(long time,struct date *d,struct time *t);
Functia utilizeaza o structura de tip date si o structura de tip time,
pentru a realiza conversia de la formatul UNIX la formatul DOS al datei
calendaristice si a ceasului de sistem.Datele vor fi arhivate in cele
doua structuri.Functia poate fi aplicata doar pentru date calendaristice
mai recente decat 1 Ianuarie 1980.
Functia nu returneaza nici o valoare.
EXEMPLU: #include
#include
struct date d1;
struct time t1;
long int valoare;
main()
{ getdate(&d1);
gettime(&t1);
valoare=dostounix(&d1,&t1);
valoare=valoare+86400*777;
unixtodos(valoare,&d1,&t1);
printf("Peste 777 de zile va fi: \n");
printf("%d %d %d \n",d1.da_day,d1.da_mon,d1.da_year);
sleep(3);
}
Exemplul ilustreaza modul de a realiza operatii aritmetice cu datele
calendaristice,utilizand formatul UNIX al datei.Cifra de 86400 reprezinta
numarul de secunde dintr-o zi(adauga o zi la formatul UNIX).
Puteti utiliza functia impreuna cu dostounix() pentru a realiza diverse
rutine de calcul,cu operatii asupra datelor calendaristice.
-352- [dos.h -unlink() si CONSTANTE dos ]
FUNCTIA unlink()
-sterge o fila
SINTAXA GENERALA este: int unlink(const char *filename);
Functia sterge fila al carei nume este specificat prin *filename (pointer
spre numele si extensia filei).Se poate specifica orice unitate de disc
si orice cale de acces (PATH) dar nu se accepta caracterele cu sens gene-
ral (wildcards gen ? si * ).Nu pot fi sterse filele cu atributul read-only
care trebuie modificate cu chmod() sau _rtl_chmod() inainte de a fi sterse
(prin schimbarea atributului la archive).In mod similar,fila specificata
trebuie sa fie inchisa,inainte de a putea fi stearsa (nu se pot sterge
filele deschise).
Functia returneaza 0 daca a fost executata cu succes si -1 in caz de eroa-
re.In caz de eroare seteaza errno la una dintre valorile: EACCES(acces
interzis) sau ENOENT(cale gresita sau fila nu exista).
EXEMPLU: #include
int b;
main()
{ b=unlink("fisier1.bak");
if (b==0)
printf("Fila a fost stearsa cu succes ! \n");
else
printf("Fila nu a fost gasita (sau nu exista)! \n");
sleep(3);
}
Exemplul prezinta modul de debarasare de o fila de back-up care nu mai
este utila.In mod similar se pot genera rutine automate pentru stergerea
automata a filelor de back-up generate prin actualizarea fisierelor.
Atentie maxima atunci cand specificati filele ce urmeaza sa fie sterse,
deoarece dupa stergerea filelor de back-up,datele nu mai pot fi recuperate
In caz ca exista mai multe file cu acelasi nume,dar cu cale de acces
diferita,atentie maxima la specificarea caii de acces,pentru a nu sterge
alta fila decat cea dorita.Atentie sa nu stargeti din greseala filele
sistemului de operare,executabilele,aplicatiile sau bazele de date.
CONSTANTE,TIPURI DE DATE si VARIABILE GLOBALE
_8087 este o variabila globala care se utilizeaza pentru a desemna
statusul coprocesorului matematic instalat.
SINTAXA GENERALA este: extern int _8087;
Poate accepta urmatoarele valori:
1 8087
2 80287
3 80387
0 -nu exista coprocesor matematic instalat.
Se utilizeaza in BIOS pentru detectarea coprocesorului matematic.Detectia
poate fi anulata prin resetarea variabilei 87 la valoarea NO (cele doua
setari posibile sunt: SET 87=YES sau SET 87=NO )
_argc este o variabila globala pentru valoarea de start a functiei main()
SINTAXA GENERALA este: extern int _argc
Se utilizeaza pentru a transfera valori initiale functiei main().
-353- [ dos.h-tipuri de date ]
_argv este o variabila globala de tip pointer care pointeaza spre
o arie de memorie care contine argumentele initiale ale unei
linii de comanda,argumente ce vor fi transferate functiei main
() la pornirea programului
SINTAXA GENERALA este: extern char **_argv;
COUNTRY este o structura care contine elemente de format specifice
pentru o anumita tara (simboluri personalizate etc.)
are forma generala:
struct COUNTRY { int co_date; /*data */
char co_curr[5]; /*moneda */
char co_thsep[2] /*separator mii */
char co_desep[2] /*separator zecimal */
char co_dtsep[2] /*separator data */
char co_tmsep[2] /*separator timp */
char co_currstyle; /*stil moneda */
char co_digits; /*nr digiti moneda */
char co_time; /*formatul pt timp */
long co_case; /*case map */
char co_dasep[2] /*separator data */
char co_fill[10] /caracter de umplere*/
};
co_date (formatul datei) accepta urmatoarele valori:
0 U.S. (month,day,year)
1 European (day,month,year)
2 Japonez (year,month,day)
iat co_currstyle (stilul monedei) accepta urmatoarele valori:
0 -simbolul precede valoarea fara spatiu (EXEMPLU: $10.52)
1 -simbolul urmeaza valoarea fara spatiu (EXEMPLU: 10.52$)
2 -simbolul precede valoarea cu spatiu gol (EXEMPLU: $ 10.52)
3 -simbolul urmeaza valoarea cu spatiu gol (EXEMPLU: 10.52 $)
Pentru separatori se poate utiliza orice caracter ASCII.
date este o structura utilizata pentru a arhiva data calendaristica
are forma generala:
struct date { int da_year; /* anul curent */
char da_day; /* ziua din luna */
char da_mon; /* luna din an (1=Ianuarie) */
};
Se utilizeaza pentru functiile:dostounix,getdate,setdate,unixtodos
devhdr este o structura pentru driverele de unitate MS-DOS
are forma generala:
struct devhdr {
long dh_next;
short dh_attr;
unsigned short dh_strat;
unsigned short dh_inter;
char dh_name[8];
};
Se utilizeaza pentru comenzile care intereseaza unitatea de lucru(device).
-354- [ dos.h- TIPURI DE DATE ]
dfree este o structura utilizata pentru valorile returnate de getdfree()
are forma generala:
struct dfree{ unsigned df_avail; /*clustere libere */
unsigned df_total; /*total clustere */
unsigned df_bsec; /*bytes per sector */
unsigned df_sclus; /*sectoare per cluster */
};
diskfree_t este o structura utilizata de functia _dos_getdiskfree()
are forma generala:
struct diskfree_t { unsigned total_clusters;
unsigned avail_clusters;
unsigned sectors_per_cluster;
unsigned bytes_per_sector;
};
dosdate_t este o structura utilizata de _dos_getdate() si _dos_setdate()
are forma generala:
struct dosdate_t { unsigned char day; /* 1-31 */
unsigned char month; /* 1-12 */
unsigned int year; /* 1980-2099 */
unsigned char dayofweek; /* 1-6 0=Sun */
}
DOSERROR este o structura utilizata de dosexterr pt erorile de DOS
are forma generala:
struct DOSERROR { int de_exterror; /*eroarea extinsa */
char de_class; /*clasa erorii */
char de_action; /*actiunea */
char de_locus; /*locatia erorii */
};
dostime_t este o structura utilizata de _dos_gettime() si _dos_settime()
are forma generala:
struct dostime_t { unsigned char hour; /*ora */
unsigned char minute; /*minutul */
unsigned char second; /*secunda */
unsigned char hsecond; /*sutimi de sec*/
};
-doserrno este o variabila globala care inregistreaza erorile
SINTAXA GENERALA este: extern int _doserrno;
variabila poate inregistra o serie de erori de sistem,pe care le
contabilizeaza cu urmatoarele formule mnemotehnice:
E2BIG (mediu defect),EACESS(acces oprit),EACCES(fara acces),EACESS
(director curent),EBADF(handle gresit),EFAULT(rezervat),EINVAL(
functie gresita),EMFILE(prea multe file deschise),ENOENT(nu exista
fila sau directorul),ENOEXEC(format eronat),ENOMEM(bloc de control
al memoriei (Mcb) distrus),ENOMEM(memorie insuficienta),ENOMEM(bloc
eronat),EXDEV(unitate gresita),EXDEV(unitatea nu exista)
Pentru amanunte consultati manualul DOS,la codurile de eroare returnate.
-355- [ dos.h- TIPURI DE DATE ]
dosSearchInfo este o structura cu urmatoarea forma generala:
(typedef struct) typedef struct { char drive;
char pattern[13];
char reserved{7];
char attrib;
short time;
short date;
long size;
char nameZ[13];
} dosSearchInfo
environ(_environ) este o variabila globala si este o arie de pointeri
spre siruri.Este utilizata pentru a accesa si/sau a
modifica variabilele de mediu ale sistemului de operare
SINTAXA GENERALA este: extern char **_environ;
Fiecare sir continut este de forma generala: envar=varvalue unde prin
envar se specifica numele variabilei (de exemplu PATH) iar prin varvalue
se specifica sirul care contine valoarea variabilei (exemplu: C:\DOS\TC)
Valoarea pentru varvalue poate fi nula (sirul poate fi gol).
La lansarea programului,setarile de mediu ale sistemului de operare sunt
transferate functiei main() prin argumentul sau env care este egal cu
setarile initiale din environ(_environ).
Variabila environ poate fi accesata cu getenv() si poate fi modificata cu
putenv(),pentru a adauga,sterge sau modifica unele siruri.Aria de memorie
care contine variabilele de mediu,poate fi redimensionata dar variabila
environ(_environ) va fi ajustata automat astfel incat sa pointeze corect
aria de memorie.
Se utilizeaza pentru a modifica mediul de operare.Nu se recomanda incepa-
torilor (riscati sa alterati iremediabil mediul de operare).
fatinfo este o structura pentru tabela de alocare a filei
Se utilizeaza cu getfat() si getfatd().Are forma generala:
struct fatinfo { char fi_sclus; /*sectoare per cluster */
char fi_fatid; /*byte de identificare */
int fi_nclus; /*numar clustere */
int fi_bysec; /*bytes per sector */
};
fcb este o structura care contine blocul de control al filei (MS-DOS)
are forma generala:
struct fcb { char fcb_drive;
char fcb_name[8],fcb_ext[3];
short fcb_curblk,fcb_recsize;
long fcb_filsize;
short fcb_date;
char fcb_resv[10],fcb_currec;
long fcb_random;
};
Este utila pentru functiile care analizeaza filele si fisierele
Dostları ilə paylaş: