C 언어에서 가변 인수의 사용...

익명 사용자의 이미지

안녕하십니까. 학생입니다.

C 언어 예제를 실행시키다가 가변 인수를 사용하는 예에서 막혔습니다.
이 책이 예전 도스의 Turbo-C 2.0 을 기준으로 작성되어있어서인지는
모르겠습니다만, 제가 사용하는 유닉스 계정에서는 컴파일이 안됩니다.

#include

void sample( char *, ... );

int main( void )
{
sample("%d ", 1, 2, 3, 4, 5, 6, 7, 8, 0 );

return( 0 );
}

void sample( char *format, ... )
{
void *p;
int value;

p = ...; // 이 부분에서 에러가 걸립니다.

do {
value = *(int *)p;
printf( format, value );
((int *)(p))++;
} while( value != 0 );
}

책에 있는 설명만으로는 무슨 말인지 잘 모르겠더군요.

일단 2가지가 궁금합니다.

첫째로 가변 인수를 사용하기 위해서는 함수 정의와 선언에서 어떤
절차로 기술해주어야 하는 것인가. 의 문제와...

둘째 가변 인수를 사용하는 함수에서 인수의 개수와 그 위치를 아는 방법.

이상의 2가지 입니다.

아시는 분께서 답변을 주시면 감사하겠습니다.

익명 사용자의 이미지

/* 간단한 예제입니다. */

#include
#include

int
add_em_up (int count,...)
{
va_list ap;
int i, sum;

/* 인수 목록을 초기화하라. */
va_start (ap, count);
sum = 0;
for (i = 0; i < count; i++)
/* 다음 인수값을 얻어라. */
sum += va_arg (ap, int);
/* 정리하라. */
va_end (ap);
return sum;
}

int
main (void)
{
/* 이 호출은 16을 출력한다. */
printf ("%d\n", add_em_up (3, 5, 5, 6));

/* 이 호출은 55를 출력한다. */
printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
return 0;
}

출처는 Glibc 번역본 입니다.
이곳 KLDP 에도 있는 문서죠....

도움이 되셨기를......

익명 사용자의 이미지

도움이 될까해서 몇자 적습니다.
가변인수를 사용하시려면 va_list,va_start,va_arg,va_end를 사용하시면 됩니다.
위는 macro로서 정의 되어있는 것으로 기억됩니다.
가변인수를 인자로 받을 때는 그 사이즈가 정의 되어있지 않으므로,va_arg에서 인수를 fetch할때
그 사이즈를 인수로 넘겨줘야합니다. 즉 va_arg(ap,int) ,va_arg(ap,char*) 등으로 말입니다.
그리고 가변인수의 갯수는 정의되어있지 않으므로, 함수를 만들때 어떻게 인수의 갯수를 알려주는지 결정해야 합니다.
예로서 printf("%d%s",...)에서 printf함수는 %의 갯수로 인수의 갯수를 알아냅니다.
그래서 ,
printf(.fmt,..)
{
while(*fmt!=0)
{
if(*fmt++=='%')
{
if(*fmt=='d')
va_arg(ap,int);
...

}
}
이런식으로 작동되는것으로 기억됩니다. (지금 책을 놓고 쓰는것이 아니라서 죄송)
또다른 방법은 인자의 마지막인수로 특정값(대부분 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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.