![]() |
![]() |
|
Programiranje Programski jezici, tehnike, alatke... |
![]() |
|
Alatke vezane za temu | Vrste prikaza |
![]() |
#141 | |
Član
Član od: 10.9.2008.
Lokacija: Beograd
Poruke: 81
Zahvalnice: 0
Zahvaljeno 0 puta na 0 poruka
|
![]() Citat:
![]() Jel ovo Ctrl+Z moze da se promeni da radi na neku drugu komandu tipa da kad kliknes na tab da krene da radi? |
|
![]() |
![]() |
![]() |
#142 |
Veteran
Član od: 27.12.2005.
Lokacija: Vremenske Grobnice, Hiperion
Poruke: 680
Zahvalnice: 99
Zahvaljeno 124 puta na 82 poruka
|
![]()
Ne znam za tab, ali, ako ti odgovara da ulaz obrađuješ liniju po liniju (tj. kad pritisneš enter, on pozove parser) onda možeš da uradiš ovako nešto:
Kod:
#include <iostream> #include <iomanip> #include <iterator> // ... parser kod ... // int main() { std::string line; while(std::getline(std::cin, line)) { if( line == "exit" ) break; Parser parser(line); std::cout << std::boolalpha; std::cout << parser.axiom1() << "\n"; std::cout << parser.axiom2() << "\n"; std::cout << parser.axiom3() << "\n"; } return 0; } Ne znam kako uraditi to sa tabovima bez neke GUI biblioteke, ali to mi je overkill za aplikaciju ovog tipa. |
![]() |
![]() |
![]() |
#143 | |
Član
Član od: 10.9.2008.
Lokacija: Beograd
Poruke: 81
Zahvalnice: 0
Zahvaljeno 0 puta na 0 poruka
|
![]()
Jel moze neko da mi napise kako bi se mogao dotati neki text ispred ovoga true i false?
Citat:
Poslednja ispravka: Ozzy (19.12.2012 u 20:03) |
|
![]() |
![]() |
![]() |
#144 |
Starosedelac
|
![]() Kod:
#include <iostream> using std::cout; class O {}; class I : O {}; void m(int& x) { x=0; try { x=1; throw new O; x=2; } catch(I* i) { x=3; } if (x!=3) x=4; } int main () { int x; m(x); cout << x; system("pause"); return 0; } Prvenstveno me buni jer je ovakvo pitanje doslo na ispitu iz C++ (bez main funkcije, nju sam ja napisao cisto da bi testirao u kompajleru, a zadatak je da se odredi vrednost promenljive x nakon zavrsetka funkcije m). Kontam da je greska, pa reko da l' da im prijavljujem to? |
![]() |
![]() |
![]() |
#145 |
Veteran
Član od: 27.12.2005.
Lokacija: Vremenske Grobnice, Hiperion
Poruke: 680
Zahvalnice: 99
Zahvaljeno 124 puta na 82 poruka
|
![]()
Prvo, ako misliš da ti kod proradi, stavi
Kod:
class I : public O {}; I je podklasa od O. Ne možeš da koristiš pokazivač tipa I* da ti pokazuje na objekat tipa O (ok, možeš sa recimo reinterpret_cast, ali to je već varanje ![]() Kada bi bacao pokazivač na objekat tipa I (što je izvor memory leak-a, btw), a hvatao O*, sve bi bilo OK. Please, nikada nemoj da radiš throw new nešto. Bolje uradi nešto ovako: Kod:
try { throw I(); } catch(O const& i) { x=3; } Pozz! PS: sorry ako sam preterao, couldn't help it. |
![]() |
![]() |
Sledeći korisnik se zahvaljuje korisniku M.Silenus na korisnoj poruci: | ||
Lucic Nemanja (16.1.2013) |
![]() |
#146 |
Starosedelac
|
![]()
Hvala. Ma nisam ja ovo pisao, to je jedan od onih retardiranih pitanja koja su smisljena da provere znanje jezika, a ne kako treba programirati
![]() |
![]() |
![]() |
![]() |
#147 |
Veteran
Član od: 27.12.2005.
Lokacija: Vremenske Grobnice, Hiperion
Poruke: 680
Zahvalnice: 99
Zahvaljeno 124 puta na 82 poruka
|
![]()
I* u O* da, ne obratno, što je slučaj sa originalnim kodom.
Što se javnog nasleđivanja tiče, biću iskren, nisam siguran koja su tačno pravila - probao sam kod sa g++ 4.7 i ne radi bez javnog nasleđivanja, što ne znači da je tako u standardu. Pogledaj recimo Protected/Private Inheritance Casting i C-Style upcast and downcast involving private inheritance pitanja na StackOverflow-u. |
![]() |
![]() |
![]() |
#148 |
Banned
|
![]()
Pozdrav,
Mozda ce moje pitanje da zvuci malo glupo, ali odavno sam "ispao" iz aplikativnog programiranja, pa su mi neke stvari nerazumljive...Na faxu ucimo trenutno C jezik, sintaksa mi je jasna jer sam radio u C++, relativno su slicni jezici, ali ono sto me buni su pokazivaci. Ne znam kako ali uopste ne mogu da shvatim njihovu svrhu i nacin upotrebe. Jako bi voleo ako bi neko mogao da mi objasni sta su pokazivaci, cemu sluze i njihova primena u praksi. Takodje me zanima i koja je razlika izmedju pokazivaca i adresa? Koliko sam shvatio kod adresa je potrebno da se prethodno tacno alocira memorija za odredjenu promenljivu dok to kod pokazivaca nije slucaj...jel tako? |
![]() |
![]() |
![]() |
#149 |
Starosedelac
|
![]()
Ne postoje glupa pitanja.
![]() Koncept pointera zna da bude dosta stran ljudima zbog toga što malo ko ume da ga pravilno objasni. Po definiciji, pointer (pokazivač) je variabla u kojoj se nalazi adresa memorijske lokacije. Šta to znači? Poprilično podenostavljen primer i analogija jeste da imaš parče papira na kome je napisana adresa nečega (mesto, ulica, broj). Taj papir je pointer, a on pokazuje na kuću koja se nalazi na datoj adresi. Koriste se za dosta stvari, pre svega zbog performansi, ali na primer, u C-u, da bi uradio neke stvari nemaš previše izbora? C je jezik jako niskog nivoa, samim tim nisi ograničen nekim paradigmama, radiš poprilično blizu nativnom nivou. Na primer, C ne podržava stringove nativno, samim tim moraš da koristiš nizove znakova: Kod:
char[] yo = "yo!"; char *yo = "yo!"; Kod:
int a = 123; int *b = &a; U drugoj liniji, b je zapravo pointer, kome smo koristeći operator (&) dodelili adresu od a, što znači, adresu memorijske lokacije u kojoj je smeštena vrednost 123. Kada bi uradio sledeće: Kod:
printf("%d", b); Da bi dobio vrednost sa te adrese (123), koristi se operator * Kod:
printf("%d", *b); Još jedan primer, pointere možeš da koristiš sa nizovima (kao char* od malopre), i da se samom inkrementacijom istog krećeš kroz niz, npr: Kod:
char *yo = "yoyoyoyo"; while(*yo) { printf("%c", *yo); yo++; } Pointere u C-u ćeš naći svugde, tako da bolje pogledaj dokumentaciju onoga šta te interesuje i videćeš. Što se tiče tvog problema oko pointera i adresa, adresa je samo broj koji označava lokaciju nečega u memoriji, tako da baš i ne možeš da ih porediš, jer pointer sadrži adresu, koja je sama po sebi neka vrednost. Uvek možeš da imaš pointer, koji pokazuje na neki drugi pointer, a taj drugi pointer pokazuje na neku vrednost - sasvim legitimno. ![]() Možda si mislio na razliku između pointera i referenci u C++? |
![]() |
![]() |
Sledeći korisnik se zahvaljuje korisniku MG-RAY na korisnoj poruci: | ||
PeTkO (27.1.2013) |
![]() |
#150 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.212
Zahvalnice: 2.125
Zahvaljeno 4.953 puta na 2.882 poruka
|
![]()
Ukratko, pokazivač je adresa. Odnosno, promenljiva koja je tipa pokazivač na nešto sadrži samo i isključivo nekakvu adresu u obliku 32-bitnog unsigned integera, i ništa drugo (s tim što su u 64-bitnim programima automatski i pokazivači 64-bitni).
To što pokazivač u C-u može biti određenog "tipa" samo govori kompajleru šta se nalazi na adresi koju pokazivač sadrži. Dakle, int*, float*, void*, to su i dalje 32-bitni unsigned integeri koji sadrže memorijsku adresu, a ono ispred zvezdice samo kaže C-u kako da tretira to što je na adresi (u pogledu dozvoljenih operatora nad podatkom koji je na toj adresi, broja bajtova koje treba pročitati počev od te adrese, itd). Uvek, uvek zapamti da je C samo jedan korak iznad asemblera i da se praktično sve iz C-a (uključujući pokazivače) direktno mapira na odgovarajuće "mehanizme" u asembleru. |
![]() |
![]() |
![]() |
#151 |
Veteran
Član od: 3.5.2008.
Lokacija: Beograd
Poruke: 760
Zahvalnice: 81
Zahvaljeno 213 puta na 144 poruka
|
![]()
Nisu ekvivalentni. U prvoj liniji yo je pokazivač na niz karaktera na stacku (odnosno kada izvršenje dođe do te linije niz se kopira na stack iz read only dela memorije gde su skladišteni svi string literali), dok je u drugoj liniji yo pokazivač na niz karaktera koji se nalazi u read only memoriji (poseban deo memorijskog prostora gde se nalaze string literali, instance struct-ova čija su polja inicilazovana konstantama, string literalima ili drugim sličnim structovima (za globalne promenljive i struct literale u kodu), sadržaj ovog dela memorije se automatski povlači iz samog izvršnog fajla)
Poslednja ispravka: ivan90BG (28.1.2013 u 11:14) |
![]() |
![]() |
![]() |
#152 |
Starosedelac
Član od: 14.3.2009.
Poruke: 1.201
Zahvalnice: 208
Zahvaljeno 276 puta na 179 poruka
|
![]()
'Skoro je nemoguce objasniti prostim recima sta je pokazivac i cemu sluzi' - moj profa sa vise
![]() Nego sad bez zezanja,jel oni sluze na primer: da se ustedi na samoj zahtevnosti aplikacije (manja potrosnja rama)? |
![]() |
![]() |
![]() |
#153 |
Veteran
Član od: 3.5.2008.
Lokacija: Beograd
Poruke: 760
Zahvalnice: 81
Zahvaljeno 213 puta na 144 poruka
|
![]()
Ne, pointeri ne služe ničemu.
![]() Odnosno pointeri nemaju jednu određenu svrhu. Postoji ono što pointeri jesu, a to kako će se koristiti zavisi od kreativnosti i znanja programera. To što još uvek ne shvataš čemu služe pointeri znači samo da još ne znaš dovoljno o stacku i heap-u i osnovnim strukturama podataka i algoritmima. Ja sad ne mogu da ti objasnim kako pointeri doprinose efikasnosti aplikacije, jer bi to povuklo ovo što sam pomenuo, a kad to naučiš nećeš uopšte više pitati ovakva pitanja. E sad ne znam da li ti znaš Javu ili C#. Ako znaš onda mogu da ti objasnim lako. |
![]() |
![]() |
![]() |
#154 |
Starosedelac
Član od: 14.3.2009.
Poruke: 1.201
Zahvalnice: 208
Zahvaljeno 276 puta na 179 poruka
|
![]()
Osnovno 'aplikativno znanje' C#
Pointer pokazuje na adresu koja sadrzi 'fizicki nesto' za razliku od njega... Znak za Hotel pored puta nije hotel vec pokazuje na njega... Lepo sam pitao,ako ne znas odgovor na konkretno pitanje,onda nista.... Cemu psiho-analiza umesto odgovora???? |
![]() |
![]() |
![]() |
#155 | |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.212
Zahvalnice: 2.125
Zahvaljeno 4.953 puta na 2.882 poruka
|
![]() Citat:
Pokazivači su potpuno prirodni koncept, jer se memorija sastoji od ćelija u koje se nešto može upisati, i te ćelije imaju neke lokacije (adrese). E sad, moderni jezici su te adrese sakrili i podacima se pristupa preko imena promenljivih, ali uvek postoji potreba za pokazivačima jer ćeš imati programe gde nećeš u startu znati ni koliko ćeš imati podataka, niti kog će biti tipa. I onda ti ne preostaje ništa drugo nego da u toku izvršenja zauzimaš i oslobađaš memoriju po potrebi, a toj memoriji jedino preko pokazivača/adresa možeš da pristupiš. Kao na primer, vrlo često korišćen koncept ulančane liste, koja je izuzetno pogodna za realizaciju nizova jako promenljivog sadržaja, jer se umetanje u niz svodi na kreiranje novog elementa i "prevezivanje" elemenata koji treba da dođu pre i posle novog. U slučaju običnog statičkog niza, kad bi hteo da umetneš nov element, morao bi prethodno sve posle njega da prekopiraš na jednu lokaciju ispred, što je sporije. Ima i složenijih struktura koje se takođe oslanjaju na pokazivače, kao što su npr. stabla i veoma često se koriste u mnogim programima (recimo svi aktuelni fajl sistemi su izvedeni preko stabala) a da korisnici apsolutno nisu svesni toga. |
|
![]() |
![]() |
![]() |
#156 |
Veteran
Član od: 3.5.2008.
Lokacija: Beograd
Poruke: 760
Zahvalnice: 81
Zahvaljeno 213 puta na 144 poruka
|
![]()
@voodoo
Zahvalnica zbog asemblera. ![]() @Markonije Nikakva psihoanaliza, pa i profesor je rekao da se ne može objasniti normalnim rečima. ![]() Elem, ako znaš C#, svaki put kad kreiraš novi objekat sa new, to je alokacija memorije i ti dobijaš pointer, samo što C# i .NET to prikrivaju. Kod:
List<string> lista1 = new List<string>(); List<string> lista2 = lista1; Console.WriteLine(lista1.Count); Console.WriteLine(lista2.Count); lista1.Add("yo!"); Console.WriteLine(lista1.Count); Console.WriteLine(lista2.Count); Kod:
0 0 1 1 |
![]() |
![]() |
Sledeći korisnik se zahvaljuje korisniku ivan90BG na korisnoj poruci: | ||
voodoo_ (29.1.2013) |
![]() |
#157 |
Starosedelac
Član od: 23.2.2006.
Lokacija: Tamo gde su kuće od čokolade i prozori od marmelade....
Poruke: 1.579
Zahvalnice: 195
Zahvaljeno 301 puta na 171 poruka
|
![]()
U javi postoje pokazivaci? :O
dodao bih jos: Pokazivac kao sto su rekli pokazuje na neko parce memorije. U sustini nije nista drugo do adrese neke memorijske lokacije koja sadrzi neki podatak. (pokazivac je int ako se ne varam) Pokazivaci se na jedan il na drugi nacin provlace u svakom aspektu. Prva primena pokazivaca su nizovi podataka. int a[10]; a je sam po sebi pokazivac na prvi clan tog niza, dok a[1] je ustvari pokazivac na sledecu poziciju sto je ekvivalentno *a +1 itd. Dalja upotreba je kad obradjujes podatke u funkciji. Zbog zivotnog veka promenljive tebi rezultat funkcije mora da bude povratna vrednost il se promena nece desiti. Ukoliko mu ti prosledis pokazivac on nece praviti svoje kopije nego ce sve promene raditi na konkretnom parcetu memorije pa ces dalje upotrebljavati normalno. Sad stizemo do dinamicke alokacije memorije. To je manje vise rekao sve voodoo gore iznad. Generalno pokazivaci su jako mocan koncept. E sad kako sa velikom moci dolazi velika odgovornost, ako ih ne savladas kako treba bice ti nocna mora. ![]() EDIT: Zasto nema How to C tema? xD ![]() |
![]() |
![]() |
![]() |
#158 | |
V.I.P. Programiranje
|
![]() Citat:
![]() |
|
![]() |
![]() |
Sledeći korisnik se zahvaljuje korisniku Geomaster na korisnoj poruci: | ||
Teva (29.1.2013) |
![]() |
#159 | |
Starosedelac
Član od: 23.2.2006.
Lokacija: Tamo gde su kuće od čokolade i prozori od marmelade....
Poruke: 1.579
Zahvalnice: 195
Zahvaljeno 301 puta na 171 poruka
|
![]() Citat:
![]() |
|
![]() |
![]() |
![]() |
#160 |
Starosedelac
|
![]()
Jeste int i to 4 bajta na 32-bitnim, a 8 bajtova na 64-bitnim računarima. Logično, veća magistrala, više adresnog prostora, potrebno više memorije za prikazivanje jedne adrese.
|
![]() |
![]() |
![]() |
Bookmarks sajtovi |
Tagovi |
c++, how to, pomoc, programiranje |
|
|