pineapple   2년 전

런타임 에러 뜨면서 안 되네요
다른 방법이 있을까요?

gallopsys   2년 전

아마 Baekjoon Online Judge의 Judge system이 32비트에서 64비트로 전환되는 과정에서 포인터형이 4바이트가 아닌 8바이트로 인식되기 때문에 발생하는 문제인 거 같습니다.

int형은 기존 32비트 프로그램과의 호환성을 위해 8바이트로 인식되는 것이 아닌 4바이트로 인식되고, 포인터형은 주소값을 가리키므로 64비트 환경에서는 전부 64비트로 전환되는데 이 과정에서 int로 형변환을 시도하게 되면 주소값의 손실이 발생하기 때문이죠.

Microsoft Visual C++ Compiler에서는 'Warning C4311 Pointer Truncation'로 포인터의 값이 잘릴 수 있음을 Compile Error가 아닌 Compile Warning으로 프로그래머에게 경고를 주는 정도로 끝나지만, BOJ에서 C언어 채점시 사용하는 GCC Compiler는 -Wall(경고 수준 최상위) 플래그를 넣고 컴파일을 진행하기 때문에 주의가 아닌 에러를 띄우게 되는 것이빈다. 물론 Visual C++ Compiler 기준으로 -Wall 플래그를 켜도 에러는 출력되지 않는데, 아마 GCC Compiler에서만 이런 오류를 띄우는 거 같습니다.


Microsoft MSDN에서 제공하는 Warning C4311에 관한 규격은 오른쪽 링크를 참조하시길 바랍니다. https://msdn.microsoft.com/en-...

참고로 Baekjoon Online Judge에서 넣는 컴파일 옵션은 다음과 같이 소개되어 있습니다. https://www.acmicpc.net/help/l...

C

  • 컴파일: gcc Main.c -o Main -O2 -Wall -lm --static -std=c99 -DONLINE_JUDGE
  • 실행: ./Main
  • 버젼: gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609

따라서 rand 함수를 안 쓰고 주소값을 쓰시려면 형변환을 하실 때 int가 아닌 long long이나 unsigned long long을 쓰시면 될 거 같습니다.

pineapple   2년 전

감사합니다. 풀었네요.

댓글을 작성하려면 로그인해야 합니다.