Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Vise

[es] :: C/C++ programiranje :: Vise

Strane: 1 2

[ Pregleda: 6010 | Odgovora: 20 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Milan Aksic

Član broj: 412
Poruke: 1053
*.ptt.yu



Profil

icon Vise11.10.2001. u 08:45 - pre 214 meseci
1.Ako se u *.h upisuju deklaracije funkcija, klasa... gde se onda upisuju definicije istih ? OK isto u *.cpp ali kako da sa main programom povezem ove ostale *.cpp fajlove (gde su samo definicije), da ne bih definicije pisao u main programu.
2.Koji su to slucajevi (konkretni) gde bih morao da pisem prog u vise *.cpp fajlova, izuzimajuci velicinu main proga?

 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 15860
*.verat.net



+6395 Profil

icon Re: Vise11.10.2001. u 10:36 - pre 214 meseci
u .h fajlovima stavljas deklaracije funkcija, a u .c (.cpp) se nalaze implementacije (tela) funkcija.

Recimo, ako tvoj projekat mnogo puta poziva funkciju IzracunajNesto() koja je implementirana u racunaj.cpp, ti stavis njenu deklaraciju u racunaj.h i u svim ostalim .cpp fajlovima stavis

#include "racunaj.h"

i onda mozes bez problema da pozivas IzracunajNesto() iz svih .cpp fajlova.

U projektu (makefajlu) treba da ukljucis sve .cpp fajlove da ne bi imao problema sa nerazresenim funkcijama.

Sto se organizacije po .cpp fajlovima tice, to je posebna prica. Trudi se da program razdelis na neke funkcionalne celine i da svaku od njih implementiras u posebnom .cpp fajlu. Time ces rasteretiti kompajler a i projekat ce biti laksi za pracenje.

Recimo, program za procesiranje teksta mozes da izdelis:

main.cpp - gde se nalazi glavno telo programa
textio.cpp - gde se nalaze f-je za citanje/pisanje
stringapi.cpp - gde se nalaze f-je za operacije nad stringovima

Pogledaj malo po SourceForge-u kako su organizovani projekti, tu mozes da naucis kako se projekat rasporedjuje. Predlazem ti da tvoj program prvo "nacrtas" kao blok semu i izdelis ga na organizacione celine. Svakom "bloku" mozes dodeliti poseban .cpp fajl. Ovo je samo jedan od nacina - ako je program klasno orijentisan, onda bi mogao implementaciju svake klase da stavljas u poseban fajl (ovo Microsoft programeri obozavaju), recimo, implementacija klase CMojaKlasa u mojaklasa.cpp a deklaracije i definicije u mojaklasa.h...


Samo da napomenem - ako je funkcija vrlo kratka i poziva se mnogo puta, mozda je pametnije tu funckiju oznaciti kao inline i staviti njenu implementaciju u .h fajl.

[Ovu poruku je menjao Ivan Dimkovic dana 10-11-2001 u 12:22 PM GMT]
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1
Demo Videos: http://www.digicortex.net/node/17
Gallery: http://www.digicortex.net/node/25
 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.ptt.yu



Profil

icon Re: Vise12.10.2001. u 01:12 - pre 214 meseci
Ovo sto sam probao radi, znaci napravim header bla.h, sa prototipovima, a definicije stavim u bla.cpp. I onda u glavnom programu mainbla.cpp ubacim pretprocesorsku direktivu #include "bla.cpp". Ovo kod mene radi ali me interesuje da li se ovako inace radi, kada se radi na vecim projektima?
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
*.fwi.com



Profil

icon Re: Vise12.10.2001. u 03:31 - pre 214 meseci
Ne kad se pisu veci projekti koristi se make. Evo sta se desava:

Napravis naprimer:

glavni.cpp
unos.cpp
izlaz.cpp

i uradis ovako nesto :

g++ -c glavni.cpp
g++ -c unos.cpp
g++ -c izlaz.cpp

i sad bi trebalo da imas glavni.o unos.o i izlaz.o

kucajuci g++ -g glavni.o unos.o izlaz.o -oprogram dobijas program ;o)

Normalno u glavni.cpp mozes da pozivas funkcije iz unos/izlaz.cpp i to je to u najkracim crticama.

 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.ptt.yu



Profil

icon Re: Vise12.10.2001. u 05:44 - pre 214 meseci
Ok ali razjasni mi samo kratko ovih nekoliko pitanja, mada mi ova porcedura sa g++ ne treba za Linux :o\

1. glavni.cpp ti je telo programa e sada da li si prototipove funkcija stavio u neki od ostalih *cpp a ne u hederu *.h i isto, da li si u tim ostalim unos.cpp i izlaz.cpp stavio definicije funkcija.

2. Kazes da se u glavni.cpp mogu pozivati funkcije iz ova ostala dva, da li se one mogu pozivati samo ako se u glavni.cpp ukljuce ta dva *.cpp fajla #include direktivama ili u ovom slucaju prevodilac razresava veze. Ako ipak prevodilac to razresava kako bi se to uradilo sa nekim npr. borlandovim prevodiocem pod DOS-om ili Win-om, nebitno :o\

3. Jednom sam naisao da sam trebao da pod borlandovim prevodiocem, u Win-u znaci, da nesto uradim u make i makefile, meni su porvsno jasne, za sta ove stvari odprilike sluze u Linuxu, ali da li se to isto ponekad koristi i pod Win-om i kako.

4. I zadnje, jasan mi je smisao deljenja source fajlova, da bi se izdvojile deklaracije klasa, funkcija, korisnickih tipova... u hedere i njihovih implementacija tj. definicija u *.cpp fajlove, ali mi nije potpuno jasno u kakvim se to projektima konkretno, zahteva deljenja samog tela programa, (znaci izuzev ovoga gore) sta se time postize, konkretno.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 15860
*.verat.net



+6395 Profil

icon Re: Vise12.10.2001. u 07:57 - pre 214 meseci
Ne ne... u #include ne ukljucujes .cpp vec .h fajlove gde se nalaze deklaracije i definicije. Na taj nacin kompajler zna koje parametre funkcija ocekuje i tako zna da izgenerise kod. Prilikom linkovanja ti linkeru das sve .o (ili .obj) fajlove koji su nastali iz .cpp da bi linker imao sve implementacije funkcija.

Znaci

- Prototipovi, definicije, konstante u .h A NE u .cpp
- u .cpp samo implementacije (tela) funkcija i clanova klasa


DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1
Demo Videos: http://www.digicortex.net/node/17
Gallery: http://www.digicortex.net/node/25
 
Odgovor na temu

m r v a

Član broj: 8
Poruke: 1843
*.yubc.net



Profil

icon Re: Vise12.10.2001. u 11:05 - pre 214 meseci
*.h fajlovi su ok za nekoga ko ce da koristi ( mozda ?) taj tvoj program i hoce da upotrebi dodatna tweakovanja, prilagodjavanja(arch, strip), a ne bi da kopa po tvom originalnom source-u ....

 
Odgovor na temu

SIckB0y

Član broj: 744
Poruke: 11
195.178.47.*



Profil

icon Re: Vise12.10.2001. u 11:28 - pre 214 meseci
Dakle ovako:

.h fajlovi sluze da bi se u njih smestila deklaracija funkcija odnosno klasa tj da bi se doticne mogle inkludovati u glavni ili neki drugi program tj .cpp fajl jer kako je vec neko rekao .cpp fajl ne mozes inkludovati.

.h fajlovi su lepa praksa koju treba primenjivati jer je tako kod mnogo citljiviji pa samim tim i laksi za odrzavanje. Naravno bitan momenat predstavlja i termin "code reuse" tj. vec napisane funkcije, odnosno module odnosno klase, nema potrebe ponovo pisati za neki drugi program.

Da zaokruzim: bez h. fajlova programske paradigme kao npr: modularno programiranje i objektno programiranje bi bile gotovo nemoguce.

P.S.

Mrvo, sta mozes da tweak-ujes u .h fajlu ???
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 15860
*.verat.net



+6395 Profil

icon Re: Vise12.10.2001. u 11:50 - pre 214 meseci
Pa da, mudro je od pocetka pisati program kako treba, jer lako moze da se desi da neko to hoce da kupi kao source a onda bi se izgubilo mnogo vremena u "ulepsavanju" koda.

Ispada da se extra trud ipak isplati na kraju.

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1
Demo Videos: http://www.digicortex.net/node/17
Gallery: http://www.digicortex.net/node/25
 
Odgovor na temu

m r v a

Član broj: 8
Poruke: 1843
*.yubc.net



Profil

icon Re: Vise12.10.2001. u 12:11 - pre 214 meseci
tweak, loš termin ... sorry ...
prevstveno sam mislio na dodatna podesavanja ( kokretan primer - ircd )
Naime server je prosto suludo kompjalirati bez prethodnog editovanja config.h fajla ....
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
165.139.17.*



Profil

icon Re: Vise12.10.2001. u 16:32 - pre 214 meseci
Ok evo idem sa jednim malim primerom koji je bas lagan :

code.c
Code:


#include "definicija_mojih_funkcija.h"

int main(){
  moja_f();
}


moja_f.c
Code:

#include "definicija_mojih_funkcija.h"
void moja_f(){
  printf("Cao ovde moja_f() \\n");
}


definicija_mojih_funkcija.h
Code:

#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>

extern void moja_f();


i sad:

Code:

gcc -c code.c
gcc -c moja_f.c
gcc -g moja_f.o code.o -o gotov_program
./gotov_program
Cao ovde moja_f() 


Eto to je ukratko primer
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
165.139.17.*



Profil

icon Re: Vise12.10.2001. u 16:42 - pre 214 meseci
Citat:
passanger je napisao:
2. Kazes da se u glavni.cpp mogu pozivati funkcije iz ova ostala dva, da li se one mogu pozivati samo ako se u glavni.cpp ukljuce ta dva *.cpp fajla #include direktivama ili u ovom slucaju prevodilac razresava veze. Ako ipak prevodilac to razresava kako bi se to uradilo sa nekim npr. borlandovim prevodiocem pod DOS-om ili Win-om, nebitno :o\


Sve filove prebacis u obj i posle sa linkerom ih povezes u izvrsni program ;o) Dao sam primer gore. Ako treba objasnjenje kako to radi ili barem kako jo to shvatam reci ;o)

Citat:

4. I zadnje, jasan mi je smisao deljenja source fajlova, da bi se izdvojile deklaracije klasa, funkcija, korisnickih tipova... u hedere i njihovih implementacija tj. definicija u *.cpp fajlove, ali mi nije potpuno jasno u kakvim se to projektima konkretno, zahteva deljenja samog tela programa, (znaci izuzev ovoga gore) sta se time postize, konkretno.


Pa recimo da pises ogorman program. Bilo bi malo tesko citati jedan file i traziti gresku. Na ovaj nacin olaksavas sebi posao pri debugovanju i cinis kod mnogo laksim za citanje. Recimo Linux kernel kad bi pisali u jednom file to bi bio dzumbus, ali to se podeli u mnogo filova pa izgleda mnogo organizovanije. Tako da mnogo lakse programeri sirom sveta mogu da poboljsavaju kernel ako znaju kako;o))
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Vise12.10.2001. u 18:28 - pre 214 meseci
Ja bi samo da dodam nesto - mozda se necete, a mozda i hocete sloziti samnom - ljudima prvo treba objazniti razliku izmedju DEKLARACIJE i DEFINICIJE funkcije, pa onda objasniti cemu sluze .H fajlovi (ja koristim .hh kad je C++ u pitanju) , cemu .CXX (ja volim .cc da koristim u C++-u :), cemu .O, cemu .so, i tako redom...


Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.ptt.yu



Profil

icon Re: Vise12.10.2001. u 20:41 - pre 214 meseci
Evo ovako, ja znam razliku izmedju deklaracije i definicije. Deklaracija je samo prototip, deklaracija funkcija clanica, deklaracija ili interfejs klasa... implementacija ili definicija je definicija tih funcija i definicija funkcija clanica iz klase ili strukture.
Deklaracije idu u *.h. implementacije idu *.cpp. Ja koristim Borland C++ 5.02, i tamo ne mogu tj. ne znam da prvo napravim *.obj fajlove.
Evo kako sam ovo shvatio, znaci npr. treba mi prog koji koristi jednu klasu i jednu f-iju, pa mi onda i objasnite gde sam ovde pogresio i/ili kako sam trebao da uradim. Mislim da je ovako najjasnije"

Code:

--------------------
//bla.cpp
#include "blabla.h"
extern void Funkcija(void);
void main(void)
{
KlasaGlupogRadnika cTupan;
Funkcija();
cTupan.SetSalary(100);
cTupan.SetService(3);
cTupan.GetSalary();
cTupan.GetService();
}
//kraj bla.cpp

--------------------
//blabla.h
//deklaracije funkcije i klase
#include <iostream.h>
class KlasaGlupogRadnika
{
public:
void SetSalary(int x);
void SetService(int x);
void GetSalary(void) const;
void GetService(void) const;
private:
int iSalary;
int iService;
}

void Funkcija(void);
//kraj blabla.h

--------------------
//blabla.cpp
//implementacije ili definicije funkcije i klase
//ove funkcije clanice su veoma kratke, tako da sam mogao da ih implementiram 
// u samoj deklaraciji cime bi one postale inline, sto se i radi, ali sam ih stavio ovde 
// da bi se razjasnilo to deljenje fajlova
void KlasaGlupogRadnika::SetSalary(int x)

iSalary = x;
}

void KlasaGlupogRadnika::SetService(int x)
{
iService = x;
}

void KlasaGlupogRadnika::GetSalary()
{
cout << "Zarada: " << iSalary << "\n";
}

void KlasaGlupogRadnika::GetService()
{
cout << "Staz: " << iService << "\n";
}

//definicija f-ije
void Funkcija()
{
cout << "Prog se startovao.\n";
cout << "Pravljenje jednog objekta...\n";
cout << "Izlazak iz f-ije...\n";
}
//kraj blabla.cpp


E sada sve ove fajlove stavim u jedan dir
Code:
C:\c_test
i u BC++ 5.02 pozovem MakeAll ili BuildAll.
Sta sam trebao ili nisam trebao da uradim, u ovom kodu, sto se tice deljenja i ukljucivanja fajlova?

[Ovu poruku je menjao passanger dana 10-12-2001 u 08:52 PM GMT]
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Vise14.10.2001. u 04:46 - pre 214 meseci
Svaki .c ili .c++ fajl se prevodi tokom kompajliranja u .o ili .obj kod.

Predlazem ti da instaliras Borlandov FreeCommand Line C/C++ kompajler i da probas malo iz komandne linije da kompajliras C/C++ source...

recimo nesto tipa:
gcc -o moj.o moj.cxx

Ova kratka komanda poziva GNU C kompajler i kaze mu da moj.cxx (C++ source file) PREVEDE u objektni fajl pod nazivom moj.o

Najcesce projekti sadrze VISE .cxx fajlova, tako da se ti fajlovi (source kodovi) PREVEDU u objektni kod (iliti .o ili .obj fajlove) i onda LINKER preuzme posao i sve te objektne fajlove poveze u jedan jedini IZVRSNI FAJL.

Nadam se da sam bar malo pojasnio sve... Ostali ljudi koji redovno posecuju ovaj forum su se takodje iz petnih zila potrudili da dobro objasne ovo, tako da pocetnici zaista imaju sta da nauce iz ove diskusije! Svaka cas!

Pozdrav svima


Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

SIckB0y

Član broj: 744
Poruke: 11
195.178.47.*



Profil

icon Re: Vise15.10.2001. u 07:51 - pre 214 meseci
U kodu navedenom gore fali ";" (tackazarez) ne kraju definicije klase iza }.
 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.ptt.yu



Profil

icon Re: Vise15.10.2001. u 15:21 - pre 214 meseci
:) Da u pravu si, brzo sam pisao, samo da bih napravio neki primer. Anyway ipak mi to nije odgovor, pa pitam jos jednom sve:
Post gore... Da li se ovako deli fajl, i da li sam to dobro uradio (post gore), ako nisam sta sam trebao da uradim.
 
Odgovor na temu

SIckB0y

Član broj: 744
Poruke: 11
195.178.47.*



Profil

icon Re: Vise17.10.2001. u 10:18 - pre 214 meseci
OK je...
 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.ptt.yu



Profil

icon Re: Vise17.10.2001. u 13:42 - pre 214 meseci
Pa ne, nije OK. Ako budes pokusao da ga prevedes, videces da ne valja. E sada potrebna mi je pomoc da vidim sta to nisam dobro uradio.
 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.ptt.yu



Profil

icon Re: Vise19.10.2001. u 23:04 - pre 214 meseci
Hoce li mi neko dati odgovor, u vezi onog koda gore?
 
Odgovor na temu

[es] :: C/C++ programiranje :: Vise

Strane: 1 2

[ Pregleda: 6010 | Odgovora: 20 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.