240 likes | 465 Views
Süsteemprogrammeerimine keeles C ja C#. Üheteistkümnes loeng. Veel failidest ja streamidest. Failitöötluse soovitus #include <iostream.h> #include <fstream.h> Annab kaks kasulikku klassi sulle ifstream – sisendfailivoog ofstream – väljundfailivoog KASUTAD NAGU cout, cin, cerr jne klasse.
E N D
Süsteemprogrammeerimine keeles C ja C# Üheteistkümnes loeng
Veel failidest ja streamidest • Failitöötluse soovitus #include <iostream.h> #include <fstream.h> • Annab kaks kasulikku klassi sulle • ifstream – sisendfailivoog • ofstream – väljundfailivoog • KASUTAD NAGU cout, cin, cerr jne klasse
Veel failidest ja streamidest #include <iostream.h> #include <fstream.h> #include <stdio.h> void main() { int I = 0; char b[255]; ifstream loe("c:\\boot.ini"); while( loe.getline(b,255)) { i++; cout << i << " " << loe.tellg() << " " << b << '\n'; } }
Veel failidest ja streamidest #include <iostream.h> #include <fstream.h> #include <stdio.h> void main() { int I = 0; char b[255]; ifstream loe("c:\\boot.ini"); ofstream pane(“c:\\copyboot.ini”); while( loe.getline(b,255)) { i++; pane << i << " " << loe.tellg() << " " << b << '\n'; } }
Template • Probleem – klassi kirjeldamisel on vaja terve hulk ühesuguse sisuga kuid eri tüüpi parameetritega funktsioone. • See muudab klassi kirjelduse kohmakaks ja ebaotstarbekaks, rakesti loetavaks ja raskesti silutavaks
Template int compare_values(int a, int b); float compare_values(float a, float b); char compare_values(char a, char b); • Kõigi kolme sisu on 1 ja seesama return ((a > b) ? a : b);
Lihtsam vorm template<class T> T compare_values(T a, T b) { return ((a > b) ? a : b; } • nn GENERIC FUNKTSIOON!
Template kasutades saab koostada • Generic funktsioone • Generic struktuure • Generic klasse • Generic tüübiteisendusi (casting) • jne jne
Veatöötlus • Inimene teeb peamiselt vigu • Avuti teeb peamiselt vigu • Maailmas juhtub igasugu äpardusi ja kui ei juhtu, siis lugege Murphit
Vigade eelkontroll ja järeltöötlus • Eelkontroll • translaator • tüübikindlus • nime tõstutundlikkus • deklareerimisnõue • ... • Parameetrite ülekontrollimine (InLine) • Järeltöötlus • Vigade kinnipüüdmine, veateated, täpsustused
DISKUSSIOON KUS TULEKS ANDMEID KONTROLLIDA? KAS KÕIKI VÕIMALIKKE VIGU SAAB EELKONTROLLIDA?
InLine veatöötlus • Iga parameetrit kontrollitakse hoolega, enne kui temaga midagi tegema hakatakse if (parameeteronõige) {teemekasulikku} else {teatameveast} while teemidagi(...) ; return (kuidasõnnestus); • Keegi ei jõua kõike läbi kontrollida
Struktuurne veatöötlus • Mõisted: • try – proovi, plokk, milles toimuvat me kontrollime • catch – püüa, plokk, mis saab juhtimise tõrke korral • finally – peale segadust, plokk mis tuleb täita igal juhul • throw – anna teada, koht kus öeldakse, et asi on p...s
Veatöötlus eri keeltes • VB-s (vana) ON ERROR GoTo kuhugi • C-s • süsteemsed plokinimed • __try __catch __finally • C++ ja C# • struktuur • try { } catch(...) { } finally { }
Veatöötlus on korruseline ehitus • {...; • funktsioon1( ... ); • ...;} • void funktsioon( ... ) • {...; • funktsioon2( ... ); • ...;}
Veatöötluskorrused plaanitud viga ootamatu viga F3 try F3 catch F3 finally F2 try F2 catch F2 finally F1 try F1 catch F1 finally
Milleks finally • C ja C++ algselt seda võimalust ette ei näe • tegemist on MS spetsiifilise lisandiga Sõltumata sellest, kas pruut ütleb altari ees jah või ei, tuleb peigmehe vanematel see nali kinni maksta • finally – toakoristuskood!
Finally • C++ - süsteemne märgend • C# struktuurielement
C# - keeles on veel mõned vigurid • Checked ja unchecked kood • checked (avaldis) • checked blokk • unchecked (avaldis) • unchecked blokk
throw ja catch ja veatüüp • catch(T muutuja) { ... } • blokk täidetakse, kui toimus T-tüüpi viga • T muutuja; ... ; throw muutuja; • kutsutakse esile T-tüüpi viga • T on mingi tüüp (int, char, misiganes) • on süsteemsed veatüübid
milline catch-blokk täidetakse • Samad reeglid mis overloaditud funktsioonidel • leitakse eismene sellele tüübile (klassile) sobiv catch-blokk • kui ei ole, siis selle baastüübile sobiv jne kuni • catch(...) või catch(System.Exception x) • ja kui ikka ei ole, siis järgmisele korrusele • ja kõige alumine korrus on süsteem (Dr. Watson)
C# keeles - veatüübid • tuletatud klassist System.Exception • System.SystemException • ... vt tuletatud klassid • Igas namespaces vt sealsed exceptionid
EXCEPTION • Exception = erand • Veatöötlus = reegel
Järgmine kord – (või harjutustunnis) • käime läbi silumisvahendid • transleerimisviisid (checked, unchecked) • räägime trace ja debug klassidest (C#)