pripremni materijal za kolokvijum
TRANSCRIPT
UNIVERZITET U NOVOM SADU TEHNIĈKI FAKULTET „MIHAJLO PUPIN― ZRENJANIN PROGRAMSKI PREVODIOCI DOC. DR LJUBICA KAZI Šk. 2019/20
PRIPREMNI MATERIJAL ZA KOLOKVIJUM
Kategorizacija grešaka programskog koda
Greške u odnosu prema procesu kompajliranja: 1. Logičke greške – nezavisne od procesa kompajliranja ili izvršavanja, Program ne daje oĉekivan izlaz jer
kod nije napisan u skladu sa specifikacijom zahteva. Ovu vrstu greške kompajler ne može da detektuje. 2. Greške u toku kompajliranja (compile-time errors):
a) Leksiĉke greške – nedozvoljeni simbol ili oblik reĉi (reĉ nije moguće prepoznati, tj. tokenizovati – klasifikovati i zameniti tokenom).
PRIMERI: nije moguće prepoznati naredbu ili atribut neke klase, jer takav ne postoji (kucaĉka greška).
b) Sintaksne greške – nepravilna konstrukcija reĉenica, nedostaje neki element reĉenice. Reĉenica nije napisana u skladu sa sintaksnim pravilima.
1.1. PRIMERI: nedostaje ; na kraju reĉenice, prilikom navoĊenja atributa stavlja se () a ne treba, kod poziva metode zaboravljen (), u okviru izraza zaboravljena zatvorena zagrada, u okviru blokova zaboravljena { ili } itd....
c) Semantiĉke greške – kompajler ulazi u tumaĉenje znaĉenja programskog koda, uporeĊujući delove šireg programskog koda aplikacije i vezanih biblioteka klasa. Proverava generalnu usklaĊenost i potpunost. U okviru compile-time mogu se detektovati statiĉke semantiĉke greške.
PRIMERI: Greške ovog tipa su vezane za tipove podataka, deklaraciju promenljivih, primenu operatora, parametre poziva procedura. Npr. promenljiva nije deklarisana, a koristi se. Objekat nije instanciran. Promenljiva je deklarisana, a nije korišćena. U using delu nije navedena potrebna biblioteka, a koristi se klasa iz te biblioteke. Procedura ima manje ili više parametara nego što je potrebno, tipovi podataka parametara ne odgovaraju. Primena operatora nad tipovima podataka koji ne odgovaraju, udruživanje promenljivih u operatorima neadekvatnih tipova. Promenljiva je deklarisana unutar bloka i izvan njega je nevidljiva i ne može se koristiti, a pozvana je...itd.
d) Greške u toku izvršavanja aplikacije (run-time errors): PRIMERI: 2.1. Nedefinisano stanje programa u odnosu na unete podatke u toku korišćenja aplikacije – rešava se
validacijama, tj. delom koda kojim se proveravaju očekivane tj. moguće greške korisnika i adekvatno reaguje ukoliko nastupe. 2.2. Nedostaje ili je neispravna prateća biblioteka klasa od koje osnovna aplikacija zavisi.
2.3. Dinamičke semantičke greške – često se dešava da se tek prilikom izvršavanja aplikacije dinamički spajaju moduli u jednu celinu i tek tada se mogu, u kombinaciji sa podacima, desiti greške. TakoĎe, dinamičke semantičke greške nastaju prilikom primene aplikacije nad podacima kada nisu
validacijama sprečene situacije neispravnog unosa. 2.4. Logičke greške – kompajler ih ne može detektovati, već su vidljive putem inspekcije koda (statičko white box testiranje) ili prilikom pokretanja (black box testiranje), kada kod ne daje očekivani izlaz. Razlog je što kod nije napisan u skladu sa specifikacijom zahteva.
2.5. Greške eksternih podataka – problem u ispravnosti i dostupnosti eksternih izvora podataka (datoteka, baza podataka) 1) ne postoji data putanja, mreža ne funkcioniše a zahtevaju se podaci iz
lokalne mreže, internet ne funkcioniše a zahtevaju se podaci primenom nekog URL, nepostojeći ili
nefunkcionalan URL, nepostojeća datoteka sa tim imenom, 2) neispravan SQL upit- ukazuje na nepostojeću bazu podataka, tabelu, polje i sl.
Primeri grešaka i poruka o greškama C# Neki od primera grešaka prema ranije navedenim kategorijama: Logiĉka greška
Public int Saberi (int a, int b) { return a - b ; }
Leksiĉka greška
int i =ч9; simbol ч se ne koristi intz i=9; intz ne može biti prepoznat kao validna kljuĉna-službena reĉ C# jezika
Sintaksna greška
int i=9 nedostaje ; na kraju reda
Statiĉka semantiĉka greška 1. primer
int i=3; promenljiva j nije prethodno deklarisana i=j+2*i;
2. primer int i=3; ne mogu se sabirati string i broj bez prethodnog type casting string j=―pozdrav‖; i=j+2*i;
Dinamiĉka semantiĉka greška: a=b/c za c je uneta vrednost 0, pa će biti generisana greška „Division by ZERO―.
Tipična run-time greška:
SQL upit u kojem se navodi naziv baze podataka, tabele ili polja koje ne postoji, odnosno
komanda samog SQL jezika koja ne može biti prepoznata. Tumačenje SQL naredbe u smislu
sintaksne ispravnosti se vrši tek kada sam SQL upit stigne do DBMS, a ne na nivou aplikacije.
Kompajler ove greške ne može da detektuje.
JOŠ JEDAN PRIMER:
PRIMER SA GREŠKOM KOREKTAN PRIMER
Xf (Textbox1.Text { a=b+c; }
IF (Textbox1.Text.Length>0) { a=b+c; }
U ovom primeru: Leksiĉka greška – Xf nije validna reĉ za uslov Sintaksna greška – nije zatvorena zagrada oko uslova Semantiĉka greška – uslov mora imati bool vrednost, ne može biti string
Lista grešaka koje prijavljuje kompajler C# jezika
Kompletna lista grešaka i upozorenja za C# programski jezik koje prijavljuje Visual Studio NET C#kompajler može se pogledati sa veb stranice: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/ Deo navedenih grešaka i odgovarajućih poruka dat je u nastavku:
Kod greške
TEKST PORUKE C# KOMPAJLERA
OBJAŠNJENJE KRATKO OBJAŠNJENJE NA SRPSKOM
PRIMER KODA KOJI GENERISE GRESKU
CS0006
Metadata file 'dll_name' could not be found
The program was compiled and explicitly passed the name of a file that contained metadata; however, the .dll was not found.
Ako je dll povezan sa aplikacijom i upisano je u meta podacima da se koristi, a ne postoji
CS0007 Unexpected common language runtime initialization error — 'description'
This error occurs if the runtime could not be loaded. This could occur if the version of the common language runtime that the compiler attempts to load is not present on the machine, or if the common language runtime installation or configuration is corrupt.
Ako se pokretanje aplikacije izvrši na raĉunaru koji nema sve potrebne standardne biblioteke (nema instalirano razvojno okruženje iste verzije ili barem jezgro biblioteka koje su potrebne za tu verziju aplikacije).
CS0015 The name of type 'type' is too long
The fully qualified name of a user-defined type must have fewer than 1024 characters, including the periods.
Naziv namespace, klase, metoda, atributa, promenljivih ne može biti veći od 1024 karaktera.
CS0016
Could not write to output file 'file' — 'reason'
The compiler could not write to an output file. Check the path to the file to make sure it exists. If a previously built file is already at the location, make sure it is writeable, and that no process currently has a lock on the file. For example, make sure your executable is not running when you attempt to build.
Putanja i fajl za izlaz (snimanje) ne postoji.
CS0019 Operator 'operator' cannot be applied to operands of type 'type' and 'type'
A binary operator is applied to data types that do not support it. For example, you cannot use the || operator on strings, you cannot use +, -, <, or > operators on bool variables, and you cannot use the == operator with a struct type unless the type explicitly overloads that operator.
Nije moguće primeniti operaciju nad promenljivama koje su takvog tipa da se nad njima ne može izvršiti operacija.
int i = 1; // You cannot compare an integer and a boolean value. if (i == true) //CS0019
CS0029
Cannot implicitly convert type 'type' to 'type'
Conversions must occur when assigning a variable of one type to a variable of a different type. When making an assignment between variables of different types, the compiler must convert the type on the right-hand side of the assignment operator to the type on the left-hand side of the assignment operator. he compiler requires an explicit conversion. For example, you may need to cast.
Potrebna je konverzija tipova podataka. Postoje eksplicitne konverzije i implicitne (kada se ne naglašava i ne daje konkretna naredba, već se konverzija podrazumeva automatski.
PRIMER GREŠKE: int i = 50; long lng = 100; i = lng; i = lng; Before making the assignment the compiler is implicitly converting the variable lng, which is of type long, to an int. This is implicit because no code explicitly instructed the compiler to perform this conversion. The problem with this code is that compiler does not allow implicit narrowing conversions because there could be a potential loss of data. We know that implicit narrowing conversions are not allowed, so to be able to compile this code we need to explicitly convert the data type. Explicit conversions are done using casting. Casting is the term used in C# to describe converting one data type to another.
ISPRAVNO: int i = 50; long lng = 100; i = (int) lng; // Cast to int.
CS0050 Inconsistent accessibility: return type 'type' is less accessible than method 'method'
The return type and each of the types referenced in the formal parameter list of a method must be at least as accessible as the method itself.
Primena objekta klase koja nije public.
PRIMER SA GREŠKOM: class MyClass // Accessibility defaults to private. // Try the following line instead. // public class MyClass { } // deo koji generiše grešku: return new MyClass();
CS0051 Inconsistent accessibility:
parameter type 'type' is less accessible than
method 'method'
The return type and each of the types referenced in the formal parameter list of a method must be at least as accessible as the method itself.
Parametar je poziv objekta klase, a klasa nije public
PRIMER SA GREŠKOM: class B // PODRAZUMEVA SE PRIVATE { } // ovaj deo generise gresku public static void F(B b) // CS0051 { }
CS0052
Inconsistent accessibility: field type 'type' is less accessible
than field 'field'
The type of a field cannot be less accessible than the field itself because all public constructs must return a publicly accessible object.
Ako je atribut jedne klase objekat druge klase, a ta klasa je po svojoj definiciji privatna, nastaje greska.
PRIMER SA GRESKOM: public class MyClass2 { // The following line causes an error because the field, M, is declared // as public, but the type, MyClass, is private. Therefore the type is // less accessible than the field. public MyClass M; // CS0052 private class MyClass { }
CS0103
The name 'identifier' does not exist in the
current context
An attempt was made to use a name that does not exist in the class, namespace, or scope. Check the spelling of the name to make sure that the name that you are trying to use is available.
Koristimo naziv promenljive, objekta, atributa klase i slicno, a ranije nije definisan pod tim imenom, tj. ne postoji takav.
1. PRIMER GRESKE: Int a=0; C=a+b; GRESKA je jer c I b nisu deklarisani ranije kao promenljive.
2. PRIMER OBLAST DEFINISANJA: Int a=5; For (int i=0; i<a; i++) { Int c=a+i; } MessageBox.Show(―Vrednost c je:‖ + c.ToString()); Posto je c deklarisan unutar bloka for, izvan viticastih zagrada nije vidljiva I u message box-u se ne moze ocitati. Resenje: Izbaciti Int c izvan for ciklusa da bi bilo vidljivo u celom kodu.
CS0116
A namespace cannot directly contain
members such as fields or methods.
A namespace can contain other namespaces, structs, and classes.
U okviru NAMESPACE ne mogu da se postave promenljive niti procedure. Mogu biti postavljene klase.
PRIMER GRESKE: namespace x {
Atributi i metode mogu pripadati klasi i tek u okviru klase....
// A namespace can be placed within another namespace. using System; // These variables trigger the CS0116 error as they are declared outside of a struct or class. public int latitude; public int longitude; Coordinate coord; // Auto-properties also fall under the definition of this rule. public string LocationName { get; set; } // This method as well: if it isn't in a class or a struct, it's violating CS0116. public void DisplayLatitude() { Console.WriteLine($"Lat: {latitude}"); }
CS0120
An object reference is required for the nonstatic field,
method, or property 'member'
In order to use a non-static field, method, or property, you must first create an object instance.
Korišćenje atributa i metoda klase bez prethodnog poziva konstruktora. Znaĉi, ako ja klasa obiĉna (nije statiĉka), onda mora biti instancirana, tj. Pozvan konstruktor i kreiran objekat.
Primer greske: Public class Klasa { Public int i=0; Public int Funkcija() { Return i; } } Prilikom koriscenja nastaje greska: i=10; int b=Funkcija(); RESENJE KOD KORISCENJA: Klasa objKlasa = new Klasa(); int b=objKlasa.Funkcija(); DRUGI NACIN / primena statickih klasa: Public static class Klasa { Public static int i=0; Public static int Funkcija() { Return i; } } PRILIKOM KORIŠĆENJA STATIĈKIH KLASA NAVODI SE NAZIV KLASE I NE PRAVI SE OBJEKAT: int b=Klasa.Funkcija();
CS0122
'member' is inaccessible due to its
protection level
The access modifier for a class member prevents accessing the member.
Pokusaj pristupu privatnom atributu ili metodi.
PRIMER GRESKE: public class MyClass { // Make public to resolve CS0122. void MyMethod() { } } public class MyClass2 { public static int Main() {
var a = new MyClass(); // MyMethod is private. a.MyMethod(); // CS0122
CS0163
Control cannot fall through from one
case label ('label') to another
When a switch statement contains more than one switch section, you must explicitly terminate each section, including the last one, by using one of the following keywords:
return
goto
break
throw
continue
Svaki pojedinacni slucaj u okviru CASE strukture mora da se završi odgovarajućom naredbom, npr. Break, a ne da se kod nastavi u okviru narednog sluĉaja.
PRIMER SA GREŠKOM: switch (i) // CS0163 { // Compiler error CS0163 is reported on the following line. case 1: i++; // To resolve the error, uncomment one of the following example statements. // return; // break; // goto case 3; case 2: i++; return;
CS0165
Use of unassigned local variable 'name'
The C# compiler doesn't allow the use of uninitialized variables. If the compiler detects the use of a variable that might not have been initialized, it generates compiler error.
Korišćenje vrednosti promenljivih, a da prethodno nisu barem inicijalizovane na poĉetnu vrednost.
PRIMER GRESKE: int i, j; // Because i might not have been initialized, the following // line causes CS0165. j = i; rešenje: Uvek kada se deklariše promenljiva (odredi ime i tip) treba postaviti poĉetnu vrednost. int i=0; int j =0; ovo je sada u redu: j = i;
CS0178
Invalid rank specifier: expected ',' or ']'
An array initialization was ill-formed. For example, when specifying the array dimensions, you can specify the following:
A number in brackets
Empty brackets
A comma enclosed in brackets
Nepravilno referenciranje na element niza. Potrebno je koristiti uglaste zagrade...
PRIMER GRESKE: int a = new int[5][,][][5; // CS0178
CS0201
Only assignment, call, increment, decrement,
and new object expressions can be
used as a statement
The compiler generates an error when it encounters an invalid statement. An invalid statement is any line or series of lines ending in a semicolon that does not represent an assignment (=), method call (), new, -- or ++ operation.
Pisanje izraza bez znaka dodele, poziva funkcije, konstruktora ili ++ ...
Nepravilno: 2 * 3; // CS0201 Pravilno: a=2*3;
CS0234
The type or namespace name
'name' does not exist in the namespace
'namespace' (are you missing an assembly
reference?)
If you see this error after moving code from one development machine to another, make sure that the project on the new machine has the correct references, and that the versions of the assemblies are the same as on the old machine.
Primena nekog atributa ili klase koja ne postoji u navedenoj aplikaciji i pratećim dodatim ili standardnim bibliotekama.
PRIMER SA GRESKOM: System.DateTime x = new System.DateTim(); // CS0234 // try the following line instead // System.DateTime x = new System.DateTime();
CS0246
The type or namespace name 'type/namespace'
could not be found (are you missing a
using directive or an assembly reference?)
A type or namespace that is used in the program was not found. You might have forgotten to reference (-reference) the assembly that contains the type, or you might not have added the required using directive. Or, there might be an issue with the assembly you are trying to reference.
Moguće da je zaboravljeno da se stavi USING na odgovarajuću biblioteku koja je izvor klasa koje koristimo. Moguće je da koristimo klasu iz verzije frameworka koja u ovoj verziji aplikacije ne postoji – npr. Radimo u ranijoj verziji, a u novijoj verziji frameworka je podržano (mi trenutno nemamo na raĉunaru tu noviju verziju).
PRIMER GREŠKE: DataSet dsPodaci=new DataSet(); RESENJE: Using System.Data; … DataSet dsPodaci=new DataSet(); ILI:
System.Data.DataSet dsPodaci= new System.Data.DataSet();
CS0266
Cannot implicitly convert type 'type1' to
'type2'. An explicit conversion exists (are
you missing a cast?)
This error occurs when your code tries to convert between two types that cannot be implicitly converted, but where an explicit conversion is available.
Nije moguce automatski, implicitno izvrsiti konverziju tipova podataka i prebaciti jednu vrednost u drugu, ali postoji nacin za eksplicitnu konverziju, tj. Type casting.
PRIMER GRESKE: // You cannot implicitly convert a double to an integer. double d = 3.2; // The following line causes compiler error CS0266. int i1 = d; // However, you can resolve the error by using an explicit conversion. int i2 = (int)d;
CS0270
Array size cannot be specified in a variable
declaration (try initializing with a 'new'
expression)
his error occurs when a size is specified as part of an array declaration.
Definisanje velicine niza na pogresan nacin.
PRIMER GRESKE: int[10] a; // CS0270 // To resolve, use the following line instead: // int[] a = new int[10];
CS0433
The type TypeName1 exists in both
TypeName2 and TypeName3
Two different assemblies referenced in your application contain the same namespace and type, which produces ambiguity.
Dva dll fajla koja se koriste imaju istoimeni namespace i klase...
CS0446
Foreach cannot operate on a 'Method or Delegate'. Did you intend to invoke the
'Method or Delegate'?
This error is caused by specifying a method without parentheses or an anonymous method without parentheses in the part of the foreach statement where you would normally put a collection class. Note that it is valid, though unusual, to put a method call in that location, if the method returns a collection class.
Foreach naredba se pise tako sto se navodi element i kolekcija, a ne poziv metode. Jedino se moze pozvati metoda ako vraca kolekciju.
PRIMER GRESKE: static void M() { } … int[] intArray = new int[5]; foreach (int i in M) { } // CS0446 ISPRAVNO: foreach (int i in intArray) { }
CS0504
The constant 'variable' cannot be marked
static
If a variable is const, it is also static. If you want a const and static variable, just declare that variable as const; if all you want is a static variable, just mark it static.
Koristiti ili const ili static ako zelimo konstantu.
PRIMER GRESKE: static const int i = 0; // CS0504, cannot be both static and const
CS1001
Identifier expected.
Lista će biti dopunjena.
PRIMER URAĐENIH ZADATAKA ZA KOLOKVIJUM NA RAČUNARU 1. PRIMER U nastavku je dat primer zadatka gde je zastupljena po jedna greška za svaki tip – leksiĉka, sintaksna i semantiĉka. ZADATAK: Data je desktop aplikacija sledećeg izgleda, spisak grešaka i sam programski kod. Izdvojiti: deo koda sa greškom, poruku kompajlera, objašnjenje greške, popravku greške. MATERIJAL ZA ANALIZU:
Spisak grešaka koje prijavljuje kompajler (debugger) nakon prvog pokretanja Build opcije:
Nakon popravke te jedne greške i ponovnog build dobija se sledeći spisak grešaka:
Nakon ponovnog kreiranja greške, a pre ponovnog build:
Programski kod sa greškama: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; // using SqlDBUtils; namespace DesktopApp_KorisnickiInterfejs { public partial class frmNarucivanje : Form { // atributi //private clsSqlKonekcija objSqlKonekcija; private clsSqlTabela objSqlTabela; private DataSet dsNarucivanje; // METODE // konstruktor public frmNarucivanje() { InitializeComponent(); } // nase metode private DataSet DajSveNarudzbe() { // dsNarucivanje je globalna promenljiva na nivou ove forme i dobija vrednost ovde dsNarucivanje = objSqlTabela.DajPodatke("Select * from Narudzba"); return dsNarucivanje; } private DataSet DajNarudzbePremaRobi(string robaFilter) { // dsNarucivanje je globalna promenljiva na nivou ove forme i dobija vrednost ovde dsNarucivanje = objSqlTabela.DajPodatke("Select * from Narudzba where Proizvod='" + robaFilter + "'"); return dsNarucivanje; // nema potrebe da bude return, jer se salje vrednost u globalnu promenljivu koja je vidljiva svuda } private void NapuniGrid(DataSet dsPodaciZaGrid) { dgvSpisakRobe.DataSource = dsPodaciZaGrid.Tables[0]; dgvSpisakRobe.Refresh(); } private void IsprazniKontrole() { txbKorisnikIme.Text = ""; txbKorisnikAdresa.Text= ""; txbProizvod.Text= ""; txbKolicina.Text= "";
txbCena.Text = ""; } // dogadjaji private void frmNarucivanje_Load(object sender, EventArgs e) { // inicijalizacija globalnih promenljivih na nivou stranice // 1.otvaranje konekcije objSqlKonekcija = new clsSqlKonekcija("DESKTOP-U5822NP\\MSSQL2008", "", "PP2020_Narucivanje"); objSqlKonekcija.OtvoriKonekciju(); objSqlTabela = new clsSqlTabela(objSqlKonekcija, "Narudzba"); dsNarucivanje = new DataSet(); } private void btnSvi_Click(object sender, EventArgs e) { txbFilterNazivRobe.Text = ""; NapuniGrid(DajSveNarudzbe()); } private void btnFilter_Click(object sender, EventArgs e) { if (txbFilterNazivRobe.Text.Equals("")) { MessageBox.Show("Niste uneli kriterijum filtriranja!"); txbFilterNazivRobe.Focus(); return; } else { NapuniGrid(DajNarudzbePremaRobi(txbFilterNazivRobe.Text)); } } private void btnSnimi_Click(object sender, EventArgs e) { // provera popunjenosti if (txbKorisnikIme.Txt.Equals("")) { MessageBox.Show("Niste uneli ime korisnika!"); txbKorisnikIme.Focus(); return; if (txbKorisnikAdresa.Text.Equals("")) { MessageBox.Show("Niste uneli adresu korisnika!"); txbKorisnikAdresa.Focus(); return; } if (txbProizvod.Text.Equals("")) { MessageBox.Show("Niste uneli proizvod!"); txbProizvod.Focus(); return; } if (txbKolicina.Text.Equals("izaberite")) { MessageBox.Show("Niste uneli kolicinu!"); txbKolicina.Focus(); return; } if (txbCena.Text.Equals("")) { MessageBox.Show("Niste uneli cenu!"); txbCena.Focus(); return; }
// provera ispravnosti podataka // ****************snimanje podataka try { objSqlKonekcija.OtvoriKonekciju(); // ubaceno da se proveri parcijalni rezultat potreban za kasnije //MessageBox.Show("Uspesna konekcija!"); } catch (Exception greska) { MessageBox.Show("Greska konekcije:" + greska.Message); return; } // 2.preuzimanje podataka sa KI string korisnikIme = txbKorisnikIme.Text; string korisnikAdresa = txbKorisnikAdresa.Text; string proizvod = txbProizvod.Text; string kolicina= txbKolicina.Text; string cena = txbCena.Text; DateTime datumIsporuke = dtpDatumIsporuke.Value; // 3. transformacija ulazne vrednosti string strDatumIsporuke = datumIsporuke.Month.ToString() + "/" + datumIsporuke.Day.ToString() + "/" + datumIsporuke.Year.ToString(); // 4. priprema SQL upita tipa insert string sqlInsertUpit = "INSERT INTO Narudzba VALUES('" + korisnikIme + "', '" + korisnikAdresa + "','" + proizvod + "'," + kolicina + "," + cena + ",'" + strDatumIsporuke + "')"; // ubaceno da se proveri parcijalni rezultat potreban za kasnije //MessageBox.Show("Upit:" + sqlInsertUpit); // 5. izvrsavanje SQL upita tipa insert bool uspehSnimanja=false; try { uspehSnimanja = objSqlTabela.IzvrsiAzuriranje(sqlInsertUpit); MessageBox.Show("USPESNO SNIMLJENI PODACI!"); NapuniGrid(DajSveNarudzbe()); IsprazniKontrole(); } catch (Exception greska) { MessageBox.Show("Greska snimanja novog zapisa:" + greska.Message); return; } } private void btnOdustani_Click(object sender, EventArgs e) { IsprazniKontrole(); } private void btnExportXML_Click(object sender, EventArgs e) { dsNarucivanje.WriteXml("SpisakNarudzbi.XML"); MessageBox.Show("Uspesno snimljen spisak narudzbi u XML!"); } } }
REŠENJE: IZVEŠTAJ O ANALIZI I KOREKCIJI GREŠAKA PROGRAMSKOG KODA
Deo koda sa
greškom
Tip greške
(leksička, sintaksna,
semantička)
Poruka debuggera Objašenjenje Popravka greške
txtKorisnikIme.Txt Leksička System.Windows.Forms.TextBox does not contain definition for
Txt …
Ne postoji osobina Txt
txtKorisnikIme.Text
Deo koda sa greškom Tip greške
(leksička, sintaksna,
semantička
)
Poruka
debuggera
Objašnjenj
e
Popravka greške
if (txbKorisnikIme.Text.Equals("")) { MessageBox.Show("Niste uneli ime korisnika!"); txbKorisnikIme.Focus(); return;
Sintaksna }
expected
Nije
zatvorena
vitičasta zagrada
if (txbKorisnikIme.Text.Equals("")) { MessageBox.Show("Niste uneli ime korisnika!"); txbKorisnikIme.Focus(); return;
}
Deo koda sa greškom
Tip greške (leksička,
sintaksna, semantička)
Poruka debuggera
Objašenjenje Popravka greške
//private clsSqlKonekcija objSqlKonekcija;
Semanticka The name
'objSqlKonekcija' does not exist in
the current context
objSqlKonekcija je
postavljeno u komentar,
a kasnije se koristi u
kodu.
private clsSqlKonekcija objSqlKonekcija;
2. PRIMER
ZADATAK Dat je programski kod sa greškama leksičkog, sintaksnog i semantičkog tipa, objektno-orjentisana desktop aplikacija uz primenu biblioteka klasa.
Izgled korisnickog interfejsa aplikacije sa greskama:
Izgled Error liste nakon build:
Realizovati:
1. Pokrenuti opciju sa menija Build, Build Solution. 2. Izvršiti analizu izgleda programskog koda (posebnim bojama podvučen tekst), kao i pokretanje
debuggera radi detektovanja grešaka. 3. Pregledati listu gresaka ErrorList u dnu ekrana.
4. Na spisku gresaka su greske koje je detektovao debugger. 5. Napisati izveštaj: greška(deo koda), tip greške, poruka debuggera (kopirati tekst greške iz error list
– desni taster copy), objašnjenje greške
6. Klikom na grešku u okviru Error list pozicionirate se na lokaciju greške i možete je ispraviti. Dopuniti izveštaj ispravkom greške.
7. Nakon popravke greške uraditi svaki put Build-Build Solution. 8. Dodati 2 PrintScreena (“Print screen” na tastaturi , pa CTRL+V) za svaku gresku: 1) ekrana
razvojnog okruženja sa programskim kodom, nakon pokretanja debuggera sa njegovim porukama o greskama 2) ekrana razvojnog okruženja sa programskim kodom, nakon pokretanja debuggera i
popravke greške. 9. Na kraju dodati Print screen razvojnog okruzenja za uspesan build cele aplikacije.
IZVEŠTAJ ZA SVAKU GRESKU (6 bodova):
Deo koda sa Tip greške Poruka debuggera Objašenjenje Popravka greške
greškom (leksička, sintaksna,
semantička)
(1 bod) (1 bod) (2 boda)
Izgled razvojnog okruženja (“Print screen” na tastaturi , pa CTRL+V) kada je detektovana greska: (1 bod)
Izgled razvojnog okruženja (“Print screen” na tastaturi , pa CTRL+V) kada je korigovana greska.
(1 bod)
FINALNI IZVEŠTAJ NAKON SVIH POPRAVKI (poslednji build nakon svih popravki je ovaj ekran, dakle identičan Print screen poslednje popravke):
Izgled razvojnog okruženja (“Print screen” na tastaturi, pa CTRL+V) kada su korigovane sve greske i
uradjen uspesan build.
REŠENJE:
1. Analiza i korekcija grešaka
IZVEŠTAJ GREŠKA BR 1:
Deo koda sa
greškom
Tip greške
(leksička, sintaksna,
semantička)
Poruka debuggera Objašenjenje Popravka greške
objNarucivanje = new clsNarucivanje()
sintaksna ; expected Nedostaje ; na kraju
reda
objNarucivanje = new clsNarucivanje();
Izgled razvojnog okruženja kada je detektovana greska:
Izgled razvojnog okruženja kada se selektuje (klikne) na grešku: (Napomena: OVO BI BILO PRECIZNIJI ODGOVOR)
Izgled razvojnog okruženja kada je korigovana greska:
Napomena: Na drugoj slici se uvek vidi selektovan deo koda koji je korigovan.
IZVEŠTAJ GREŠKA BR 2:
Deo koda sa greškom
Tip greške
(leksička, sintaksna
, semantič
ka)
Poruka debuggera Objašenjenje
Popravka greške
dgvSpisakRobe.DataSrc = dsPodaciZaGrid.Tables[0];
Leksička 'System.Windows.Forms.DataGridView' does not contain a
definition for 'DataSrc' and no
extension method 'DataSrc' accepting a first argument of
type 'System.Windows.Forms.DataG
ridView' could be found (are you missing a using directive
or an assembly reference?)
DataSrc je nepostoje
ća reč, tj.
atribut klase data
grid
dgvSpisakRobe.DataSource = dsPodaciZaGrid.Tables[0];
Izgled razvojnog okruženja kada je detektovana greska:
NAPOMENA: Ovaj ekran je svaki put isti kao i 2. ekran za prethodnu grešku, tj. status nakon korekcije
prethodne greške.
Izgled razvojnog okruženja kada se selektuje (klikne) na grešku – precizniji odgovor:
Izgled razvojnog okruženja kada je korigovana greska:
IZVEŠTAJ GREŠKA BR 3:
Deo koda sa
greškom
Tip greške
(leksička, sintaksna,
semantička)
Poruka debuggera Objašenjenje Popravka greške
txbKorisnikIme.Text = 0;
semantička Cannot implicitly convert type 'int' to
'string'
Ne može se atributi text
koji je tipa
string dodeliti
numerička vrednost
txbKorisnikIme.Text = "";
Izgled razvojnog okruženja kada je detektovana greska:
Izgled razvojnog okruženja kada se selektuje (klikne) na grešku – precizniji odgovor:
Izgled razvojnog okruženja kada je korigovana greska:
IZVEŠTAJ GREŠKA BR 4:
Deo koda sa greškom Tip greške (leksička,
sintaksna, semantička
)
Poruka debuggera Objašenjenje
Popravka greške
NapuniGrid(objNarucivanjeDB.DajNarudzbePremaRobi(txbFilterNazivRobe.Text), false);
semantička No overload for method
'NapuniGrid' takes
2 arguments
Metoda NapuniGrid
nema 2
parametra, vec samo 1
NapuniGrid(objNarucivanjeDB.DajNarudzbePremaRobi(txbFilterNazivRobe.Text));
Izgled razvojnog okruženja kada je detektovana greska:
Izgled razvojnog okruženja kada se selektuje (klikne) na grešku – precizniji odgovor:
Izgled razvojnog okruženja kada je korigovana greska:
IZVEŠTAJ GREŠKA BR 5:
Deo koda sa
greškom
Tip greške
(leksička, sintaksna,
semantička)
Poruka debuggera Objašenjenje Popravka greške
txbKolicina.Focus;
sintaksna Only assignment, call,
increment, decrement,
and new object
expressions can be used as a statement
Nedostaju zagrade oko
metode
Focus
txbKolicina.Focus();
Izgled razvojnog okruženja kada je detektovana greska:
Izgled razvojnog okruženja kada se selektuje (klikne) na grešku – precizniji odgovor:
Izgled razvojnog okruženja kada je korigovana greska:
2. Prikaz ispravnog rada aplikacije – Finalni build
NAPOMENA: Obratiti pažnju da dole levo treba da piše: BUILD SUCEEDED i da piše Errors 0.
PRIMERI ZADATAKA ZA KOLOKVIJUM NA PAPIRU
1. TIP ZADATKA (4 poena) – Dat je izgled korisniĉkog interfejsa i programski kod. Detektovati delove koda sa greškama (1), odrediti vrstu greške (leksiĉka, sintaksna, semantiĉka, run-time) (1), objasniti problem (1) i ispraviti greške (1).
2. TIP ZADATKA (3 poena) - Dat je izgled korisniĉkog interfejsa i programski kod. Dat je kompletan Error list sa spiskom detektovanih grešaka od strane kompajlera. Odrediti vrstu greške (leksiĉka, sintaksna, semantiĉka, run-time) (1), objasniti problem (1) i ispraviti greške (1). 3. TIP ZADATKA
(3 poena) - Dat je ispravan segment koda. Napraviti namerne greške tako da bude jedna leksiĉka (1), jedna sintaksna (1) i jedna semantiĉka (1) greška. Napisati segment koda koji ukljuĉuje te greške. 4. TIP ZADATKA
(4 poena) – Dat je segment programskog koda sa greškama. Odrediti deo segmenta sa greškom (1), vrstu greške (leksiĉka, sintaksna, semantiĉka, run-time) (1), objasniti problem (1) i ispraviti greške (1).
5. TIP ZADATKA Dat je segment programskog koda sa konkretnom jednom vrstom greške (leksiĉka, sintaksna, semantiĉka, run-time) koja je navedena. Detektovati delove koda sa greškama (1), objasniti problem (1) i ispraviti greške (1).
1. TIP ZADATKA (4 poena) – Dat je izgled korisniĉkog interfejsa i programski kod. Detektovati delove koda sa greškama (1), odrediti vrstu greške (leksiĉka, sintaksna, semantiĉka, run-time) (1), objasniti problem (1) i ispraviti greške (1).
(Primer aplikacije: DesktopNa3Nacina – stranica za rad sa SQLDBUtils)
KOD SA GREŠKAMA
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; // using System.Data; using SqlDBUtils; namespace KorisnickiInterfejs { public partial class frmSaSopstvenomBibliotekomDBUtils : Form { // ------------ ATRIBUTI // ################################################# private DataTable podaciTabelarni; // ------------ METODE // ################################################# // -----------------NASE PROCEDURE private void IsprazniKontrole() { txtOznaka.Text = 0; txtNaziv.Text = ""; } private void AktivirajKontrole() { txtOznaka.Enabled = not true;
txtNaziv.Enabled = true; } private void DeaktivirajKontrole() { txtOznaka.Enabled = false; txtNaziv.Enabled = false; } private int SnimiPodatke() { int brojslogova = 0; // preuzimanje iz korisnickog interfejsa // radi preglednosti koda postavljamo promenljive string Oznaka = txtOznaka.Text; string Naziv = txtNaziv.Text; string UkupnoMesta = "0"; clsSqlKonekcija objKonekcija = new clsSqlKonekcija(Parametri.stringKonekcije); objKonekcija.OtvoriKonekciju(); clsSqlTabela objTabela = new clsSqlTabela(objKonekcija, "Drzava"); string SQLNaredba = "Insert into Drzava (Oznaka, Naziv, UkupnoMesta) Values ('" + Oznaka + "', '" + Naziv + "'," + UkupnoMesta + ")"; bool uspeh = objTabela.IzvrsiAzuriranje(SQLNaredba); if (uspeh) { brojslogova = ""; } else { brojslogova = Ž; } objKonekcija.ZatvoriKonekciju(); return brojslogova; } private DataTable UcitajSve() { DataTable TabelaPodataka = new DataTable(); clsSqlKonekcija objKonekcija = new clsSqlKonekcija(Parametri.stringKonekcije); objKonekcija.OtvoriKonekciju(); clsSqlTabela objTabela = new clsSqlTabela(objKonekcija, "Drzava"); string SQLNaredba = "select * from Drzava"; DataSet dsPodaci = objTabela.DajPodatke(SQLNaredba); TabelaPodataka = dsPodaci.Tables[0]; objKonekcija.ZatvoriKonekciju(); return TabelaPodataka; } private DataTable UcitajFiltrirano(string Filter) { DataTable TabelaPodataka = new DataTable(); clsSqlKonekcija objKonekcija = new clsSqlKonekcija(Parametri.stringKonekcije); objKonekcija.OtvoriKonekciju(); clsSqlTabela objTabela = new clsSqlTabela(objKonekcija, "Drzava"); string SQLNaredba = "select ! frm Drzav where Oznake='" + Filter + "'"; DataSet dsPodaci = objTabela.DajPodatke(SQLNaredba);
TabelaPodataka = dsPodaci.Tables[0]; objKonekcija.ZatvoriKonekciju(); return TabelaPodataka; } private void PrikaziTabeluPodataka(DataTable TabelaPodataka) { dgvSpisakDrzava.DataSource = TabelaPodataka; dgvSpisakDrzava.Refesh(); } private void SnimiXML(DataTable podaci, string putanja) { DataSet dsPodaciEksport = new DataSet1(); // s obzirom da smo dobili kroz parametar poziva ove procedure "podaci" // zapravo samo promenljivu koja sadrzi memorijsku lokaciju, pokazivac // ka podacima, javlja se problem kada ovaj isti DataTable "podaci" // vezemo sa drugim datasetom "dsPodaciExport" jer je taj DataTable // vec povezan sa dsPodaci u okviru procedure UcitajSve i UcitajTabelarno. // Zato moramo da radimo Copy, da kopiramo strukturu i podatke u NOVI DataTable. DataTable podaciZaEksport = new DataTable(); podaciZaEksport = podaci.Copy(); dsPodaciEksport.Tables.Add(podaciZaEksport); dsPodaciEksport.WriteXml(putanja); } // KONSTRUKTOR public frmSaSopstvenomBibliotekomDBUtils() { InitializeComponent(); } // DOGADJAJI private void btnUnos_Click(object sender, EventArgs e) { IsprazniKontrole(); AktivirajKontrole; txtOznaka.Focus(); } private void btnSnimi_Click(object sender, EventArgs e) { string poruka = ""; int ukupnoSnimljeno = SnimiPodatke(); if (ukupnoSnimljeno > poruka) { poruka = "Uspesno snimljeno!"; } else { poruka = "Nije uspesno snimljeno!"; } DeaktivirajKontrole(); MessageBox.Show(); } private void btnOdustani_Click(object sender, EventArgs e) { IsprazniKontrole(); DeaktivirajKontrole(); } private void btnFiltriraj_Click(object sender, EventArgs e) { podaciTabelarni = UcitajFiltrirano(txtFilter.Text); PrikaziTabeluPodataka(podaciTabelarni); }
private void btnSve_Click(object sender, EventArgs e) { podaciTabelarni = UcitajSve(); PrikaziTabeluPodataka(podaciTabelarni); } private void btnExportXML_Click(object sender, EventArgs e) { SnimiXML(podaciTabelarni, Parametri.putanjaXML); MessageBox.Show("Uspesno realizovan eksport podataka!"); } private void frmSaSopstvenomBibliotekomDBUtils_Load(object sender, EventArgs e) { } } }
SQL script baze podataka (POTREBAN ZA PROVERU RUN-TIME GREŠAKA) CREATE DATABASE [GEOGRAFIJASE1] GO USE [GEOGRAFIJASE1] GO CREATE TABLE [dbo].[MESTO]( [PTT] [nvarchar](5) NOT NULL PRIMARY KEY, [Naziv] [nvarchar](40) NOT NULL, [OznakaDrzave] [nvarchar](3) NOT NULL ) GO CREATE TABLE [dbo].[DRZAVA]( [OZNAKA] [nvarchar](3) NOT NULL PRIMARY KEY, [Naziv] [nvarchar](100) NOT NULL, [UkupnoMesta] int NOT NULL ) GO ALTER TABLE [dbo].[MESTO] ADD CONSTRAINT FK_PRIPADA FOREIGN KEY (OznakaDrzave) REFERENCES [dbo].[DRZAVA] (OZNAKA) ON UPDATE CASCADE ON DELETE NO ACTION; GO
REŠENJE
DEO KODA SA GREŠKOM VRSTA GREŠKE OBJAŠNJENJE PROBLEMA KOREKCIJA GREŠKE
2. TIP ZADATKA (3 poena) - Dat je izgled korisniĉkog interfejsa i programski kod. Dat je kompletan Error list sa spiskom detektovanih grešaka od strane kompajlera. Odrediti vrstu greške (leksiĉka, sintaksna, semantiĉka, run-time) (1), objasniti problem (1) i ispraviti greške (1). Pored prethodno datog materijala dodatno bi bilo dato I ovo:
REŠENJE
DEO KODA SA GREŠKOM VRSTA GREŠKE OBJAŠNJENJE PROBLEMA KOREKCIJA GREŠKE
3. TIP ZADATKA
(3 poena) - Dat je ispravan segment koda. Napraviti namerne greške tako da bude jedna leksiĉka, jedna sintaksna i jedna semantiĉka greška. Napisati segment koda koji ukljuĉuje te greške. ISPRAVAN SEGMENT KODA: if (ukupnoSnimljeno > 0) { poruka = "Uspesno snimljeno!"; } else { poruka = "Nije uspesno snimljeno!"; }
KOD SA LEKSIĈKOM GREŠKOM KOD SA SINTAKSNOM GREŠKOM
KOD SA SEMANTIĈKOM GREŠKOM
4. TIP ZADATKA
(4 poena) – Dat je segment programskog koda sa greškama. Odrediti deo segmenta sa greškom (1), vrstu greške (leksiĉka, sintaksna, semantiĉka, run-time) (1), objasniti problem (1) i ispraviti greške (1).
private void btnSnimi_Click(object sender, EventArgs e) { string poruka = ""; int ukupnoSnimljeno = SnimiPodatke(); if (ukupnoSnimljeno > poruka { poruka = "Uspesno snimljeno!"; } else { poruka = "Nije uspesno snimljeno!"; } DeaktivirajKontrole(); MessageBx.Show(); }
DEO KODA SA GREŠKOM VRSTA GREŠKE OBJAŠNJENJE PROBLEMA KOREKCIJA GREŠKE
5. TIP ZADATKA Dat je segment programskog koda sa konkretnom jednom vrstom greške (leksiĉka, sintaksna, semantiĉka, run-time) koja je navedena. Detektovati delove koda sa greškama (1), objasniti problem (1) i ispraviti greške (1).
LEKSIČKA private void btnSnimi_Click(object sender, EventArgs e) { string poruka = ""; int ukupnoSnimljeno = SnimiPodatke(); if (ukupnoSnimljeno > O) { poruka = "Uspesno snimljeno!"; } else { poruka = "Nije uspesno snimljeno!"; } DeaktivirajKontrole(); MessageBx.Show(); }
DEO KODA SA GREŠKOM OBJAŠNJENJE PROBLEMA KOREKCIJA GREŠKE
SINTAKSNA private void btnSnimi_Click(object sender, EventArgs e) { string poruka = ""; int ukupnoSnimljeno = SnimiPodatke(); if (ukupnoSnimljeno > 0 { poruka = "Uspesno snimljeno!"; } else { poruka = "Nije uspesno snimljeno!"; } DeaktivirajKontrole(); MessageBox.Show(); }
DEO KODA SA GREŠKOM OBJAŠNJENJE PROBLEMA KOREKCIJA GREŠKE
SEMANTIČKA private void btnSnimi_Click(object sender, EventArgs e) { string poruka = ""; int ukupnoSnimljeno = SnimiPodatke(); if (ukupnoSnimljeno > poruka) { poruka = "Uspesno snimljeno!"; } else { poruka = "Nije uspesno snimljeno!"; } DeaktivirajKontrole(); MessageBox.Show(); }
DEO KODA SA GREŠKOM OBJAŠNJENJE PROBLEMA KOREKCIJA GREŠKE