掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26592

va_listの使用方法について
投稿者---tongari(2006/04/11 10:21:28)


stdarg.hで定義されているva_listを使用し、

void func(char *msg, ...)
{
    va_list argp;
    va_start(argp, msg);

    <処理>

    va_end(argp);
}

と記述すると、func関数の第1引数後、つまり第2引数からva_arg関数
により引数の値を取得することができますが、第1引数(上記の場合、*msg)
よりva_listで取得できる方法をご存知の方、ご教授頂けますでしょうか?


varargs.hで定義されているva_alistを使用すれば、下記のようにすれば
実装可能なのですが、環境の問題によりvarargs.hが使用できません。

void funcva_alist)
va_dcl
{
    char *msg;
    va_list argp;
    va_start(argp);
    msg = va_arg(argp, char *);

    <処理>>

    va_end(argp);
}


func関数の第1引数にダミーを入れて処理させる手もありますが、
あまり美しくないと思ったので、質問させて頂きました。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:va_listの使用方法について 26593 nop 2006/04/11 12:43:44


No.26593

Re:va_listの使用方法について
投稿者---nop(2006/04/11 12:43:44)


何がしたくて、何がわからないのか、
が伝わってこないのですが…。

とりあえず、もう少し詳しく書いてください。
それから、環境も書くべきでしょう。


この投稿にコメントする

削除パスワード

No.26594

Re:va_listの使用方法について
投稿者---tongari(2006/04/11 12:56:04)


環境は、Fedora Core4
コンパイラは、gcc-3.4.5
となります。

また、やりたいことは関数の引数を可変数にしたいのですが、
下記のようなコードだと第2引数からva_listされますが、これを
第1引数からva_listで取得できるようにしたいのです。

以上、ご教授のほど宜しくお願い致します。

void func(char *msg, ...)
{
    va_list argp;
    va_start(argp, msg);

    <処理>

    va_end(argp);
}


>何がしたくて、何がわからないのか、
>が伝わってこないのですが…。
>
>とりあえず、もう少し詳しく書いてください。
>それから、環境も書くべきでしょう。




この投稿にコメントする

削除パスワード

No.26595

Re:va_listの使用方法について
投稿者---かずま(2006/04/11 13:05:39)


#include <stdio.h>
#include <stdarg.h>

void func(void *va_alist, ...)
{
    char *msg;
    va_list argp;
    va_start(argp, va_alist);
    argp = (char *)argp - sizeof(char *);  // 環境依存
    while (msg = va_arg(argp, char *)) puts(msg);
    va_end(argp);
}

int main(void)
{
    func("alpha", "beta", "gamma", 0);
    return 0;
}



この投稿にコメントする

削除パスワード

No.26596

Re:va_listの使用方法について
投稿者---tongari(2006/04/11 13:11:23)


かずま様
お早い回答有難うございます。

動作確認してみますので、しばらくお待ち下さい。


><pre>
#include <stdio.h>
#include <stdarg.h>

void func(void *va_alist, ...)
{
char *msg;
va_list argp;
va_start(argp, va_alist);
argp = (char *)argp - sizeof(char *); // 環境依存
while (msg = va_arg(argp, char *)) puts(msg);
va_end(argp);
}

int main(void)
{
func("alpha", "beta", "gamma", 0);
return 0;
}
</pre>


この投稿にコメントする

削除パスワード

No.26597

Re:va_listの使用方法について
投稿者---tongari(2006/04/11 13:19:36)


かずま様
確認しましたところ、問題なく動作しました。
stdarg.h定義でva_alistを使用できるとは知りませんでした。

度々質問になりますが、コメントにありましたように
環境依存とはどういった場合動作しないのでしょうか?



>かずま様
>お早い回答有難うございます。
>
>動作確認してみますので、しばらくお待ち下さい。


この投稿にコメントする

削除パスワード

No.26603

Re:va_listの使用方法について
投稿者---かずま(2006/04/11 17:53:38)


> stdarg.h定義でva_alistを使用できるとは知りませんでした。

この va_alist は単なる引数ですから名前は何でもかまいません。
<varargs.h> の va_alist は va_dclマクロの中で使用されているので、他の
名前に変更できません。


> 環境依存とはどういった場合動作しないのでしょうか?

例えば、CPU が ARM で、ARM Developer Suite の場合コンパイルでき
ません。この場合は、--*argp; でうまくいきます。

なお、argp = (char *)argp - sizeof(va_alist); と書いたほうがよいかも
しれません。

また、func(void *va_alist, ...) なので、第1引数に int や double を
渡せないことからも汎用的な方法ではありません。

それから、va_arg() は関数ではなくて、マクロです。
関数だと第2引数に型を渡せません。

最後に、投稿の注意は守ってください。
引用したプログラムが左詰めになっていることを変だと思いませんか?


この投稿にコメントする

削除パスワード

No.26615

Re:va_listの使用方法について ⇒ 解決
投稿者---tongari(2006/04/12 11:32:26)


かずま様
ご回答ありがとうございました。



>> stdarg.h定義でva_alistを使用できるとは知りませんでした。
>
>この va_alist は単なる引数ですから名前は何でもかまいません。
><varargs.h> の va_alist は va_dclマクロの中で使用されているので、他の
>名前に変更できません。

ご指摘有難うございました。stdarg.hを使用した場合、
func(int num, ...)といったように第1引数の名前は何でも良いことと
同じですよね。va_alistと書いていたので、勘違いしました。


>> 環境依存とはどういった場合動作しないのでしょうか?
>
>例えば、CPU が ARM で、ARM Developer Suite の場合コンパイルでき
>ません。この場合は、--*argp; でうまくいきます。
>
>なお、argp = (char *)argp - sizeof(va_alist); と書いたほうがよいかも
>しれません。
>
>また、func(void *va_alist, ...) なので、第1引数に int や double を
>渡せないことからも汎用的な方法ではありません。

詳細に示していただいて有難うございました。よく理解できました。
今回はIntelのPentium系だったので問題ございませんでした。


>それから、va_arg() は関数ではなくて、マクロです。
>関数だと第2引数に型を渡せません。

stdarg.hファイルを確認したところ、マクロで定義されておりました。
ご指摘有難うございます。


>最後に、投稿の注意は守ってください。
>引用したプログラムが左詰めになっていることを変だと思いませんか?

みずらい表示になってしまい、申し訳ございませんでした。
HTML変換ツールを使用したのですが、コピー & ペーストに失敗して
いたようです。

以後、気をつけるように致します。


お付き合いいただきました、有難うございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧