締切済み 任意の数の引数をとる関数 2001/06/30 17:34 gccでprintfのように、任意の数の引数をとる関数を作りたいのですが、MS-VCでは hoge(arg1, arg2, ...) という書式のようですが、gccではエラーでした。 どうすればいいのでしょうか? みんなの回答 (3) 専門家の回答 みんなの回答 leaz024 ベストアンサー率75% (398/526) 2001/07/05 00:46 回答No.3 関数の定義自体は、stdarg.hをインクルードしなくても出来ますよ。 (可変長引数のプロトタイプは、ANSI C準拠の処理系ならば、どこでも使えるはずですが。) ちなみに下記のコードでテストしてみたところ、問題なく動作しました。 (gccのバージョンは2.95.2でした) #include <stdio.h> void arg(int n, ... ); int main(void) { arg(5, 1,5,3,4,7); return 0; } void arg(int n, ... ) { int *p = &n; int i; for (i = 0; i < n; i++) printf("%d\n", *++p); } # 引数の渡され方が分かっていれば、stdarg.hがなくても処理できます。 質問者 お礼 2001/07/06 12:07 うーむ、構文は間違ってないと思うのですが。 もういちど調べてみます。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 toysmith ベストアンサー率37% (570/1525) 2001/07/01 00:56 回答No.2 #include <stdio.h> #include <stdarg.h> int func(int, ...) ; int main(void) { func(1, "a") ; func(2, "a", "ab") ; func(3, "a", "ab", "abc") ; return (0) ; } int func(int num, ...) { char *pp ; int cc ; va_list ll ; va_start(ll, num) ; for (cc = 0 ; cc < num ; cc++) { pp = va_arg(ll, char *) ; printf("%3d:\"%s\"\n", cc, pp) ; } va_end(ll) ; return (cc) ; } egcs2.91.57(CygWin32上)ではオッケーでした。 MSVC++でもstdargはサポートされています。 質問者 補足 2001/07/02 15:50 stdarg.hをインクルードしなければ、関数の定義ができないのでしょうか? 使い方はとりあえずわかっているので。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 noname#9414 2001/06/30 23:06 回答No.1 someFunction(LPSTR lpszFormat, ...) とすれば使えるはずです。 使い方は、ご自分で探してください。 TRACEマクロなどをソースから探せば使い方が 分かると思いますよ。 ではでは☆ 質問者 補足 2001/07/02 15:48 それが、どうもそこ構文でエラーになってしまいます。 バージョンが低いのかな? 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発C・C++・C# 関連するQ&A OpenOffice Basicで引数を2つ利用する関数が作れません OpenOffice Basicで引数を2つ利用する関数が作れません Open Office Calc 3.1.1を使っています。 できれば複数(3つ以上)引数を取る関数を作りたいのですが、 2つ引数を取ろうとすると演算結果が#NAME?になってしまいます。 切り分けにシンプルな関数を作ってみました。 以下で=test2(3,5)とすると結果が#NAME?になります。 Function test2(arg1 As Integer, arg2 As Integer) as Integer test2 = 3 + arg2 End Function #なお、関数内の演算内容はtest2 = arg1 + arg2でも変わらず#NAME?です 切り分けで以下を作ると=test3(3)で6が返されます Function test3(arg1 As Integer) as Integer test3 = 3 + arg1 End Function 関数名のタイプミスの可能性を排除するために、 test2関数を名前を換えずに引数の数を1つに変更してみると 計算できるのでタイプミスではないと思います。 やはり引数を複数とる取り方に問題があるように見えます。 お手数ですが何かアドバイスいただけないでしょうか? オブジェクトの中で呼び出される順番とデフォ引数? ・意味が分からないコードがあるので教えてください ■コード var arg; var obj = { hoge : function( arg ) { var hoge = function(arg){ return function() { } }(arg); hoge(); } } ■質問 ・この時、obj.hoge(arg);と書いたら、どういう処理が走るのでしょうか? ・初めに実行されるのは? 無名関数部分? それともhoge()? ・hoge()を実行する際、引数指定していないので、引数は渡らない? 関数の引数に引数を持つ関数を入れたい場合はどうすればよいのでしょうか。 関数の引数に引数を持つ関数を入れたい場合はどうすればよいのでしょうか。 function hoge(m, l, p, h) {} (中身は省略しています。) この関数の引数「h」にhtmlを代入しようとしています。 そのhtmlには、WindowOpen()があり、そのまま代入すると「")"がありません」 エラーが発生するのですが、これは無茶なことなのでしょうか。 なんとか解決方法があれば教えていただけませんでしょうか。 「"」の時のように「\"」ではだめだったので行き詰っています。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム 配列の中身を順番に可変長定義関数に渡すには 好きなだけ引数が渡せる関数があり、その引数に任意の配列の中身をeval関数を使わずに一つずつ渡したいのですが、どうすればいいのでしょうか。eval関数を使った場合は以下のような感じです。 $list=array("apple","banana","orange"); function hoge(){ print_r(func_get_args()); } $arg=implode ('","',$list); eval('hoge("'.$arg.'");');//hoge("apple","banana","orange"); よろしくお願いいたします。 _beginthread関数の引数 VC++ 2005 Win32コンソールアプリケーション で 1つ目のスレッドで「10」 2つ目のスレッドで「20」 3つ目のスレッドで「30」 と出力するために下記のように記述しました。 結果は予定通り出力されているのですが、 _beginthreadの第3引数の渡し方、 printfの引数の表示の仕方はこれでよいのでしょうか? void myThread(void *pParam); int arg[3] = {10, 20, 30}; int main() { HANDLE hThread[3]; int i; for (i = 0; i < 3; i++) { hThread[i] = (HANDLE)_beginthread(myThread, 0, &arg[i]); } /* 以下略 */ } void myThread(void *pParam) { printf("%d\n", *(int *)pParam); _endthread(); } printf関数の引数は文字例と決まっているからです。 printf関数は文字列しか引数として受け取りません。 printf("文字列"); では数値を引数にしたらどうでしょう? #include <stdio.h> #main () { printf(1); return 0; } これはコンパイルエラーになります。printf関数の引数は文字列と決まっているからです。 この文章について質問です。 Q.なぜ上の「文字数」はダブルクォーテーションで囲まれているのに、下の「1」にダブルクォーテーションはないのでしょうか? Q.文書を見る限り、Cでは文字列と数値は区別されているように見えますが、なぜでしょうか? 可変引数について。 va_argを使う方法は知っているのですが、受け渡す引数の数を指定しない方法で、決まった型引数を任意数渡す方法はC言語(C++ではない)で実現できますか? char* test( n, str1, str2, str3, …任意数) nはint, str○ は const char* という形ならば、第二引数以降の引数を呼び出し元で n に与えてやれば、n回だけ va_arg(args, char*) を呼び出せばよいですが、 char* test2(str1, str2, str3, str4, …1つ以上の任意数) という形だと、引数の個数を取得できないためうまくできません。 実現不可能でしょうか? va_listを使用したfscanf()関数のラッパー関数 【環境】WinXP/VC++6.0/Win32コンソールアプリ 初めて質問させていただきます。 テキストファイル入出力クラスを作成中で、書式指定付きの読込み関数を次のように定義しています。 CTextFileIO::Read(LPCSTR lpFormat,...) { va_list arg; va_start(arg,lpFormat); fscanf(this->hFile,lpFormat,arg); va_end(arg); } hoge.txtの内容 5 使用する場合 void main() { int i; CTextFileIO file("hoge.txt"); // ☆読込み file.Read("%d",&i); // i に 5 が読込まれることを期待している。 printf("%d",i); } 実行結果 -858993460 ご質問は、☆の箇所でどうして i に 5 が取得できないのかということです。同様の作り方で出力関数 vfprintf() のラッパー関数を試した場合は正しく動作しました。 以上よろしくお願いいたします。 引数の数が可変な関数 C言語の関数でいつも不思議に思うのですが printf("%sさんの成績は、%d点です。", name, score); printf("\n\n"); のように引数が可変な関数を作成したいのですが、どうすればよいでしょうか? CとC++の両方の書き方が知りたいです。 理解したいの解説している書籍なども探しています。 構造体を引数で関数へ渡す こんばんは。現在C言語を学んでいます。 課題という形で構造体で定義されたデータを関数の引数に当てはめ、データを渡すという処理を行わねばならぬのですが、関数を利用しての構造体の受け渡しが分からず苦戦しております。ご助言頂ければ幸いです。 分かりづらいかとは思いますが下記が私が簡単にですが作ったものとなります。 私の考えている動作プロットとしては 1. 構造体の形式を定義する。 2. 冒頭にて存在する関数を定義 3. main関数内にて構造体に名前を付けて定義し、値を入力より受付 4. do_it_hoge関数に構造体を引数として与え(ここが分からず)関数を呼び出す。 5. 関数内にて引数で受け取った &hoge.a,b,c等を表示するなどしたい。(受け取る方法が分からず) 関数を呼ぶ際にカッコ内に入れるのは構造体の名前のみで良いのでしょうか? (例: do_it_hoge(hoge); のように) また呼び出される関数側の括弧は何を記述するのでしょうか? いつもならint hogehoge, や char hoge, などと宣言しているかと思うのですが。 読みづらく、分かりにくいものかとは思いますが どうぞ宜しくご教授頂ければと思っております。 構造体を触るのが久しぶりだったのでそちらでミスがあるかもしれません。もし何か補足等必要でしたらメッセージ頂ければ返事させていただきたいと思います。 //----------------------------------------------------------------// //構造体HOGEHOGE定義 //----------------------------------------------------------------// typedef struct tagHOGEHOGE { int a,b; int c; }HOGEHOGE; void do_it_hoge();//関数定義。ここでのカッコ内の定義も不明 //----------------------------------------------------------------// // main //----------------------------------------------------------------// void main(){ HOGEHOGE hoge;//hogeをHOGEHOGE利用で定義 scanf("%d,%d",&hoge.a,&hoge.b);//カンマ区切りで代入 scanf("%d",&hoge.c);//数値をhoge.cへ do_it_hoge();//←ここが分からず } //----------------------------------------------------------------// // do_it_hoge 関数。構造体を引数で受け取りたい関数。 //----------------------------------------------------------------// void do_it_hoge(){ // ←括弧内の受け方が分からず // ここでmainで入力された &hoge.aなどを参照して表示したい // 例: printf("hogeA:%d",&hoge.a); } //----------------------------------------------------------------// 可変長引数関数のマクロ関数について 可変長引数をとる関数をマクロで置き換えたいのですが、 この方法だとできません。うまく実現できないでしょうか? ------------------------------------------------------- #define TRACE(arg, ...) trace(__FILE__,__LINE__,arg, ...) void trace(char *file, int line, char *arg, ...) { ...(略)... } func() { ... TRACE("hello %s", "taro"); ... } ------------------------------------------------------- よくあるトレース処理だと思いますがこんな感じです。 他にも代替手段は考えつきますが、 可変長引数の関数のマクロが可能かが知りたいです。 どなたがご存知の方がいらっしゃいましたら、よろしくお願いします。 関数の引数のデフォルト値について PHP5.2.4を使用しています。 自作関数で、例えば数値や文字列を受け取る引数のデフォルト値を 「''」で入力されてないかをチェックする場合と、 「NULL」で入力されてないかをチェックする場合とでは、 どちらが良いというのはあるのでしょうか? function a($arg = '') { if($arg == '') { } } //または function a($arg = NULL) { if(is_null($arg)) { } } AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム JavaScriptの関数の引数省略について JavaScriptの関数で、下記のような引数の省略はできるでしょうか? 【例】 function hoge(aaa, bbb){} hoge(,"できるかな");←このような引数の省略はできるでしょうか? -------------------- しらべてみると、引数が2つあった場合、後方の引数の省略はできることがわかりました。 【例】 hoge("できるかな");←この場合できます。 しかし、引数が2つあった場合、前方の引数省略の例は見つけることができませんでした。 前方の引数を省略することはできるのでしょうか? よろしくお願いします。 実体化したクラスを関数の引数にするには タイトルの通りです。 実体化したクラスを関数の引数として渡し、 関数の中でクラスのメソッドを実行したいと思っています。 以下のソースではエラーが出るのですが、 お分かりの方はいらっしゃいますでしょうか? $o_hoge = new Class_hoge(); fncHoge = ($o_hoge); function fncHoge($class) { $class->hoge('test'); } class Class_hoge { public function hoge($a) { print $a; } } PHP シェルスクリプト 引数 失礼します。現在PHPからシェルスクリプトを引数を付けて実行し、戻り値で確認が出来るか試しているのですがなかなか参考になる記事がなく実現が出来ない状態です 調べたところ、 phpからhoge.shというシェルファイルをargという引数で実行したいとします。 引数を"'. .'"で囲う事で、引数を渡せるようです。 $output = shell_exec('/bin/sh /path/to/hoge.sh "'.$arg.'"') var_dump($output) 上記のような記事を見つけたのですがhoge.shはどのように$argを受け取り、戻り値を渡しているのでしょうか?また、$argの値の中身は渡す引数の内容という認識で正しいのでしょうか?サンプルコードなどがあるとうれしいです。 ご教授よろしくお願い致します。 VLOOKUP関数の引数について VLOOKUP関数の引数に「***1」など『*』を使用すると、 任意の数字を引っ張ってしまいます。 同じように、VLOOKUP関数の引数として使用できないものはありますか? また、「a001」を引数にするのはできますか? 記号+三桁の数字で引数として使用したい、又はそれに変わるもの。 よろしくお願いします。 引数のある関数と引数のない関数の設定 お世話になっております。 PHPのプログラミングで関数をつくる際に、引数を渡す関数と引数がない関数がありますが、すでに定義済みの関数のように、引数がある場合と引数がない場合の両方を取り扱うにはどうしたらよいでしょうか? function example ($a) { if ($a == 0 || $a == '') { print '引数なし'; } else { print $a; } } のような関数で、 example(); という感じで引数を入れないと、 Warning: Missing argument … というエラーがでてしまいます。関数を example(''); と呼び出すと大丈夫なのですが。。。 プログラマーにとって基本的なことだと思うのですが、調べてもなかなか出てこないので質問させて頂きました。どなたかわかる方がいたらしたらおしえてください。 よろしくお願いします! } 関数を引数とする方法? いつもお世話になっています。 MFCでプログラムをしています。 今、任意の関数(Func1)を 積分する関数(Func2)を作っています。 現在は、被積分関数の数だけ、 積分関数(Func2)を書いているのですが、 非効率的なので、なるべく汎用性を持たせたいと 考えています。 参考書(新C言語入門シニア編)の該当個所で、 クラスでない通常の関数を引数とする場合は、 うまくいったのですが、 クラスのメンバ関数を引数とした場合、 どうしてもコンパイルエラーが 発生してしまいます。 関数Func、I及びエラーメッセージは大凡次のとおりです。今のところ、引数とする関数(Func1)の引数は、 同一個数としています。 <被積分関数の例> double ClassA::Func1 (double a){ return a * 10; } <積分関数> double ClassA::Func2 (double (*f)(double), double a, double b){ return b * f(a); } void classA::Integration() { ... Func2(Func1,a,b); ... } <エラーメッセージ> classA::Integrationの呼び出し箇所で、 「1番目の引数を double(double)からdouble(__cdecl)(double)に 変換できません」 と出ます。 double(double)の部分は合っているようなのですが、 (__cdecl)の部分が違うということまでは 分かりました。 メンバ関数であることが原因のようなので、 Func2での引数宣言を double ClassA::Func2 (double (ClassA::*f)(double), double a, double b){ return b * f(a); } に変えてみたところ、 引数受け渡しのところはクリアするのですが、 Func2(Func1,a,b); の呼び出し時に、Func2が関数ではないという エラーがでます。 アドバイス又は参考URL等を 教えていただければ助かります。 よろしくお願いします。 テンプレート引数の型推測 コンパイラはVC++2008です。 いろいろあって、あるクラスにおいて関数ポインタと関数オブジェクト双方を 同じように利用できないかと考えて、次のように試みました。 class Base { public: virtual void func() =0; }; template<class Func> class CFunc :public Base { private: Func m_func; public: CThreadFunc(Func func):m_func(func){} void func(){m_func();} }; class Hoge { private: Base* base; public: template<class Func> Hoge(Func func) :base(new CFunc<Func>(func)) {} ~Hoge() { delete base; } void DoSomething() { base->func(); } }; クラスをテンプレートにするといちいち指定しなければならないので、 まず基底クラスに適当な仮想関数を設け、それを継承したクラスをテンプレートにしました。 そしてコンストラクタの引数で何かしらを受け取って、オーバーライドした関数の中で 関数ポインタか関数オブジェクトだと仮定して呼び出しています。 さらに基底クラスのポインタを目的のクラスが保持してやり、 こちらはコンストラクタをテンプレートにすることで引数から型を推測してもらうことで 先ほどのテンプレートクラスのインスタンスを作成しています。 そしてポインタを介してfunc()を使ったり…、などすれば、 とりあえず引数なしの関数と関数オブジェクトを同等に扱えないかなと思ったからです。 で、このようなクラスを作成してコンパイルすると、 void func(); //何かしら処理する関数 class Function { public: void operator ()(); //何かしら処理する関数オブジェクト }; があったとして、 int main() { Function function; Hoge hoge(function); //いったん作ってから渡す Hoge hoge2(func); //関数を渡す hoge.DoSomething(); hoge2.DoSomething(); } は動きました。しかし、 int main() { Hoge hoge(Function()); //引数を初期化する } とすると次のようなエラーが出ます。 warning C4930: 'Hoge hoge(Function(__cdecl *)(void))': プロトタイプされている関数が呼び出されませんでした (変数の定義が意図されていますか?) また、 int main() { Hoge hoge(Function()); //引数を初期化する hoge.DoSomething(); //クラスにアクセス } とすると次のようなほかのエラーが出ます。 error C2228: '.DoSomething' の左側はクラス、構造体、共用体でなければなりません。 しかし、例えば関数オブジェクトのコンストラクタに引数が設定されていたとして、 class Function { public: Function(int dummy); //何か値を受け取る void operator ()(); //何かしら処理する関数オブジェクト }; となっていた時、 int main() { Hoge hoge(Function(1)); //引数を初期化する hoge.DoSomething(); //クラスにアクセス } の呼び出しは正常にコンパイルされ、想定通りの動きをします。 全く使わなくても、一つ以上の適当な引数を何でもいいからコンストラクタが持てば、 普通にコンパイルされるみたいです。ただ、デフォルト引数を与えてHoge hoge(Function())と 同じ形ですと引数があってもできないみたいです。 まったく通らないなら最初からあきらめるですが、中途半端にちゃんと動くために エラーの原因を知りたいと思っています。 テンプレートの場合には、引数に渡すタイミングで初期化はしてはいけないのでしょうか? 可変引数??? 昔作った記憶はあったのですが、具体的にどうすれば良いか忘れてしまい 詳しい方にお聞きしたいのですが、 printf("data=%d, result=%d, msg=%s\n", data, result, msg); のように書式設定できる可変引数?できるような関数(↓)を作りたいです。 test(100, "XXXX", "data=%d, result=%d, msg=%s\n", data, result, msg); VC2005や C#では使わない方が良い?のでしょうか。 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
うーむ、構文は間違ってないと思うのですが。 もういちど調べてみます。