Avatar billede gumbert Nybegynder
08. maj 2003 - 14:22 Der er 40 kommentarer og
1 løsning

hvorfor ikke void

I et tidligere spørgsmål sagde arne_v at man ikke må bruge void main() men int main() og så return 0

hvorfor har folk så meget imod void main() ????

Ja og hvorfor får jeg så ikke en fejl med void main() når jeg compiler
Avatar billede soreno Praktikant
08. maj 2003 - 14:26 #1
Har du et link til det spørgsmål ?
Avatar billede arne_v Ekspert
08. maj 2003 - 14:28 #2
C standarden siger at main er en int funktion.

Stort set alle C compilere accepterer void.

Der er sågar visse C bøger der har brugt void.

Men det er noget der kan få de rigtige C fanatikere langt op
af læne-stolene.
Avatar billede arne_v Ekspert
08. maj 2003 - 14:32 #3
Se f.eks. http://herd.plethora.net/~seebs/c/c_tcr.html og bladr
ned til "Page 163".

Herbert Schildt er øverst på C fanatikernes hade liste.

[ja der er nogle pudsigheder i hans bøger - men han skriver
rimeligt godt - jeg har selv lært C efter en af hans bøger !]
Avatar billede gumbert Nybegynder
08. maj 2003 - 14:34 #4
ja men det er vel bare det samme som valg af sprog... en ren religionssag
Avatar billede arne_v Ekspert
08. maj 2003 - 14:35 #5
Eller:
  http://www.lysator.liu.se/c/schildt.html
sektion 5.1.2.2 !
Avatar billede arne_v Ekspert
08. maj 2003 - 14:36 #6
Nej.

ANSI C standarden siger klart at man skal bruge int.
Avatar billede soreno Praktikant
08. maj 2003 - 14:37 #7
Hvad siger c++ så ?
Avatar billede gumbert Nybegynder
08. maj 2003 - 14:37 #8
jamen hvis vi kigger på det så skriver folk jo bare return 0; altså funktionen retunerer intet ergo void..
Avatar billede arne_v Ekspert
08. maj 2003 - 14:37 #9
Så væn dig til at bruge int.
Avatar billede arne_v Ekspert
08. maj 2003 - 14:38 #10
Jeg mener bestemt at C++ er det samme.

Det skal være int.
Avatar billede arne_v Ekspert
08. maj 2003 - 14:39 #11
int main()
return 0;

og

void main()
return;

er ikke det samme. Den første returnerer en int mned værdien nul.
Den anden returnerer ingenting.
Avatar billede gumbert Nybegynder
08. maj 2003 - 14:39 #12
jamen hvorfor jeg kan ikke se nogen grund til int main() andet end det er en uskreven regel
Avatar billede arne_v Ekspert
08. maj 2003 - 14:40 #13
Det først eksempel returnerer status 0 til operativ-systemet.

Det andet eksempel er officielt undefined. På mange platforme
vil det nok returnere den status der tilfældigvis var i det register der
bruges til ar returnere funktions-værdier i.
Avatar billede gumbert Nybegynder
08. maj 2003 - 14:41 #14
altså jeg ved godt det ikke er det samme men det gør jo ikke nogen forskel..
Avatar billede arne_v Ekspert
08. maj 2003 - 14:41 #15
Jo du bruger det til at sætte exit status med.

På Unix og PC betyder 0 ok og >0 fejl og så kan man bruge
forskellige værdier for forskellige fejl.
Avatar billede gumbert Nybegynder
08. maj 2003 - 14:42 #16
altså hvis jeg skrev return -1 så er det en fejl??
Avatar billede gumbert Nybegynder
08. maj 2003 - 14:43 #17
sorru retun 1
Avatar billede arne_v Ekspert
08. maj 2003 - 14:44 #18
De specifikke værdier er platform specifikke.

Men i C++ (og dermed nok også i de fleste C) compilere er der
i stdlib.h defineret 2 konstanter EXIT_SUCCESS og EXIT_FAILURE
som man kan bruge til både return og exit funktionen.

stdlib.h definerer dem så til nogle passende værdier på den
pågældende platform.
Avatar billede gumbert Nybegynder
08. maj 2003 - 14:46 #19
ja ok det ser ud til det er mig der er lidt forkert på den :(

men igen hvorfor er der så en del bøger/tuts der lærer med void main()
Avatar billede arne_v Ekspert
08. maj 2003 - 14:51 #20
Man bruger det til at man kan lade scripts køre en serie execuatbles
men hvis der er nogen af dem der returnerer fejl, så kan man afbryde i.s.f.
at køre videre.
Avatar billede arne_v Ekspert
08. maj 2003 - 14:52 #21
Det optræder i bøger/tutorials fordi "det virker jo nu meget godt
i helloworld.c programmet".

Forfattere er også kun mennesker.
Avatar billede d34c0n Praktikant
08. maj 2003 - 14:54 #22
Der er ikke noget galt med void, jeg synes bare det virker nemmere da en void-funktion ikke retunerer noget. Brug hvad du fortrækker. :)
Avatar billede arne_v Ekspert
08. maj 2003 - 14:58 #23
Eksempel:

sts.c:

int main()
{
    return 3;
}

runsts.bat:

sts
goto lbl%ERRORLEVEL%

:lbl0
echo OK
goto fin:

:lbl1
echo fejl 1
goto fin:

:lbl2
echo fejl 2
goto fin:

:lbl3
echo fejl 3
goto fin:

:lbl4
echo fejl 4
goto fin:

:lbl5
echo fejl 5
goto fin:

:fin
Avatar billede arne_v Ekspert
08. maj 2003 - 14:59 #24
d34c0n>

Der *ER* noget galt med void.
Avatar billede arne_v Ekspert
08. maj 2003 - 15:00 #25
GCC 3.1 giver f.eks. også:

sts2.c: In function `main':
sts2.c:2: warning: return type of `main' is not `int'
Avatar billede arne_v Ekspert
08. maj 2003 - 15:03 #26
Og den er helt unpredictable.

void main()
{
    return;
}

"returnerer" 0.

void main()
{
    int a = 1;
    printf("%d\n",a*2);
    return;
}

"returnerer" 2.

[med en GCC 3.1 på Windows 2000 - sikkert noget helt andet på en
anden platform]
Avatar billede arne_v Ekspert
08. maj 2003 - 15:03 #27
og et svar
Avatar billede chries Nybegynder
08. maj 2003 - 15:54 #28
void main() _har_ (datid) været ansi c++ i en eller anden draft eller version. return er ikke nødvendig ifølge standarden 1996 :-) Nogen der har et link til den nyeste. Fandt kun en link der stod ANSO.org tager 8$ for en soft version.

http://www.comnets.rwth-aachen.de/doc/c++std/basic.html

5 A return statement in main has the effect of leaving the main function
  (destroying  any  objects with automatic storage duration) and calling
  exit with the return value as the argument.  If  control  reaches  the
  end  of  main  without  encountering a return statement, the effect is
  that of executing
          return 0;
Avatar billede arne_v Ekspert
08. maj 2003 - 15:58 #29
For C er den også i FAQ'en:
  http://www.eskimo.com/~scs/C-faq/q11.12.html
Avatar billede arne_v Ekspert
08. maj 2003 - 16:02 #31
[det sidste link siger iøvrigt at ISO C alias C99 faktisk
tillader implementations-specifikke main erklæringer]
Avatar billede nomak Nybegynder
08. maj 2003 - 17:40 #32
X-8ion: har du set mit spørgsmål på eksperten 39 indlæg :P
  NoMak: HAHA SE SELV!!! VOID MAIN SUTTER RØØØØØØØØØØØØØØØØØV
  X-8ion: neeeeeeeeeeeeeeeeeej kan godt give et argument der passer
  NoMak: så giv mig det
  NoMak: http://www.eskimo.com/~scs/C-faq/q11.12.html

det kan du ikke argumentere imod
  X-8ion: så længe den skal kunne retunere en fejl altså 1 eller -1 whatever så er det selvfølgelig int main() men når den alligevel bare retunerer 0 er void det mest logiske. Det med fejlen er D eneste argument imod men det svarer faktisk til at du gør alle dine funktioner der ikke retunerer noget til int og return 0
  NoMak: det er da ikke noget godt argument? det hedder dovenskab så
  X-8ion: altså du spiller en masse tid på at skrive noget der kan klares med 4 ord
  X-8ion: 4 bokstaver
  NoMak: dovenskab er IKKE et godt argument
  NoMak: kom igen, fiskefjæs :D
  X-8ion: det er ikke dovenskab det er logik
  NoMak: nej
  NoMak: "X-8ion: altså du spiller en masse tid..." <- dovenskab? HEJ
  X-8ion: tænk på at du sidder og kigger i et program hvor alle funktionerne er erklæret i toppen og en staor del retunerer int
  NoMak: ehm.. fatter jeg så ikke?
  X-8ion: og så men så gør programmet noget andet end du regner med fordi programmøren bare bruger return 0
  X-8ion: det kunne være undgået med void
  NoMak: hvis du laver det rigtigt, gør den kun det den skal
  X-8ion: jamen ikke for den der læser har du overhovet hørt efter
  NoMak: det er jo heller ikk meningen at andre skal læse dine programmer
  X-8ion: Det er på samme nivou som at kalde sine variabler a
s
sd
fg
e
r

  NoMak: nej
  X-8ion: jo hvis det er et større projekt
  NoMak: nej
  X-8ion: jo
  NoMak: nej
  X-8ion: du ved jeg har ret
  NoMak: nej jeg gør ej... du er bare modsat
  X-8ion: det er bare en dum uskreven regel ligesom at man ikke må gå med sko på hænderne

kan kun grine af det her :)

manden er sgu bare doven :P
Avatar billede nomak Nybegynder
08. maj 2003 - 17:41 #33
btw, X-8ion er gumbert :P
Avatar billede gumbert Nybegynder
08. maj 2003 - 18:12 #34
Den slags spammere burde smides ud af et serriøst spørgeforum som dette "GF"
Avatar billede nomak Nybegynder
08. maj 2003 - 18:13 #35
lol, den er god med dig :)
Avatar billede jpk Nybegynder
09. maj 2003 - 14:25 #36
Her er lidt nattelæsning:
http://www.ads.ca/devtools/updErr.html

Jeg giver en flødebolle til den første der lærer dem uden ad...
Avatar billede -tmb- Nybegynder
10. august 2003 - 17:03 #37
citat fra ISO C++:
"An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type int, but otherwise its type is implementations specific."

ISO C kræver direkte at man skal returnere int, lykkes andet med din compiler er det en fejl i din implemention.

en sen post, men så er standarden sat på plads ;)
--
tmb
Avatar billede arne_v Ekspert
10. august 2003 - 17:21 #38
Der er vist ikke nogen der er i tvivl om at standarden kræver int.

Til gengæld mener jeg ikke at der er belæg for at hævde at det
er en fejl at det virker med void i nogen compilere.

Undefined og unpredictable behaviour kan godt tilfældigvis
virke som programmøren havde intention om.
Avatar billede segmose Nybegynder
11. august 2003 - 09:55 #39
:)

Til det kan jeg kun svar, at køre over for rødt lys er har også udokumenterede sideeffecter og uforudsigelige konsekvenser...
Avatar billede arne_v Ekspert
11. august 2003 - 10:00 #40
Min pointe var, at det ikke er en fejl i compilerens implementation
af sproget at void main virker.

Det er ikke et krav i sproget at den slags skal "fejle åbenlyst".
Avatar billede tosssen Nybegynder
12. august 2003 - 13:24 #41
Et lille eksempel på at void main() er krævet (af en C compiler for TI lommeregnere):

Note that the main entry point is _main, not main as defined in Kernighan & Ritchie. The reason for it is the compatibility with kernels, which propose that the main program entry point is called _main. Also note that _main should be a function with return type void (not int as usual), because you can not return a status code to the operating system.

http://tigcc.ticalc.org/doc/httigcc.html
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester