[C] 이거 책이 이상한건지 컴파일러가 이상한건지

stargt의 이미지

그냥 가위바위보 프로그램인데요

책에 나온게 좀 이상해서 몇몇 부분은 제가 추가한것입니다. 그런데 오류가 나네요;

#include <stdio.h>
#include <stdlib.h>

void main()
{
     int comnum, putnum, uwin, cwin, how = 1;
     int result;
     
     while(1){
         [u][b]srand((unsigned)time(NULL));[/b][/u] // 이 줄 자체를 제가 추가했어요.
         comnum = rand() % 3[u][b] + 1[/b][/u]; // 끝에 + 1 이 부분을 추가했습니다
         
         printf("어떤 손을 내시겠습니까?(가위 = 0, 바위 = 1, 보 =2)\n");
         scanf("%d", &putnum);
         
         if(putnum > 2 || putnum < 0)
             continue;
         else
             how++;
             
         if(comnum == putnum)
                printf("<무승부 입니다>\n");
         else if(comnum == (putnum +1) % 3) {
                printf("<사용자가 이겼습니다>\n");
                uwin += 1;
         } else {
                printf("<컴퓨터가 이겼습니다>\n");
                cwin += 1;
         }
         
         if(how > 5)
                break;
     }       
     printf("\n사용자(%d) : 컴퓨터(%d)\n", putnum, comnum);
     
     result = uwin - cwin;
     
     if(result < 0)
          printf("= 패배하였습니다 =");
     else if(result > 0)
          printf("= 승리하였습니다 ="); 
     else
          printf("= 무승부입니다 ="); 
}

그런데 오류가 나는데

   G:\PBofAlgorithm\p94_02.c In function `main': 
[b]5[/b] G:\PBofAlgorithm\p94_02.c [Warning] return type of 'main' is not `int'
[b]5[/b] G:\PBofAlgorithm\p94_02.c Permission denied
[b]5[/b] G:\PBofAlgorithm\p94_02.c ld returned 1 exit status 

이거 보니까 쓸데없는 오류가 나는거같아서요;

참고로 Dev-C++(gcc) 사용중입니다.

저 코드릉 어떻게 수정하면 해결할수 있을까요;

kfmes의 이미지

main 의 타입이 void 로 되어있는데

void 를 제거하고 다시 해보시는게 ...

gcc에서는 main을 void 로 쓰면 저런 현상이 나타납니다.

----------------------------------------

gilchris의 이미지

main 을 int main 으로 바꾸시고

main 마지막에 return 0; 넣어주세요


--------------------------------------------------------------------------------
새로운 세상으로...

익명 사용자의 이미지

kfmes wrote:
main 의 타입이 void 로 되어있는데

void 를 제거하고 다시 해보시는게 ...

gcc에서는 main을 void 로 쓰면 저런 현상이 나타납니다.


gcc가 문제가 아니고ㅓ
원래 c언어 규약에 main은 반드시 int형 가지고
반환값을 가져야 한다고 나옵니다.
stargt의 이미지

컴파일러마다 이렇게 다르면 안될텐데 ㅡㅡ

어쩄든 감사합니다.

#include <stdio.h>

int main()
{
while(1)
printf("0");
return 0;
}

shji의 이미지

int main(void)
int main(int argc, char *argv[])

둘 중 하나를 사용하면 어느 컴파일러라도 에러가 안날 것 같은데요..^^ 컴파일러 탓할 게 아닌듯..

stargt의 이미지

그럼 책이 문제군요

#include <stdio.h>

int main()
{
while(1)
printf("0");
return 0;
}

doldori의 이미지

다른 사람의 피해를 줄이기 위해 책 이름을 밝혀주시는 센스를...

stargt의 이미지

책 이름은 별로안유명한거 같은데
[알고리즘이 보이는 그림책]
이에요

#include <stdio.h>

int main()
{
while(1)
printf("0");
return 0;
}

ssomai의 이미지

책은 microsft에서의 c 를 기준으로 한거 같군요.

거기의 c랑 gcc에서의 c는 몇가지 다릅니다. :o

위에서처럼 main이 반드시 int return해야 된다는 점과,

같은 scope에서
for(int i=0;i<10;i++){}
for(int i=0;i<10;i++){}
이렇게 for문 내의 i를 여러번 선언할 수 있다는것정도...
임시로 카운팅 변수로 애용하는 i를 맨위에서 미리 선언할 필요가 없다는 장점~
( 다른것은 기억이 잘 안나는군요.;; )

제 요지는 책이 틀린 것은 아니라는겁니다 :P

익명 사용자의 이미지

Quote:

for(int i=0;i<10;i++){}
for(int i=0;i<10;i++){}
이렇게 for문 내의 i를 여러번 선언할 수 있다는것정도...
임시로 카운팅 변수로 애용하는 i를 맨위에서 미리 선언할 필요가 없다는 장점~

for 문 헤더에서 선언한 변수의 스코프가 for 문 바깥까지 연장되는 것은 오로지 visual c/c++ 에서만 가능합니다. iso에서 정한 표준 c 와는 다릅니다. visual c/c++ 에서만 가능하다는 코멘트가 없다면 분명히 틀린 코드입니다.
(최근 버젼의 visual c/c++ 에서는 for 문 헤더에서 선언한 변수의 스코프를 정하는 옵션이 있더군요.)

addnull의 이미지

Anonymous wrote:
Quote:

for(int i=0;i<10;i++){}
for(int i=0;i<10;i++){}
이렇게 for문 내의 i를 여러번 선언할 수 있다는것정도...
임시로 카운팅 변수로 애용하는 i를 맨위에서 미리 선언할 필요가 없다는 장점~

for 문 헤더에서 선언한 변수의 스코프가 for 문 바깥까지 연장되는 것은 오로지 visual c/c++ 에서만 가능합니다. iso에서 정한 표준 c 와는 다릅니다. visual c/c++ 에서만 가능하다는 코멘트가 없다면 분명히 틀린 코드입니다.
(최근 버젼의 visual c/c++ 에서는 for 문 헤더에서 선언한 변수의 스코프를 정하는 옵션이 있더군요.)

이런 문법은 꺼림직해서 쓰지 않습니다만,
몇가지 긴가민가합니다.

첫번째,
변수 선언이 함수 시작 부분이 아닌 곳에서도 가능하게 하는건
C++ 이후의 언어의 특징인데, C언어의 최근 추세도 이걸 따라가는 걸로 알고 있습니다.
C99에서는 가능한걸로 알고 있습니다.

두번째,
for 문 안에서 선언된 변수 i가 for문이 끝난 시점에서도
계속 유효한가에서도 언어마다 해석이 다른 걸로 알고 있습니다.
유효한 경우도 있고, for문의 스코프에서만 유효한 경우도 있습니다.
(혹은 Anonymous님의 말씀처럼 컴파일러 옵션에 따라 다른 걸지도..? )

세번째,
위에서 말한 유효성과는 별도로,
중복 선언이 가능한가에 대해서도 다릅니다.

네번째,
중복 선언할 경우에 외부/내부 변수의 개념처럼
변수들의 스코프 룰이 적용되는가도 확인해봐야합니다.

이런 문제점이 경우마다 조금씩 다른 결과를 보인 걸로 기억납니다.
그래서 전, php 프로그래밍할때도
아에 시작부분에 사용할 변수들을 다 선언해버리죠.
거기 없는 건 중간에 쓰지도 않습니다.. =_=;;

2006년 1월 23일.

stargt의 이미지

ssomai wrote:
책은 microsft에서의 c 를 기준으로 한거 같군요.

거기의 c랑 gcc에서의 c는 몇가지 다릅니다. :o

위에서처럼 main이 반드시 int return해야 된다는 점과,

같은 scope에서
for(int i=0;i<10;i++){}
for(int i=0;i<10;i++){}
이렇게 for문 내의 i를 여러번 선언할 수 있다는것정도...
임시로 카운팅 변수로 애용하는 i를 맨위에서 미리 선언할 필요가 없다는 장점~
( 다른것은 기억이 잘 안나는군요.;; )

제 요지는 책이 틀린 것은 아니라는겁니다 :P

볼란드 C++을 가지고 테스트했다는군요

#include <stdio.h>

int main()
{
while(1)
printf("0");
return 0;
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.