|
Pravljenje igara Programski jezici, tehnike, alatke u službi pravljenja igara... |
|
Alatke vezane za temu | Vrste prikaza |
21.9.2006, 1:19 | #261 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
|
Re: objasnjenja pocetniku
Rešenje ovog problema je pronađeno u vidu uvođenja tzv. „inline“ definicije funkcije odnosno metode. Inline definiciju treba shvatiti veoma slično kao pretprocesorsku direktivu „#define“ koja umesto jedne reči, koliko može da zameni „#define“ u kodu, zamenjuje celu funkciju. Drugim rečima, kada pozovete neku „inline“ funkciju (ili metodu) neće dolaziti do skoka na tu pozvanu funkciju već će njen kod jednostavno biti samo kopiran na mesto gde se vrši poziv. Mućka? Ako jeste onda je u pitanju jedna jako korisna jer kao što je već rečeno izbegava se nekoliko koraka pri svakom pozivanju funkcije što može da ušpara stvarno mnogo vremena prilikom izvršavanja.
Kada je bolje definisati funkcije kao „inline“ a kada na klasičan način? U suštini „inline“ metod se koristi u slučajevima kada je metoda koja treba da se izvrši veoma kratka. U prethodnom primeru metoda „Starost_Ocitavanje()“ treba samo da vrati vrednost promenjljive „starost“ u okviru klase. Isti slučaj je i sa metodom „Starost_Postavljanje()“ koja jednino treba da njoj prosleđeni parametar „godina“ upiše u promenjljivu „starost“. U ovim primerima upotreba inline funkcija je ok. Međutim, da su metode sadržale veći broj programskih linija ili da uz to da je broj njihovih pozivanja u jedinici vremena veliki „inline“ metod ne bi bio prihvatljivo rešenje jer bi se ogromna količina resursa koristila za „prepisivanje“ sadržaja „inline“ funkcije na mestu gde se poziva. Znači, kratki obični accessori i „inline“ funkcije da, dugačke definicije „access-ora“ i „inline“ funkcije nikako! Možda se neko od vas do sada zapitao da li je prilikom kreiranja objekta na osnovu neke klase moguće tom objektu odmah na početku zadati početne vrednosti nekih ili čak svih članica promenjljivih. Na kraju krajeva u trenutku kada vas vaš komšija pita za „Šerpine“ godine „Šerpa“ već postoji tj. neće mu se dodeliti vrednost godina tek posle komšijinog pitanja. Isto važi i za vašu sposobnost da odgovorite komšiji za broj godina jer i vi odnekud morate da znate „Šerpin“ broj godina. Apsolutno isto važi i za boju dlake. Da bi ste mogli da odgovorite na to pitanje „Šerpa“ već mora da ima definisanu boju dlake. Postavljanje početnih vrednosti nekog objekta iz određene klase se vrši pomoću tzv. „konstruktora“. Konstruktori su delovi klase koji preuzimaju na sebe odgovornost da prilikom definisanje nekog objekta na osnovu njima prosleđenih podataka postave početne vrednosti objekata koji se kreiraju. U suštini, konstruktori i destruktori se uopšte ni ne moraju definisati jer će ih kompajler po sopstvenom nahođenju sam pridodati izvršnom kodu. Naravno ovakvi metodi bi bili potpuno prazni i ne bi služili ničemo. Filozofija oko toga zašto su konstruktori i destruktori must za svaku klasu je malo komplikovanija ali se svodi na to da je logično da prilikom nastajanja svakog objekta taj isti objekat ima trenutak svog nastajanja u kome se definše kakav je i šta može. |
21.9.2006, 1:20 | #262 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
|
Re: objasnjenja pocetniku
Primera radi, kada deklarišete i definišete neku promenjljivu vi ćete recimo da napišete:
Kod:
int chicken_muerto = 5; Da bi smo mogli tako nešto da uradimo iz glavnog programa potrebno je prvo definisati kontruktore. Konstruktori se definišu u okviru svake klase isto kao i bilo koji metod uz dva mala ograničenja. Naziv metoda klase mora da bude isti kao i naziv klase i ta metoda (konstruktor) ne sme da vraća vrednost. Prosleđivanje početnih vrednosti objektu se vrši njihovim navođenjem u zagradi identično kao da je u pitanju pozivanje funkcije. Primera radi, definisanje „Ubice“ iz prethodnog rpimera može da se uradi na sledeći način: Kod:
Civava Ubica(77, „zagasito crvena“); |
21.9.2006, 1:21 | #263 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
|
Re: objasnjenja pocetniku
Kod:
#include<iostream> #include<string> using namespace std; typedef unsigned short int USHORT; void CekajEnter(); //prototip funkcije void CekajEnter(){ cout << "\nPritisnite ENTER za izlazak iz programa..."; fflush(stdin); cin.get(); } class Civava { //deklarisanje klase "civava" public: Civava(USHORT argGodine, string argBoja_dlake, string argFalinka); // deklaracija konstruktora klase ~Civava(); //deklaracija destruktora klase // accessori za promenjljivu starost USHORT Starost_Ocitavanje() const {return starost;} // deklaracija i definicija accessora ocitavanja void Starost_Postavljanje(USHORT godina){starost = godina;} //deklaracija i definicija accessora upisa //accessori za promenjljivu boja_dlake string BDlake_Ocitavanje() const {return boja_dlake;} void BDlake_Postavljanje(string B_dlake){boja_dlake = B_dlake;} private: USHORT starost; string boja_dlake; protected: string falinka; }; //definicija konstruktora za klasu Civava Civava::Civava(USHORT argGodine, string argBoja_dlake, string argFalinka){ //postavljanje pocetne vrednosti za objekte definisane klasom Civava starost = 7 * argGodine; boja_dlake = argBoja_dlake; falinka = argFalinka; } //definicija destruktora za klasu Civava Civava::~Civava(){ } int main(){ //kreiranj objekta "Ubica" Civava Ubica(11, "zagasito crvena", "ne ume da prica"); //ispis podataka za "Ubicu" definisanih pozivom "konstruktora" cout << "***** Podaci postavljeni prilikom kreiranja objekta *****\n"; cout << "Komsijin \"Ubica\" je star tacno " << Ubica.Starost_Ocitavanje(); cout << " godina boja dlake mu je \"" << Ubica.BDlake_Ocitavanje() << "\"!\n\n" << endl; //postavljanje novih vrednosti Ubica.Starost_Postavljanje(4); Ubica.BDlake_Postavljanje("mentol plava"); // ispis podataka po ponovnom postavljanju cout << "***** Podaci postavljeni prilikom kreiranja objekta *****\n"; cout << "Komsijin \"Ubica\" je star tacno " << Ubica.Starost_Ocitavanje(); cout << " godina boja dlake mu je \"" << Ubica.BDlake_Ocitavanje() << "\"!\n" << endl; CekajEnter(); return EXIT_SUCCESS; } |
21.9.2006, 1:23 | #264 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
|
Re: objasnjenja pocetniku
Da krenemo. Na početku koda ne postoji apsolutno ništa specijalno što do sada nije ovde obrađeno. Klasično otvaranje standardnih zaglavlja, definisanje prototipa funkcije kao i same funkcije „CekajEnter“ koja treba prilikom poziva da čeka na pritisak nekog tastera od strane korisnika i to je to.
Izgled naše klase „Civava“ smo malo redizajnirali kao što smo rekli i to tako što smo izbacili sve one dodatne metode koje smo do sada imali i ostavili samo accessore. Deklaracija klase „Civava“ sada izgleda ovako: Kod:
class Civava { //deklarisanje klase "civava" public: Civava(USHORT argGodine, string argBoja_dlake, string argFalinka); // deklaracija konstruktora klase ~Civava(); //deklaracija destruktora klase // accessori za promenjljivu starost USHORT Starost_Ocitavanje() const {return starost;} // deklaracija i definicija accessora ocitavanja void Starost_Postavljanje(USHORT godina){starost = godina;} //deklaracija i definicija accessora upisa //accessori za promenjljivu boja_dlake string BDlake_Ocitavanje() const {return boja_dlake;} void BDlake_Postavljanje(string B_dlake){boja_dlake = B_dlake;} private: USHORT starost; string boja_dlake; protected: string falinka; }; Civava(USHORT argGodine, string argBoja_dlake, string argFalinka); // deklaracija konstruktora klase Kao što može da se vidi, podaci koji se prosleđuju konstruktoru kasnije u kodu su starost (argument „argGodine“), boja dlake (argument „argBoja_dlake) i falinka (argument „argFalinka“). Ovi podaci se naravno prosleđuju prilikom kreiranja objekta u kodu i to bi za objekat „Ubica“ bila konkretno sledeća linija: Kod:
Civava Ubica(11, "zagasito crvena", "ne ume da prica"); |
21.9.2006, 1:32 | #265 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
|
Re: objasnjenja pocetniku
Na trenutak bih na ovom mestu zastao i pokušao da objasnim o kakvom se tipu podataka radi u slučaju „string-a“. Naime, poznato je da C programski jezik pristupa problemu rešavanja smeštanja stringova (niza karaktera koji najčešće mogu da se posmatraju kao reči) tako što je pre toga potrebno rezervisati niz tipa „char“ određene dužine u okviru koga će u svakoj ćeliji tog niza biti smešten po jedan karakter datog stringa. Primera radi, recimo da želimo da u C programskom jeziku smestimo neki string morali bi smo to da uradimo na sledeći način:
Kod:
char Ime[15] = “Raduljko”; Ovaj pristup u suštini nije loš ali ima jednu veliku manu da je veoma lako negde u kodu napraviti grešku i „ode mas’ u propas’“. Primera radi, može se desiti da u svom kodu vršite upis u ćeliju niza van granica definicije. To se veoma lako može videti u sledećem kodu koji je u bilo kom kompajleru apsolutno sintaksički ispravan. Kod:
char Ime[10]; Ime[11] = ’X’; Kod:
char Ime[10] = “Sharevantes”; // **greska! Rezervisano samo 10 bajta a zahteva se 11. Kod:
char Ime[10] = “Raduljko”; cout << Ime[11]; // **greska! Ispis nepostojece celije. |
21.9.2006, 1:35 | #266 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
|
Re: objasnjenja pocetniku
Ovaj kod koristi isključivo stringove kao potpuno objektno-orijentisan pristup rešavanja problema. Ovakav pristup naravno ima svojih prednosti ali ima i mana. Osnovne prednosti koje bi svako po prelasku na ovakav način programiranja primetio jesu da nema više potrebe da se koristi recimo funkcija „strcpy“ za kopiranje sadržaja jednog niza karaktera u drugi (čitaj: jednog stringa u drugi). Primera radi, ako bi ste negde u kodu imali niz karaktera koji treba da sadrži neko ime jedini način da izvršite pridruživanje onoga što dati niz sadrži nekom drugom nizu jeste kopiranje iz prvog niza u drugi. Primera radi sledi kod.
Kod:
char Ime[15] = "Raduljko"; // prvi niz char Backup[15]; //drugi niz strcpy(Backup, Ime); //pridruzivanje (kopiranje) jednog niza drugom cout << Ime; // ispisuje se „Raduljko“. Kod:
string Ime; //deklaracija prvog stringa string Backup; //deklaracija drugog stringa Backup = Ime; //dodeljivanje cout << Backup; //ispis Mana ovakvog pristupa je brzina jer je prilikom zahtevnijih zadataka ponekad primetan nedostatak u pogledu brzine ovog i pristupa direktnog rada sa karakterima u nizu. Bez obzira na sve preporučuje se korišćenje string klase kad god je to moguće. Da se vratimo na naš program sa klasama. Izvršili smo deklaraciju i definiciju klase i njenih metoda i promenjljivih. No u okviru deklaracije metoda (tj. accessora) primećuje se pojava reči „const“. Kod:
USHORT Starost_Ocitavanje() const {return starost;} Sada je potrebno sve to primeniti iz glavnog programa mada je poprilično jasno šta se tu događa. Prvo se definiše objekat „Ubica“ sa određenim početnim vrednostima koje konstruktor klase „Civava“ čita i postavlja u odgovarajuće promenjljive. Kod:
Civava Ubica(11, "zagasito crvena", "ne ume da prica"); Na kraju rezime. Klase predstavljaju izuzetno moćno oružije prilikom razvoja aplikacija. Imaju svojih prednosti ali i mana. Neke od prednosti sam uspeo ovde da pomenem ali se stvarna moć klasa može osetiti u radu tek prilikom upoznavanja ostatka njihovih osobina kao što su osobine nasleđivanja, korišćenje u kombinaciji sa referencama itd. |
9.1.2007, 22:43 | #267 |
Kind Of A Big Deal
Član od: 1.11.2005.
Lokacija: Levo od Pakla
Poruke: 2.214
Zahvalnice: 344
Zahvaljeno 450 puta na 265 poruka
|
Re: objasnjenja pocetniku
Haha! e ljudi citao sam ovaj topic par sati.. Ima ovde korisnih stvarcica, mogli bi da ga "pinujete".. Doduse moram reci da drzim stranu holodoc-a.. C++ je legenda, proslost, sadasnjost i buducnost.. Za programiranje pored upornosti vam treba masta i fleksibilnost.. Tako barem ja mislim
@Marko_L ima istine i u tvojim postovima, ali ne toliko.. A jos nisam ni zaboravio nasu raspravu o pirateriji |
10.1.2007, 1:22 | #268 | ||
Mythbuster
|
Re: objasnjenja pocetniku
Citat:
Citat:
|
||
29.1.2007, 0:20 | #269 |
Član
|
Re: objasnjenja pocetniku
Svaka cast ljudi...topic je odlican (sem one zamorne rasprave na pocetku ) ali posle ste se lepo zagrejali
Bio sam potpuni pocetnik ali evo sada mogu cak i da napravim programic tipa : Kod:
#include <iostream> #include <cstdlib> using namespace std; int main() { cout << "Koliko ste visoki?\t" ; double visina; cin >> visina; cout << "\nJa sam visok " << visina << " m. Koliko je to milimetara?"<< endl ; cout << "To je: " << visina*1000 << " mm." << endl; system ("pause"); return 0; } Ovo sa pauzom je mozda i najkorisnija stvar koju ste postavili jer je lepo kad mozes da vidis plod svog rada (citaj:morale boost). Uzeo sam da citam (mislim da je Androssova preporuka, mrzi me da trazim :P) Accelerated C++ i za sada ide OK, ali ste mi mnogo olaksali. Necu mnogo da pisem, nekoliko poslednjih stranica sam preskocio samo da bih se zahvalio (njih cu posle da proucavam pazljivije). Sta da kazem: keep it up! There we go Hvala za pm, holodoc. Poslednja ispravka: Mithrandir (29.1.2007 u 14:53) |
29.1.2007, 1:44 | #270 | |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
|
Re: objasnjenja pocetniku
Citat:
|
|
29.1.2007, 2:12 | #271 |
Starosedelac
|
Re: objasnjenja pocetniku
On je napisao
Kod: a kod stavio u citat Zasto ne obratis paznju na dugme desno od citata... |
29.1.2007, 2:21 | #272 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
|
Re: objasnjenja pocetniku
Sad sam tek ukapirao na šta misli
Kod koji ispišeš treba da selektuješ kompletan i da klikneš na ovu sliku tarabe (#) iznad editora. |
29.1.2007, 20:26 | #273 | |
Član
|
Re: objasnjenja pocetniku
Citat:
Ukucao sam onaj kod koji je postavio holodoc, i kako sam razumeo ne bi trebalo da mi izlazi konzola ali izlazi, pa pretpostavljam da je problem ovo sto si ti naveo ali mi nije jasno sta da uradim da mi se ne bi otvarala konzola? Kod:
#include <windows.h> int main() { MessageBox(0, "MOLIM?", "DA DA DA!!!", 0); } |
|
29.1.2007, 22:50 | #274 |
Starosedelac
|
Re: objasnjenja pocetniku
Pretpostavljam da koristish VC++ 6... Skini DevC++ i nece da se pojavljuje!
|
29.1.2007, 22:57 | #275 | |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
|
Re: objasnjenja pocetniku
Citat:
Da bi se otvorila "punokrvna" Win32 aplikacija potrebno je malo izmeniti kod ali o tome kasnije kad nađem malo vremena mada je sve u vezi ove stvarčice objašnjeno u temi "objasnjenje pocetniku" |
|
29.1.2007, 22:57 | #276 | |
Član
|
Re: objasnjenja pocetniku
Citat:
lol holodoc je odgovorio u isto vreme |
|
30.1.2007, 0:46 | #277 |
Starosedelac
|
Re: objasnjenja pocetniku
meni se konzola u DevC++-u ne pojavljuje...
|
30.1.2007, 0:54 | #278 | ||
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.085
Zahvaljeno 4.923 puta na 2.859 poruka
|
Re: objasnjenja pocetniku
Citat:
Hvatanje entera si mogao da izvedeš i sa getchar(); Uvek gledaj da praviš maksimalno portabilne programe, naročito u ovako banalnim primerima. Citat:
Za kompajliranje preko gcc-a (koga koristi Dev-C++) postoji određeni switch da nagovestiš kompajleru da je u pitanju GUI a ne konzolni program, ali sam zaboravio kako ide... |
||
30.1.2007, 1:07 | #279 |
Starosedelac
|
Re: objasnjenja pocetniku
Ali ja znam! Kad otvoris projekat, idesh na Project -> Project Options ili na kraci nacin, Alt+P, i dole desno vidis pise Type. Tu namestish Win32 GUI.
|
30.1.2007, 17:21 | #280 | |
Član
|
Re: objasnjenja pocetniku
Citat:
Samo, jos sam ja totalni pocetnik... |
|
Bookmarks sajtovi |
Tagovi |
programiranje, tutoriali |
|
|