$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \newcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$
Priručnik za početnike (C++) / Sintaksne Greške (kršenje pravila pisanja)

Sintaksne Greške (kršenje pravila pisanja)

  • Dozvoljeno polaganje
  • Lekcije
  • Nema
  • Vugdelija
  • 7/20/2015

Sigurno ti se desilo u običnom govoru ili dopisivanju da se ne izraziš dovoljno jasno ili tačno, pa te sagovornik zbog toga ne razume. Na primer, ako nekome napišeš: „donesi kopu“, verovatno neće razumeti šta želiš (ne zna šta je kopa). Primalac poruke će možda pretpostaviti da je ona pogrešno otkucana, pa će iz ranijeg razgovora pokušati da pogodi šta želiš da donese (kofu, kapu, klopu, korpu…). Ipak, najverovatnije je da će te pitati šta treba da donese i daće ti priliku da pojasniš ili ispraviš svoj zahtev.

Slično se dešava i u programiranju. Pravila za pisanje programa su vrlo precizna i za svaki deo programa je tačno određeno kako se može napisati i šta u tom slučaju znači. Skup pravila za pisanje programa na nekom programskom jeziku naziva se sintaksa tog jezika. Sintaksna greška nastaje kada kompjuter ne razume neki deo tvog programa, zato što nije napisan tačno po pravilima.

Kao što smo videli u primeru (donesi kopu), može biti dovoljno da se u pogrešno napisanoj rečenici zameni ili doda samo jedno slovo, pa da rečenica dobije smisao i da nešto znači. Ipak, kompjuteru je sasvim svejedno da li je rečenica (program) skoro ispravna ili potpuno besmislena, poput „Dobrome dva nežno krug“ ili čak "adf#fgh$ty!p o?e&c*nm^,.%". Kompjuter uvek zahteva potpunu preciznost u izražavanju i uvek samo prijavljuje šta tačno ne razume, jer on nije sposoban da pogodi šta je trebalo da bude napisano i da sam ispravi grešku, ma koliko mala bila ta greška.

 

Zato je važno da razumeš poruke o greškama. Na primer, za ovaj program,

kompjuter ti u Output prozoru (output ovde možemo prevesti kao ishod ili učinak) na sledeći način prijavljuje da li je program uspešno preveden, ili je bilo sintaksnih grešaka:

 U ovom primeru, program ima jednu grešku. Tekst

1>d:\wrk\testapp\mojprviprogram\program1.cpp(8): error C2143:

daje puno ime fajla i broj linije u programu (ovde linija 8) u kojoj se nalazi greška.

C2143 je oznaka ili kod za ovu vrstu greške. Koristeći taj kod, možeš lako da pronađeš na internetu više informacija (na žalost uglavnom na engleskom) o ovoj vrsti greške: u čemu se ona sastoji, kako može da nastane, često i kratak i jednostavan primer - program u kome se ova greška pojavljuje. Objašnjenja koja na ovaj način pronađeš će ti verovatno biti korisnija nakon što stekneš malo iskustva.

Na kraju, tekst:

missing ';' before '}

 daje kratko objašnjenje ove greške, koje pomaže da grešku uočiš i ispraviš. U ovom primeru, dati tekst znači da nedostaje znak ';' (tačka-zarez) pre znaka '}' (zatvorena vitičasta zagrada). Zaista, kao što je pomenuto u prethodnoj lekciji, na kraju naredbe mora da se nalazi znak ';', a ovde je (greškom) izostavljen. Dodaj znak ';' nakon teksta "Hello World!" i prevedi program ponovo. Trebalo bi da dobiješ ovakav sadržaj output prozora.

 

Ovaj tekst znači da od svih projekata čije prevođenje je traženo, 1 je bilo uspešno, 0 neuspešnih, i 0 izostavljenih (urađenih ranije). Kraće rečeno, tvoj (jedini) projekat je uspešno preveden.

Ako na primer, umesto znaka ';' dodaš ':' dobijaš ovakvu poruku:

Greška je iste vrste, jer se čitanjem programa ne nailazi na očekivani znak, nego na neki drugi. Zato je kod greške isti (C2143), mada je greška sada otkrivena jednu liniju ranije, a umesto zagrade sada imamo dvotačku.

Ovakvih poruka o greškama može da bude i više od jedne. Svaka poruka o sintaksnoj grešci sadrži ove delove:

  • Mesto u programu (ime fajla i redni broj linije) gde se greška pojavila;
  • Oznaka (kod) greške.
  • Kratak opis greške, koji će ti ubrzo postati dovoljan da razumeš o čemu se radi

Takvim porukama kompjuter ti govori da određeni deo programa nije napisan ispravno i zato nije jasan. Ove poruke služe da lakše uočiš šta je u programu neispravno, i da to onda ispraviš.

Pri ispravljanju se uvek usredsredi na prvu prijavljenu grešku, jer je moguće da njenim ispravljanjem nestane još nekoliko prijavljenih grešaka. Ako neke greške ne razumeš, možeš da, nakon što ispraviš prvu, prevedeš program ponovo. Pojaviće se nova lista grešaka, koja bi trebalo da bude kraća.

Pravljenje ovakvih grešaka je normalno, pogotovo u početku. Zato se naoružaj strpljenjem tokom pisanja svojih prvih programa, jer će se ovakve stvari skoro sigurno dešavati. Važno je da ne odustaneš pri ovim početnim teškoćama, jer se one uglavnom brzo savladaju, a posle toga imaćeš zadovoljstvo da vidiš kako tvoji programi rade i to sve teže i zanimljivije stvari.

Mi ćemo se truditi da ti pomognemo tako što ćemo ti tokom lekcija o pisanju programa skretati pažnju na neke greške koje početnici često prave. Nije loše da grešku prvi put napraviš namerno, da vidiš kako izgleda poruka. To može da ti pomogne da kasnije, kada grešku napraviš slučajno, lakše razumeš (prepoznaš) poruku o grešci.

Greške u značenju

Rečenice sa sintaksnom greškom su neispravno napisane i zato ne znače ništa, čak i ako je samo jedan znak pogrešan (samo potpuno ispravno napisane rečenice mogu nešto da znače). Ako kompjuter ne razume neki deo programa, on će ti to reći na svoj način i neće ni pokušati da izvrši program.

Osim sintaksnih, postoji još jedna vrsta grešaka, a to je kada tvoja rečenica ima značenje, ali ne ono koje je tebi bilo na umu. Na primer, ako kažeš ili napišeš: „Kada polazi avion iz Atine?“ umesto „Kada dolazi avion iz Atine?“, niko neće primetiti tvoju grešku, jer je pitanje razumljivo i ima smisao. U ovakvoj situaciji ćeš najverovatnije dobiti informaciju koja je za tebe pogrešna (nije ona koju želiš da dobiješ) i zbog toga će neko možda propustiti let avionom ili će nepotrebno čekati na aerodromu.

Ovakve greške se zovu greške u značenju, ili semantičke greške. One lako mogu da prođu nezapaženo, jer kompjuteru je „sve jasno“ i on može da izvrši program. Na žalost, rezultat rada programa je u takvim slučajevima nekad ispravan, nekad neispravan, a ponekad je nesporazum između nas i kompjutera toliko veliki da rezultata uopšte i ne bude. Možda se pitaš kako uopšte možeš da proveriš da tvoj program (koji može da se izvrši) nema semantičke greške i da radi ispravno. Jedini efikasan način je testiranje programa. Testiranje programa je kao kada nekome postavljaš pitanja na koja znaš odgovor. Još bolje, to je kao kada nekome ko ume da računa daješ računski zadatak (na primer izdiktiraš neki brojni izraz), a rezultat znaš unapred. Na taj način proveravaš da li taj neko ono što govoriš razume na isti način kao i ti. Ako daje odgovor koji očekuješ, znači da ste se lepo razumeli (ili ste samo imali sreće), u protivnom je bilo nesporazuma, to jest grešaka u značenju. Dakle, testiranje programa nam služi da otkrijemo što više grešaka u značenju, koje smo napravili pišući program. Testiranjem programa i otkrivanjem grešaka u značenju ćemo se detaljno baviti u nekim od narednih lekcija.

Za sada dok učiš programiranje, kada rešavaš zadatke koje smo postavili na Bubble Bee, možeš da koristiš naš sistem za testiranje rešenja koja nam šalješ. Sistem za testiranje radi upravo na opisani način - on ima pripremljena pitanja za tvoj program i proverava da li dobija odgovor koji očekuje. Bilo bi dobro da kasnije, kada se malo uhodaš, počneš da gradiš naviku da na isti način i samostalno testiraš svaki svoj program.