솟수 고하는 C프로그램에서 sqrt()함수를 못찾네요..

beggarstar의 이미지

C 공부하다 솟수(prime number)구하는 프로그램 짜보려구 하는데
math.h의 sqrt()함수 때문에 에러가 나는거 같은데...
왜 이런지 모르겠어요..

도움 부탁드립니다..

소스코드

--------------------------------------------------------------------------------------------------------------------------------------------------------
#include
#include

int is_prime(int n);

main()
{
int n;

printf("\nEnter the number : ");
scanf("%d", &n);

if (is_prime(n) == 0)
printf("\n --> the digit, %d is not a prime number!\n", n);
else
printf("\n --> the digit, %d is a prime number!\n", n);
}

int is_prime(int n)
{
int i;

if (n == 2)
return 1;

if (n % 2 == 0)
return 0;

for (i = 3; i if (n % i == 0)
return 0;

return 1;
}
--------------------------------------------------------------------------------------------------------------------------------------------------------
에러메시지
$ gcc prime.c
/tmp/ccAldoMJ.o: In function `is_prime':
prime.c:(.text+0x106): undefined reference to `sqrt'
collect2: ld returned 1 exit status
$

steve24l의 이미지

프로그래밍을 못하는 편이지만
일단 sqrt함수가 뭔질 모르겠네요...
뭐 저 얘기 하는걸 보면 헤더파일이 잘못된것같은데...
일단 제가 짜보자면 이렇습니다

#include
#include

int is_prime(int n);

main()
{
int n;

printf("\nEnter the number : ");
scanf("%d", &n);

if (is_prime(n) == 0)
printf("\n --> the digit, %d is not a prime number!\n", n);
else
printf("\n --> the digit, %d is a prime number!\n", n);
}

int is_prime(int n)
{
if (n==2) return 1;
for (int i=2;i if (n%i!=0) return 0;
return 1;
}

요렇게 하면 될것 같은데...
속도문제라고 해도
int 형이 커봐야 프로그램이
int 형의 가장 큰 숫자만큼 for문을 돌아도
1초조차 안걸리기 때문에 큰 문제가 있어보이진 않는데...

세이군의 이미지

C 공부하다 솟수(prime number)구하는 프로그램 짜보려구 하는데
math.h의 sqrt()함수 때문에 에러가 나는거 같은데...
왜 이런지 모르겠어요..
도움 부탁드립니다..
소스코드
--------------------------------------------------------------------------------------------------------------------------------------------------------

#include <stdio.h>
#include <math.h>
int is_prime(int n);
main()
{
    int n;
    printf("\nEnter the number : ");
    scanf("%d", &amp;n);
        if (is_prime(n) == 0)
            printf("\n  --> the digit, %d is not a prime number!\n", n);
        else
                printf("\n  --> the digit, %d is a prime number!\n", n);
}
int is_prime(int n)
{
        int i;
        if (n == 2)
                return 1;
        if (n % 2 == 0)
                return 0;
        for (i = 3; i < (int)sqrt(n); i = i + 2)
                if (n % i == 0)
                       return 0;
        return 1;
}
--------------------------------------------------------------------------------------------------------------------------------------------------------
에러메시지
$ gcc prime.c
/tmp/ccAldoMJ.o: In function `is_prime':
prime.c:(.text+0x106): undefined reference to `sqrt'
collect2: ld returned 1 exit status
$

---------------------- 원문 인용 끝 ----------------------------------
답은 정말 간단한 곳에 있습니다.
$gcc prime.c -lm

끝에 "마이너스 엘 엠"을 붙여주지 않아서 그런 문제가 발생한 것입니다.
수학라이브러리를 사용하는 경우, 즉 math.h를 include했다면 컴파일할때 반드시 -lm을 붙여주셔야 합니다. 그렇지 않으면 위와 같은 메시지를 봅니다.
---- 서명----------
한 걸음 더 가까이

beggarstar의 이미지

새롭게 리눅스에 빠저들게 되서 리눅스환경에서 프로그래밍을 해보구 있던차에.. 생긴 문제입니다.

혹시 math.h 라이브러리 말고 컴파일시 옵션이 필요한 다른 라이브러리도 있나요?

hayarobi의 이미지

중간에 SYNOPSIS부분에 아래처럼 나옵니다.

SYNOPSIS
       #include <math.h>
 
       double sqrt(double x);
       float sqrtf(float x);
       long double sqrtl(long double x);
 
       Link with -lm.

즉 sqrt()함수를 쓰기 위해서는 math.h 를 인클루드 하고 링크단계에서는 -lm을 붙이라는 것이죠. 다른 함수들도 man page보면 저런 식으로 안내가 나올 것입니다.

덤으로 어떤 함수는 쉘 명령어와 이름이 같아 안 보이는 함수는 -s 옵션으로 2번, 혹은 3번 세션을 여시면 됩니다.
man -s 3 sqrt 하셔도 되고 리눅스에서는 그냥 man 3 sqrt하셔도 됩니다.

=================
잠못자는 한솔아빠

beggarstar의 이미지

근데 SYNOPSIS가 뭐죠? C의 도큐먼트 같은 건가요?

hayarobi의 이미지

man [함수이름] 으로 함수 매뉴얼 페이지를 읽어오면 그 내용중에 SYNOPSIS라는 섹션이 있습니다. 터미널에서 man sqrt를 쳐 보세요.

beggarstar@beggargalaxy ~ $ man sqrt

SQRT(3)                    Linux Programmer's Manual                   SQRT(3)
 
 
 
NAME
       sqrt, sqrtf, sqrtl - square root function
 
SYNOPSIS
       #include <math.h>
 
       double sqrt(double x);
       float sqrtf(float x);
       long double sqrtl(long double x);
 
       Link with -lm.
 
DESCRIPTION
       The  sqrt()  function  returns  the  non-negative square root of x.  It
       fails and sets errno to EDOM, if x is negative.
 
ERRORS
       EDOM   x is negative.
 
CONFORMING TO
       SVID 3, POSIX, 4.3BSD, ISO 9899.  The float and the long  double  vari-
       ants are C99 requirements.
 
SEE ALSO
       cbrt(3), csqrt(3), hypot(3)

맨윗줄 SQRT(3) 에서 3은 세션 번호입니다. 동명이인 찾듯이 C함수, 쉘 명령어, 프로그램 이름이 같을 경우 세션으로 구분해 줍니다.
NAME은 이 페이지에서 설명하는 함수 목록이죠. 이 페이지 하나로 sqrt함수 삼총사를 한번에 다 설명하고 있죠.
SYNOPSIS는 간단 요약이죠. 함수 문법과 불러와야할 헤더파일, 라이브러리 목록을 알려주고 있죠.
ERRORS 는 함수가 실패하는 경우를 설명하는데 이것의 설명은 리턴값으로 저것을 전달한다는 것인지 전역변수 errno에 저장한다는 것인지가 불명확하네요. EDOM은 아마도 math.h 에 상수가 지정이 되어있을 겁니다.
그리고 여기에는 빠져있는데 RETURN 섹션도 있습니다. 함수 리턴값의 의미를 설명하는데 쓰입니다. sqrt는 리턴값의 의미가 너무 뻔해서 생략한 것 같습니다.

리눅스에서 프로그래밍하면 man 페이지 보실 일 많은 것입니다. 그래서 간략하게 man 페이지 보는법을 써 봤습니다.

=================
잠못자는 한솔아빠

beggarstar의 이미지

^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.