C 언어 문법에 관한 질문

khk의 이미지

dl library 사용에 대해 man 페이지에 보면 다음과 같은 예제가 있습니다.

      1 #include <stdio.h>
      2 #include <dlfcn.h>
      3 
      4 int main(int argc, char **argv) {
      5    void *handle;
      6    double (*cosine)(double);
      7    char *error;
      8 
      9    handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);
     10    if (!handle) {
     11    fputs (dlerror(), stderr);
     12    exit(1);
     13    }
     14 
     15    cosine = dlsym(handle, "cos");
     16    if ((error = dlerror()) != NULL) {
     17    fputs(error, stderr);
     18    exit(1);
     19    }
     20 
     21    printf ("%f\n", (*cosine)(2.0));
     22    dlclose(handle);
     23 
     24    exit(0);
     25 }

C언어 문법에 관련된 문제인데요...

6번 라인 double (*cosine)(double); -> 문법이 이해가 잘 안됩니다. ㅜ.-;
15번 라인 cosine은 6번에서 선언한 double형 변수인가 ??
21번 라인 (*cosine)(2.0)은 /lib/libm.so.6에 있는 function ?? 이 또한 문법이 이해가 잘 안되네요...

답변 부탁드립니다.

cdpark의 이미지

함수 포인터입니다.

double sine(double);

이건 double 형을 받아 double 형을 돌려주는 함수 sine이죠? 이 함수에 대한 포인터형를 선언한다면...

double (*cosine)(double);

이 되죠.

mach의 이미지

shared object(window의 dl과 유사)를 사용하시고자 하는군요. 이를 사용하는 방법중에서도 ActiveX와 유사한 동적링크를 사용하려고 하시네요.

Quote:
handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);

동적 라이브러리 파일을 오픈

Quote:
double (*cosine)(double);
....
cosine = dlsym(handle, "cos");

dlsym()은 위에서 오픈된 라이브러리 파일내의 라이브러리 함수중 함수명이
cos인 것의 주소를 가져온다(함수 포인터) 이때, 가져올 함수(cos)의 리턴 타입
은 double형이므로 이를 받을 함수 포인터 변수는 double형을 가지며
파라메터도 double형 1개를 가지는 함수포인터 형이어야 한다.
이를 선언한 줄이 6번째 줄이다.
Quote:
21 printf ("%f\n", (*cosine)(2.0));

함수 포인터를 알고 있으므로, 해당 함수를 호출한다.

님같은 경우 아마도 함수 포인터를 사용하는 방법이 더 문제인듯합니다.
다음 예제가 보탬이 될지 아니면, 헷갈림이 될지 모르겠네요.

int sum(int x, int y)
{
  return x+y;
}

int mul(int x, int y)
{
  return x*y; // multiply
}

main()
{
  int (*xxx)(int, int);

  xxx = sum;
  printf(" %d + %d = %d\n", 1,2, (*xxx)(1,2));

  xxx = mul;
  printf(" %d * %d = %d\n", 1,2, (*xxx)(1,2));
  return 0;
}

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

M.W.Park의 이미지

http://www.function-pointer.org/
예제도 좀 있는것같네요. 이런 이름의 URL이 있었다니... ^^;

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

댓글 달기

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