[ eruanntion @ 24.09.2005. 14:37 ] @
Zasto se gotovo uvek pise int main()... , kada je glavna funkcija main() funkcije pozivanje drugih, dok ona sam uglavnom ne vraca nikakvu vrednost??? |
[ eruanntion @ 24.09.2005. 14:37 ] @
[ IDE @ 24.09.2005. 14:55 ] @
cini mi se da je u pitanju razlkika izmedju c-a i c++-a....
cini mi se da je u c++-u standard takav da main treba da vraca int, a u c-u ne mora.... tako nesto... bilo mi je nevazno pa nisam mnogo citao o tome... [ markom @ 24.09.2005. 14:59 ] @
Svaki program koji se izvršava u operativnom sistemu po završetku vrati izlaznu vrednost (exit code). Ovo je upravo izlazna vrednost funkcije "main".
Marko. [Ovu poruku je menjao markom dana 24.09.2005. u 15:59 GMT+1] [ eruanntion @ 24.09.2005. 18:08 ] @
Znaci, ova vracena vrednost koja se dostavlja OS-u predstavlja zavrsnicu programa! Ali sta se desava ako main funkciju deklarisem sa void? Prepravio sam neke lakse programcice, deklarisuci main umesto sa int sa void ( i naravno bez return-a na kraju), i isto su radili sasvim ok! To mi nije jasno! Kako da OS dozvoljava da main funkcija koja je deklarisana sa void radi jednako dobro kada je deklarisana sa int? Da li to znaci da OS izvrsava program, ali posto nema nikakve vrednosti na kraju, on ga uopste ne zavrsava?
[ Burgos @ 24.09.2005. 18:22 ] @
Po ANSI C standardu (a i C++) main MORA da vraca int vrednost.
Jeste li se ikada susreli sa onim: 'Program xxx terminated with exit code yyy' Znaci, programi ce raditi i ako main ne vraca vrednost, ali po standardu to NIJE DOZVOLJENO. [Ovu poruku je menjao Burgos dana 24.09.2005. u 19:23 GMT+1] [ srdjandakic @ 24.09.2005. 19:13 ] @
[ leka @ 24.09.2005. 19:17 ] @
O ovome se diskutovalo na ES-u u vise navrata... Ukratko - int main() je STANDARD i treba to koristiti. void main() je za lenje (lose) programere koje mrzi da kucaju malo duzu liniju...
[ Not now, John! @ 24.09.2005. 20:20 ] @
Kod int main(), možeš komadnom return 0 da izađeš iz programa, a to često zatreba. Kod void main() ne možeš koristiti return.
[ eruanntion @ 24.09.2005. 23:52 ] @
Sve u svemu, koliko ja kapiram, sistematski nema gotovo nikakve razlike, samo se trazi da se postuje standard!
[ eruanntion @ 24.09.2005. 23:56 ] @
Citat: Kod int main(), možeš komadnom return 0 da izađeš iz programa, a to često zatreba. Kod void main() ne možeš koristiti return. Mislim da se moze koristiti return, ali se ne navodi nikakva vrednost, odnosno, pis'o, ne pis'o, isto ti se 'vata! [ _owl_ @ 24.09.2005. 23:57 ] @
U oba slucaja mozes koristiti komandu return, samo u slucaju kada je main funkcija deklarisana da vraca int mozes pomocu komande return okruzenju vratiti status sa kojim se izvrsio program (npr pogledaj u linux-u koja je vrednost environment promenljive $?).Kada koristis void main najverovatijne se uvek vraca 0.
[ X Files @ 25.09.2005. 10:37 ] @
Koliko sam pregledao, C++ standard OBAVEZUJE povratnu vrednost, dok kod C-a
to nije slucaj, i to se smatra NEDORECENOSTCU koju bi bilo pametno ispraviti... Npr: http://homepages.tesco.net/~J....FGA/legality-of-void-main.html P.S. Jedino ukoliko dokument nije star pa se to u medjuvremenu korigovalo... [Ovu poruku je menjao X Files dana 25.09.2005. u 11:40 GMT+1] [ random @ 25.09.2005. 11:06 ] @
C89 standard dozvoljava main(), dok noviji C99 standard dozvoljava samo int main ( void ) i int main ( int argc, char *argv[] ).
[ edmir @ 25.09.2005. 11:15 ] @
I mene je isto to kopkalo.
PA dobro OK za izlazne vriejdnosti ali sta su ulazni parametri I ja se osjecam lijen kad je ovo u pitanju. [ Burgos @ 25.09.2005. 11:34 ] @
int argc - broj ulaznih parametara
char *argv[] - niz ulaznih parametara Primer: Code: #include <stdio.h> int main(int argc, char *argv[]){ printf("Ime EXE fajla: %s\n\n", argv[0]); int i = 0; //Ispisuje sve parametre for(i = 0; i < argc; i++) printf("%d:\t%s\n", i, argv[i]); return 0; } [Ovu poruku je menjao Burgos dana 25.09.2005. u 12:35 GMT+1] [ X Files @ 25.09.2005. 11:34 ] @
Code: #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int i; printf( "Broj argumenata: %d\n\n", argc ); /* ovde bi trebao da ispise celu liniju sa argumentima, ako ih ima */ for ( i=0; i<argc; i++ ) printf( "%s ", argv[i] ); printf( "\n"); system( "PAUSE" ); return 0; } Ulazni parametri su ti kada kucaš u Command Prompt-u, npr: dir c:\windows\system32 >output.txt pa je: argc=3 argv[0] == "dir" argv[1] == "c:\windows\system32" argv[2] == ">output.txt" Slicno je i za Windows kada na primer duplim klikom probas da otvoris neki fajl, pa se poziva pridruzeni program kome se opet prosledjuje selektovani fajl kao argument, itd... Citat: C89 standard dozvoljava main(), dok noviji C99 standard dozvoljava samo int main ( void ) i int main ( int argc, char *argv[] ). Znači, to je to... Evo ovde: ISO/IEC 9899:1999 http://www.nirvani.net.nyud.net:8090/docs/ansi_c.pdf Tačka 5.1.2.2.1 Poslednji put kada sam koristio čist C za konkretne stvari (izuzev za nečije seminarske radove) bio je za C=Commodore Amiga računare koji su imali takozvani Aztec C i Lattice C kompajlere, a to je bilo definitivno pre ove druge revizije... To je bilo vreme kada je Bill Gates i dalje bio u DOS-u, dok su Commodore i Atari vec imali svoje graficke operativne sisteme koji su celi stajali na jednu 720 ili 880KB disketu ;) [Ovu poruku je menjao X Files dana 25.09.2005. u 12:40 GMT+1] [Ovu poruku je menjao X Files dana 25.09.2005. u 12:53 GMT+1] [ random @ 25.09.2005. 12:06 ] @
Citat: X Files: Ulazni parametri su ti kada kucaš u Command Prompt-u, npr: dir c:\windows\system32 >output.txt pa je: argc=3 argv[0] == "dir" argv[1] == "c:\windows\system32" argv[2] == ">output.txt" Nije tačno. >output.txt neće biti prosleđeno programu kao parametar, već će stdout biti vezan za taj fajl. Za ovo se brine interpreter komandi. [ X Files @ 25.09.2005. 13:59 ] @
Da. Moja greska...
[ PeRuN_RoJs @ 28.09.2005. 00:49 ] @
Ako sve radi sa void (a radi), zasto bi se iko petljao sa int?
Void main () do tokija!!!! =) [ _VampiR_ @ 28.09.2005. 08:07 ] @
Sa void main() mozda i moze proci neki jednostavniji programcic koji nece pozivati ni jedan drugi. Medjutim, sta ako imate shell skriptu koja poziva program u, npr. cetiri instance, i kada skripta mora znati da li je program dobro zavrsen, odnosno ako nije zasto nije?
Tu se koriste najvise ti exit kodovi i tu bez int main( ... ) ne ide. [ NrmMyth @ 28.09.2005. 20:34 ] @
Zasto pravo, kad moze krivo !?!?
[ Dragi Tata @ 29.09.2005. 03:07 ] @
Citat: PeRuN_RoJs: Ako sve radi sa void (a radi), zasto bi se iko petljao sa int? Sve radi, osim kad ne radi. Osim toga, ako ste primetili, kraće je kucati int nego void. [ blaza @ 29.09.2005. 06:43 ] @
Nije kraće, zato što kasnije moraš da kucaš:
Code: Ko ne plati na mostu, platiće na ćupriji:) Zapravo, standard ti dozvoljava da definišeš funkciju main:return x; Code: a da ne upotrebiš:int main(... Code: prilikom čega se kompajler ponaša kao da je našao:return x; Code: Jedini problem je što svaki kompajler ne podržava ovaj deo standarda.return 0; [ Dragi Tata @ 29.09.2005. 14:37 ] @
Citat: blaza: Zapravo, standard ti dozvoljava da definišeš funkciju main: Code: a da ne upotrebiš:int main(... Code: prilikom čega se kompajler ponaša kao da je našao:return x; Code: Jedini problem je što svaki kompajler ne podržava ovaj deo standarda.return 0; E, to, vidiš :) Inače, koliko znam, svaki iole noviji kompajler poštuje ovo, uključujući i dva najpopularnija MSVC 7.x i GCC 3.x [ Goran Arandjelovic @ 29.09.2005. 20:31 ] @
Jel moze neko da objasni ukratko gde odlazi return iz main funckije?
[ NrmMyth @ 29.09.2005. 21:32 ] @
Procesu koji ga je pozvao, uglavno je to OS.
[ random @ 30.09.2005. 12:56 ] @
NrmMyth: Procesu koji ga je pozvao, uglavno je to OS.[/quote]
A OS je jedan proces? [ NrmMyth @ 30.09.2005. 21:32 ] @
Cemo sarkasticnost, gospodine?
[ random @ 30.09.2005. 23:34 ] @
Pa otud što nisam razumeo "uglavno je to OS.". Prvi deo rečenice je ok, ali taj drugi ne razumem.
[ NrmMyth @ 01.10.2005. 08:55 ] @
Izvinjavam se na svojoj ne akuratnosti pi odgovaranju na ovom topicu, vidim da vas je to uznemirilo.
Sta, neznan ni ja koji proces iz OS pokrece momkove conzolne aplikacije, pa ni moje, pa sta necu umrit zbog toga. Zasto vi odmah nista ponudili ispravku na moj post, ako vam ne odgovara? [ random @ 01.10.2005. 09:49 ] @
Citat: Sta, neznan ni ja koji proces iz OS pokrece momkove conzolne aplikacije Ako pod terminom conzola misliš na komandnu liniju (vidi objašnjenje pravog značenja reči "konzola" ovde), onda je to upravo taj interpreter komandi (shell), i tu nema šta da se ne zna. Citat: Zasto vi odmah nista ponudili ispravku na moj post, ako vam ne odgovara? Jer nisam mogao da dam detaljan odgovor. Ali evo ispravke: Izlazni status se šalje roditeljskom procesu. Često je to interpreter komandi (ako je program startovan iz komandne linije). A pitanje je po meni dobro jer nisam potpuno siguran u mehanizam kojim se ovo obezbeđuje na različitim arhitekturama (Unix, Windows..), koje koriste različite mehanizme (funkcije) za kreiranje procesa, pa bih voleo da neko proba detaljnije da to objasni. [ X Files @ 01.10.2005. 10:35 ] @
Koga i dalje zanima, neka ide na:
http://groups.google.com/ Upit: "int main" "void main" ... ima da se nacita kao za lektiru Nikoletina Bursać. P.S. Da ne zaboravim: UPIT UPISITE U GORNJI EDIT, A NE U CENTRALNI (KOJI JE SAMO ZA PRETRAZIVANJE GRUPA) [Ovu poruku je menjao X Files dana 01.10.2005. u 11:36 GMT+1] [ itf @ 03.10.2005. 15:07 ] @
OS nije proces. OS je skup programa, a program se sastoji od procesa, a procesi od threadova. Ta povratna vrijednost se vraca OS-u tj. zapisuje se u jedan od registara posebne namjene i to je ono to. Tu vrijednost koriste programi koji eventualno ovise o prethodnom programu koji je vratio tu vrijednost (npr. da li je prethodni program uspjesno zavrsio ili nije i na osnovu toga izvrsiti neku akciju) i zato je "zgodno" koristiti int main.
Medutim, nisam pristalica toga da to BAS MORA BITI int main, kao sto se to pokusava forsirati jer uvijek sve treba biti stvar izbora. [Ovu poruku je menjao itf dana 03.10.2005. u 16:08 GMT+1] [ z@re @ 05.05.2006. 15:00 ] @
Program se ne sastoji od procesa, vec je program nakupina "mrtvih" jedinica i nula na tvom hard disku, a kad operativni sistem odluci pokrenut te jedinice i nule, onda to postaje proces. Dakle proces je program u izvrsavanju.
[ cynique @ 05.05.2006. 16:33 ] @
U biti je proces kontejner za skup resursa koji predstavljaju instancu trenutno pokrenutog programa. Notepad.exe je jedan program, kad ga pokreneš npr. 5 puta to je 5 različitih procesa istog programa, svaki sa svojim unosom u OS-evoj tablici procesa, sa svojim zauzećem sistemskih resursa etc.
Proces se ne mora uopće sastojati od threadova - npr. tek pošto je kreiran i prije nego je glavna nit proces startana, ili nakon što je terminiran a neki drugi proces ima otvoren handle na njega (nije pozvao CloseHandle() nakon CreateProcess()), pa sve što se čuva jest unos u tablici procesa u kojem je procesov exit status i eventualno još neke informacije ukoliko je bio pokrenut unutar JOB-a. Mislim da je exit status procesa jednak exit statusu zadnjeg threada koji se terminirao na win, dok je na nekim platformama koje nemaju jasno definiranu dihotomiju proces/thread (npr. Linux gdje se task_struct koristi i za forkane procese i threadove) to malo drugačije. Iznimka je ako je parent proces izašao prije childa, pa se onda nemaju kome čuvati te informacije. Na win postoji iznimka i za taj slučaj ukoliko je neki treći proces eksplicitno otvorio token od izašlog procesa sa OpenProcess(). Ukoliko C/C++ program eksplicitno ne vrati vrijednost u return-u iz main()-a 1) ili će kompajler to sam ubaciti kao defaultni parametar u ExitProcess(0) 2) ili će se program jednosavno vratiti natrag u OS sa "return" instrukcijom u ISA-i arhitekture platforme na kojoj se izvršava. Slučaj 2 jest zanimljiv, pa iz njega slijedi da je najkraći win32 program onaj koji ima samo instrukciju "ret" (odnosno retn - return near). U real-mode .COM programima stvar je još zabavnija, jer izvršni programi ne moraju imati headere za PE (Portable Executable) format, za sekcije, data directories (importe, relokacije..). Stoga slijedi da je najmanji mogući .COM fajl veličine 1 bajta sa sadržajem 0xC3 (opkod za ret). Pokušajte ga napraviti u hex editoru ;-) Proces iz kojeg je program pozvan (njegov parent) jest obično shell (explorer.exe, bash, sh..). U UNIX modelu procesa je važno da svaki proces ima kakvog-takvog parenta, pa s vremena na vrijeme kernel prošara po listi aktivnih procesa i svima koji imaju parenta koji nije "među živima" dodijeli PID parent procesa na 1 (PID od init(1)). Kad se proces kojeg je init(1) tako formalno "naslijedio" terminira, init(1) poziva neku od wait*(2) fja da im uzme exit status. Na taj se način preventira najezda zombie procesa koji ne rade ništa pametno već samo čekaju da netko dođe i uradi wait*(2) na njih (da im Lara Croft u vidu init(1) odfikari entry u tablici procesa i olakša im unholy dušu). [Ovu poruku je menjao cynique dana 06.05.2006. u 16:36 GMT+1] [ NrmMyth @ 05.05.2006. 16:51 ] @
Odlicno!
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|