[ NooND @ 06.12.2007. 11:57 ] @
Koji je najbolji kompajler za C. |
[ NooND @ 06.12.2007. 11:57 ] @
[ perun_ @ 06.12.2007. 23:51 ] @
gcc
![]() [ glorius @ 06.12.2007. 23:56 ] @
Onaj koji uvek kaze: "0 errors,0 warnings" :)
Ja koristim Visual Studio... Ako si bas nesiguran... aj da napisemo nas compiler :) [ perun_ @ 07.12.2007. 01:18 ] @
Visual Studio?! WTF?
![]() Nemoj to. Samo to ne! ![]() Pokaze 0 errors 0 warnings, a ovamo cuveni Don't Send. tztztzt Nikada vise.. ![]() [ tosa @ 07.12.2007. 07:44 ] @
Citat: glorius: Onaj koji uvek kaze: "0 errors,0 warnings" :) GCC će imati dosta više upozorenja i grešaka nego VC, što je izuzetno dobra osobina istog (pored mnogih drugih) zato što na vreme možeš da uočiš neke greške u svom programu i otkloniš ih. [ butcher87 @ 07.12.2007. 11:44 ] @
Moze li neko da postavi link gde moze da se "skine" gcc compiler. Hvala!
[ perun_ @ 07.12.2007. 14:49 ] @
[ icobh @ 07.12.2007. 19:06 ] @
Gcc zna da nervira i to mnogo... Npr. meni nije mogao da skonta koji konstruktor treba da pozove, da li onaj obični ili konstruktor kopije! Wtf?! Ja napravio klasu, napisao obični konstruktor (bez parametara) i konstruktor kopije (ima parametar koji je referenca na objekat te klase) i on ne zna koji treba i kad da pozove...
Zato ja na Win-u koristim BCC a na Linuxu je ipak malo prostor sužen što se tiče kvalitetnih rješenja... P.S. Evo ovdje ima nekih kompajlera, možda vrijedi probati... [ cirra @ 07.12.2007. 21:07 ] @
Dajte neki kompajler FRE koji ce kompajlirati graficke funkcije
(crtanje kruznica,lukova,linija ......itd) Radim to trenutno u TURBO C 2.o (radi pod DOS-om ) ali hocu neki koji ovo raditi pod WIN POz [ perun_ @ 08.12.2007. 00:44 ] @
@icobh
Ovo za konstruktor kopije je glupost. Ne znam sa kojom verzijom gcc-a si to probao, ali nije tacno. Hajde molim te ostavi sporni kod da pogledamo. NEMOGUCE! Provereno radi sasvim korektno. Code: #include <iostream.h> class X { public: X(); X(X& ); int vratiX(); void postaviX(int); private: int c; }; X::X() { this->c=0; } X::X(X& a) { this->c=a.c; } int X::vratiX() { return c; } void X::postaviX(int a) { this->c=a; } int main() { X *j=new X; cout<<j->vratiX()<<"\n"; j->postaviX(5); X *d=j; X *s=new X(*j); cout<<d->vratiX()<<"\n"; cout<<s->vratiX()<<"\n"; return 0; } Zatim: Code: PeRuN@slack:~/Desktop/New Folder$ g++ proba.cpp -Wno-deprecated PeRuN@slack:~/Desktop/New Folder$ ./a.out 0 5 5 PeRuN@slack:~/Desktop/New Folder$ Dakle, gde je tu bilo kakva zabuna oko konstruktora koji se poziva? Ocigledno je pozvan konstruktor kopije... [Ovu poruku je menjao perun_ dana 08.12.2007. u 02:09 GMT+1] [ glorius @ 08.12.2007. 01:30 ] @
Hehe... Zanimljivo je sve to oko kompajlera... I oni su, naravno, bagoviti...
Nazalost, nisam ni video gcc pa ne mogu da poredim niti da favorizujem... Svi ih uzimamo zdravo za gotovo... Pa i debuger... Mozda ( verovatno, sigurno ) i on ima bug-ova... @perun_ man Sto se tice famoznog 'Dont send-a' ( gori info dialog nisu mogli da smisle :) ),mislim da ne spada u errors/warrnings vec u exceptions :) Da li je u gcc NULL pointer, koji se slucajno koristi u gcc, error/warrning? [ icobh @ 08.12.2007. 10:49 ] @
@perun_
Ma bravo! Ako je nešto što tebi ne ide na ruku, a čisto sumnjam da je GCC tvoj proizvod, odmah je glupost! How Yes No. Sad mi uopšte ne pada na pamet da postujem verziju gcc-a a kamo li problematični kôd... [ xeron @ 08.12.2007. 14:09 ] @
Dev c++ 5 beta.
Citat: Bloodshed Dev-C++ is a full-featured Integrated Development Environment (IDE) for the C/C++ programming language. It uses Mingw port of GCC (GNU Compiler Collection) as it's compiler. Dev-C++ can also be used in combination with Cygwin or any other GCC based compiler. Features are : - Support GCC-based compilers . . . [ perun_ @ 08.12.2007. 14:22 ] @
@icobh
Naravno da nije moj proizvod (kamo srece da jeste ;) ). Zar nisam kodom dokazao da se gcc savrseno dobro snalazi sa konstruktorom kopije? Samim tim i da je to sto si ti napisao apsolutna glupost i neistina? Bez uvrede, ali zesce si lupio! [ icobh @ 08.12.2007. 17:48 ] @
Evo šta kaže gcc:
Code: vjezba2.cpp: In function `int main()': vjezba2.cpp:232: error: no matching function for call to `Skup::Skup(Skup)' vjezba2.cpp:52: note: candidates are: Skup::Skup(Skup&) vjezba2.cpp:241: error: no matching function for call to `Skup::Skup(Skup)' vjezba2.cpp:52: note: candidates are: Skup::Skup(Skup&) vjezba2.cpp:255: error: no matching function for call to `Skup::unija(Skup)' vjezba2.cpp:105: note: candidates are: Skup Skup::unija(Skup&) Evo kôda: Code: //Valjda konacna verzija ovog zadatka #include <iostream> using namespace std; class Skup { public: //F-je prema uslovima zadatka Skup (); ~Skup (); Skup (Skup &); Skup unija (Skup &); Skup presjek (Skup &); friend void savrseni_brojevi (Skup &); friend void printSkup (Skup &); friend void napuniSkup (Skup &); friend void dekart (Skup &, Skup&); void ubaciElement (int); void izbaciElement (int); bool jednak (Skup &); int broj_skupova (); private: //Niz gdje ce biti smjesteni podaci int niz[101]; //Brojac skupova static int bs; //Obicna f-ja za provjeru da li je neki broj unutar [0,100] int u_granici(int); }; //Setujemo brojac skupova na 0 int Skup :: bs = 0; //Konstruktor Skup :: Skup () { //Setujemo sve vrijednosti niza na 0 for (int i=0; i<=100; i++) niz[i]=0; //Povecavamo broj skupova bs++; } //Konstruktor kopije Skup :: Skup (Skup &sk) { //Posto smo unistli onaj pravi konstruktor kopije, //moramo praviti identicnu kopiju objekta for (int i=0; i<=100; i++) niz[i] = sk.niz[i]; //Povecavamo broj skupova bs++; } //Destruktor Skup :: ~Skup () { //Smanjujemo broj skupova bs--; } //F-ja vraca broj skupova int Skup :: broj_skupova () { return bs; } //F-ja za dodavanje elementa u skup void Skup :: ubaciElement (int el) { //Ako je element u granici [0,100] dodajemo ga u skup if (u_granici(el)) niz[el]=1; //Ako nije u granici, obavjestimo korisnika else cout << "Elementi skupa moraju biti unutar [0,100]" << endl; } //F-ja za brisanje elementa iz skupa void Skup :: izbaciElement (int el) { //Ako je element u skupu, izbrisemo ga if (niz[el]==1) niz[el]=0; } //F-ja za provjeru jednakosti 2 skupa bool Skup :: jednak (Skup &sk) { for (int i=0; i<=100; i++) //Ako su 2 elementa razlicita odmah kazemo da su skupovi razliciti if (niz[i] != sk.niz[i]) return 0; return 1; } //F-ja za uniju 2 skupa Skup Skup :: unija (Skup &sk) { Skup tmp; for (int i=0; i<=100; i++) //Ako se element nalazi u nekom od 2 skupa, dodamo ga u novi skup if (niz[i] || sk.niz[i]) tmp.niz[i]=1; return tmp; } //F-ja za presjek 2 skupa Skup Skup :: presjek (Skup &sk) { Skup tmp; for (int i=0; i<=100; i++) //Ako se element ne nalazi u oba skupa , dodamo ga u novi skup if (niz[i] && sk.niz[i]) tmp.niz[i]=1; return tmp; } //F-ja za punjenje postojeceg skupa novim elementima void napuniSkup (Skup &sk) { int el; //Obavjestenje korisniku cout << "Niz se unosi sve dok je u granici [0,100]" << endl; cout << "Svi elementi poslije bice ignorisani!" << endl; //Ukoliko se unese broj koji nije u granici, iskace se iz while petlje do { //Unesemo neki broj cin >> el; //Ako je element u granici, dodamo ga u skup if (sk.u_granici(el)) sk.niz[el]=1; } while (sk.u_granici(el)); } //F-ja za ispis elemenata skupa void printSkup (Skup &sk) { for (int i=0, br=0; i<=100; i++) if (sk.niz[i]==1) { //Ovaj br je cisto estetske prirode i sluzi se nebi ispisao zarez //pa onda prvi element skupa, jer nema logike if (br!=0) cout << ","; cout << i; br++; } cout << endl; } void savrseni_brojevi (Skup &sk) { int tmp1 = 0, i, j; for(i=0; i<=100; i++) { if (sk.niz[i]==1){ for(j=1; j<i; j++) if (i % j == 0) tmp1+=j; if (i == tmp1 && tmp1 != 0) cout << i; tmp1=0; } } cout << endl; } void dekart (Skup &sk1, Skup &sk2) { int br=0; for (int i=0; i<=100; i++) for (int j=0; j<=100; j++){ if(sk1.niz[i] == 1 && sk2.niz[j] ==1){ if (br!=0) cout << ","; cout << "(" << i << "," << j << ")"; br++; } } cout << endl; } //Pomocna f-ja za provjeru da li je element u granici [0,100] int Skup :: u_granici (int el) { if ((el>=0) && (el<=100)) return 1; return 0; } int main() { Skup a,b; napuniSkup(a); napuniSkup(b); cout << "Skup a: "; printSkup(a); cout << "Savrseni brojevi: "; savrseni_brojevi(a); cout << "Skup b: "; printSkup(b); cout << "Do sada ima " << b.broj_skupova() << " skupa" << endl; cout << "Savrseni brojevi: "; savrseni_brojevi(b); //Odradimo uniju Skup tmp1; tmp1 = a.unija(b); //Ispisemo uniju skupova cout << "Unija: "; printSkup(tmp1); cout << "Do sada ima " << a.broj_skupova() << " skupa" << endl; //Odradimo presjek Skup tmp2 = a.presjek(b); //Ispisemo presjek skupova cout << "Presjek: "; printSkup(tmp2); cout << "Do sada ima " << a.broj_skupova() << " skupa" << endl; Skup c; cout << "\nUnesite treci skup!\n"; napuniSkup(c); Skup tmp3 = c.unija(a.unija(b)); cout << "Unija (I U II U II): "; printSkup(tmp3); cout << "\nDekartov proizvod 2 skupa:\n"; dekart(a,b); getchar(); return EXIT_SUCCESS; } A evo šta je profesor Malbaški rekao: [att_img] [ Jcod3r @ 09.12.2007. 10:59 ] @
Visual Studio 6.0 !
[ icobh @ 09.12.2007. 19:11 ] @
Pa gdje je onaj što je rekao da sam ja lupio?!
@cameleo2401 Visual Studio nije kompajler. On je IDE. [ perun_ @ 09.12.2007. 20:11 ] @
Tu sam.. Imam mnogo obaveza, te ne stigoh odmah. kazi mi da li je u redu sledece:
Compajliranje... Code: PeRuN@slack:~/Desktop/New Folder$ g++ proba.cpp PeRuN@slack:~/Desktop/New Folder$ Dakle, cisto.... Code: PeRuN@slack:~/Desktop/New Folder$ ./a.out Niz se unosi sve dok je u granici [0,100] Svi elementi poslije bice ignorisani! 1 7 3 6 102 Niz se unosi sve dok je u granici [0,100] Svi elementi poslije bice ignorisani! 11 17 13 16 102 Skup a: 1,3,6,7 Savrseni brojevi: 6 Skup b: 11,13,16,17 Do sada ima 2 skupa Savrseni brojevi: Unija: 1,3,6,7,11,13,16,17 Do sada ima 3 skupa Presjek: Do sada ima 4 skupa Unesite treci skup! Niz se unosi sve dok je u granici [0,100] Svi elementi poslije bice ignorisani! 21 27 23 26 101 Unija (I U II U II): 1,3,6,7,11,13,16,17,21,23,26,27 Dekartov proizvod 2 skupa: (1,11),(1,13),(1,16),(1,17),(3,11),(3,13),(3,16),(3,17),(6,11),(6,13),(6,16),(6,17),(7,11),(7,13),(7,16),(7,17) PeRuN@slack:~/Desktop/New Folder$ Elem, da rezimiramo. Svoje greske nemoj pridavati kompajleru, tako nikada nista neces nauciti... Evo i sta je izmenjeno, a ti razmisli zasto. Sledeca tema za razmisljanje je ANSI standard u GCC-u i onom "monopolistickom"... Ako ne bude jasno pitaj tog tvog Malbaskog! ![]() Ne vidim razlog da se prozivamo, ali je bedno tako nesto uraditi kada nisam bio tu, postoji i PM ili slicno.. Dobro, evo ovako: Code: //Valjda konacna verzija ovog zadatka #include <iostream> using namespace std; class Skup { public: //F-je prema uslovima zadatka Skup (); ~Skup (); Skup (const Skup &); Skup unija (const Skup &); Skup presjek (const Skup &); friend void savrseni_brojevi (const Skup &); friend void printSkup (const Skup &); friend void napuniSkup (Skup &); friend void dekart (const Skup &,const Skup&); void ubaciElement (int); void izbaciElement (int); bool jednak (const Skup &); int broj_skupova (); private: //Niz gdje ce biti smjesteni podaci int niz[101]; //Brojac skupova static int bs; //Obicna f-ja za provjeru da li je neki broj unutar [0,100] int u_granici(int); }; //Setujemo brojac skupova na 0 int Skup :: bs = 0; //Konstruktor Skup :: Skup () { //Setujemo sve vrijednosti niza na 0 for (int i=0; i<=100; i++) niz[i]=0; //Povecavamo broj skupova bs++; } //Konstruktor kopije Skup :: Skup (const Skup &sk) { //Posto smo unistli onaj pravi konstruktor kopije, //moramo praviti identicnu kopiju objekta for (int i=0; i<=100; i++) niz[i] = sk.niz[i]; //Povecavamo broj skupova bs++; } //Destruktor Skup :: ~Skup () { //Smanjujemo broj skupova bs--; } //F-ja vraca broj skupova int Skup :: broj_skupova () { return bs; } //F-ja za dodavanje elementa u skup void Skup :: ubaciElement (int el) { //Ako je element u granici [0,100] dodajemo ga u skup if (u_granici(el)) niz[el]=1; //Ako nije u granici, obavjestimo korisnika else cout << "Elementi skupa moraju biti unutar [0,100]" << endl; } //F-ja za brisanje elementa iz skupa void Skup :: izbaciElement (int el) { //Ako je element u skupu, izbrisemo ga if (niz[el]==1) niz[el]=0; } //F-ja za provjeru jednakosti 2 skupa bool Skup :: jednak (const Skup &sk) { for (int i=0; i<=100; i++) //Ako su 2 elementa razlicita odmah kazemo da su skupovi razliciti if (niz[i] != sk.niz[i]) return 0; return 1; } //F-ja za uniju 2 skupa Skup Skup :: unija (const Skup &sk) { Skup tmp; for (int i=0; i<=100; i++) //Ako se element nalazi u nekom od 2 skupa, dodamo ga u novi skup if (niz[i] || sk.niz[i]) tmp.niz[i]=1; return tmp; } //F-ja za presjek 2 skupa Skup Skup :: presjek (const Skup &sk) { Skup tmp; for (int i=0; i<=100; i++) //Ako se element ne nalazi u oba skupa , dodamo ga u novi skup if (niz[i] && sk.niz[i]) tmp.niz[i]=1; return tmp; } //F-ja za punjenje postojeceg skupa novim elementima void napuniSkup (Skup &sk) { int el; //Obavjestenje korisniku cout << "Niz se unosi sve dok je u granici [0,100]" << endl; cout << "Svi elementi poslije bice ignorisani!" << endl; //Ukoliko se unese broj koji nije u granici, iskace se iz while petlje do { //Unesemo neki broj cin >> el; //Ako je element u granici, dodamo ga u skup if (sk.u_granici(el)) sk.niz[el]=1; } while (sk.u_granici(el)); } //F-ja za ispis elemenata skupa void printSkup (const Skup &sk) { for (int i=0, br=0; i<=100; i++) if (sk.niz[i]==1) { //Ovaj br je cisto estetske prirode i sluzi se nebi ispisao zarez //pa onda prvi element skupa, jer nema logike if (br!=0) cout << ","; cout << i; br++; } cout << endl; } void savrseni_brojevi (const Skup &sk) { int tmp1 = 0, i, j; for(i=0; i<=100; i++) { if (sk.niz[i]==1){ for(j=1; j<i; j++) if (i % j == 0) tmp1+=j; if (i == tmp1 && tmp1 != 0) cout << i; tmp1=0; } } cout << endl; } void dekart (const Skup &sk1,const Skup &sk2) { int br=0; for (int i=0; i<=100; i++) for (int j=0; j<=100; j++){ if(sk1.niz[i] == 1 && sk2.niz[j] ==1){ if (br!=0) cout << ","; cout << "(" << i << "," << j << ")"; br++; } } cout << endl; } //Pomocna f-ja za provjeru da li je element u granici [0,100] int Skup :: u_granici (int el) { if ((el>=0) && (el<=100)) return 1; return 0; } int main() { Skup a,b; napuniSkup(a); napuniSkup(b); cout << "Skup a: "; printSkup(a); cout << "Savrseni brojevi: "; savrseni_brojevi(a); cout << "Skup b: "; printSkup(b); cout << "Do sada ima " << b.broj_skupova() << " skupa" << endl; cout << "Savrseni brojevi: "; savrseni_brojevi(b); //Odradimo uniju Skup tmp1; tmp1 = a.unija(b); //Ispisemo uniju skupova cout << "Unija: "; printSkup(tmp1); cout << "Do sada ima " << a.broj_skupova() << " skupa" << endl; //Odradimo presjek Skup tmp2 = a.presjek(b); //Ispisemo presjek skupova cout << "Presjek: "; printSkup(tmp2); cout << "Do sada ima " << a.broj_skupova() << " skupa" << endl; Skup c; cout << "\nUnesite treci skup!\n"; napuniSkup(c); Skup tmp3 = c.unija(a.unija(b)); cout << "Unija (I U II U II): "; printSkup(tmp3); cout << "\nDekartov proizvod 2 skupa:\n"; dekart(a,b); getchar(); return EXIT_SUCCESS; } Veliki, iskreni pozdrav!!!! [ perun_ @ 09.12.2007. 20:15 ] @
Jos samo jedna stvar.. Probaj da pravis kojekakve strukture (sa razlicitim "osnovnim" tipovima) i vidi sta vraca sizeof, a zatim razmisli koliko stvarno iznosi velicina te strukture, i kako se to "bahato" zaokruzuje...
[ icobh @ 09.12.2007. 21:05 ] @
Mene zanima jedna stvar. Zašto mogu da ovaj kôd kojeg sam ja lično pisao, da kompajliram kod sebe, kolege, na faxu i to sa bcc-om, msvc-om ali ne i sa gcc-om? Zašto to? Zašto to sad jedno const igra toliku ulogu?
[ perun_ @ 09.12.2007. 21:20 ] @
Reako sam vec da razmislis o ANSII-ju.. Usput, najbolja literatura iz ove oblasti "C++ izvornik", mozes i tu pogledati. To je samo jos jedan plus za GCC. Dakle, mora se pisati "kako je Bog rekao" ( a ne Bill Gates, ili sta ti ja znam ko, dobar je onaj fazon; Koliko je potrebno Microsoftovih(mogu se i uzeti i jos neke velike firme) inzenjera da zamene sijalicu? Nijedan, proglasice mrak za standard!
![]() ![]() [ icobh @ 09.12.2007. 21:56 ] @
Kompajlira i ovaj sa const. Ali ja imam osjećaj da gcc ništa nema po default-u. Zar se mora ispred imena f-je pisati int, ako f-ja vraća cjelobrojnu vrijednost. Int je valjda podrazumijevano...
[ perun_ @ 09.12.2007. 22:14 ] @
Definitivno mora stajati int ispred.. Nisam ni znao da je to default... Hmmm
[ cirra @ 10.12.2007. 08:31 ] @
kOLEGE FORUMASI
Ima li ko da odgovori koji je kompajler najbolji za grafiku [ Časlav Ilić @ 10.12.2007. 11:19 ] @
Citat: icobh: Mene zanima jedna stvar. Zašto mogu da ovaj kôd kojeg sam ja lično pisao, da kompajliram kod sebe, kolege, na faxu i to sa bcc-om, msvc-om ali ne i sa gcc-om? Zašto to? Zašto to sad jedno const igra toliku ulogu? Pretpostavljam zato što standard (ANSI, ISO, šta li) negde kaže da je prototip kopirajućeg konstruktora je T (const T &) i nikoji drugi. GCC ti onda u poruci greške praktično kaže da tvoja klasa nema ispravan kopirajući konstruktor. Dakle, GCC se podrazumevano (bez posebnih opcija) ponaša po standardu — što je dobro — dok ti na faksu i kod kolege ne — što je loše. Kao što Nemanja već reče. E sad, i standarde pišu ljudi, pa je uvek bitno uočiti zašto je dobro tako kako je standard propisao. Kopirajući se poziva u mnogim situacijama nad objektom koji je privremeno konstruisan u lancu naredbi. Tada, ako bi mu bilo dozvoljeno da prima nekonstantni upućivač, prvo bi mogao da izmeni taj privremeni objekat (znači mogući gubitak podataka), i drugo ne bi mogao više da funkcioniše kada se u lancu pojavi konstantan objekat. Zato nema smisla da kopirajući prima nekonstantni upućivač. Na strani izvedbe, GCC bi (kao i ti drugi) po uobičajenom mehanizmu poklapanja poziva i prototipa mogao komotno da pozove onaj sa nekonstantnim upućivačem. Dalje, ako ispratiš redosled poziva pri izvršavanju, videćeš da GCC nigde nije ni pozvao kopirajući; npr. Skup tmp3(c.unija(a.unija(b))), uz drugačije definicije ovih funkcija, moglo je biti i brzinski optimalnije Skup tmp3; unija(a, unija(b, unija(c, tmp3))), što je GCC primetio i sam transformisao u izlaznom kôdu. Drugim rečima, GCC je em mogao da pozove prvobitni kopirajući, em mu kopirajući čak nije ni trebao, pa ti je opet prijavio grešku. To znači da su se programeri koji rade na GCCu morali potruditi da dodaju ovo kao posebnu mogućnost, a koja se tebi čini kao njegova loša osobina :) Kad već pomenuh gore automatsku optimizaciju, probaj sa tim BCCom i MSVCom da prisiliš poziv kopirajućeg. Npr. staviš Skup tmp1b(tmp1);, i daj kopirajućem da nešto ispiše, da budeš siguran da je pozvan. Da li tada kôd i dalje prolazi? (Moguće je da su se zeznuli pri optimizaciji, da ne proveravaju prototip kopirajućeg kada primete da nije ni potreban.) [ icobh @ 10.12.2007. 13:09 ] @
@Časlav Ilić
Probao sam: Code: Skup tmp1b(tmp1); gdje sam konstruktor kopije prvo napisao bez const u parametru pa sam onda sa const. I MSVC i BCC gutaju oba kôda i sve radi. Konstruktor kopije se regularno poziva u oba slučaja. Samo GCC neće bez const. @perun_ Npr. Ovaj kôd guta GCC a vidi se da fali int prije main. Dok MSVC kaže da u C++-u ne važi int-default. BCC takođe kompajlira bez problema... Code: #include <iostream> using namespace std; main() { system("pause"); return EXIT_SUCCESS; } Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|