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 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#)