🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

6178閲覧

C++で、可変個数の引数を配列で渡す方法

puroguraman

総合スコア20

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/10/05 11:46

C++で可変個数の引数を配列で渡せるようにしたいです。
どなたかお力を貸してください。下記のように作成しました。

以下抜粋です。引数を並べて文字列作りたいです。

void ver_regi(float num1, float num2, float num3, ...) {

//可変引数処理 va_list args[5]; float value; int count; va_start(*args, num3);   ←どうやらここのポインタ渡し的なことが問題 for (count = 0; count < num3; count++) { sprintf_s(s1, " %f %f %f", va_arg(args[0], float), va_arg(args[1], float), va_arg(args[2], float)); //countはどこにもやらなくても自動らしい。 } va_end(*args);

}

ポインタ渡しとかいろいろ考えましたが限界です。どなたか教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2019/10/05 13:19

ver_regi()関数の出力は何でしょうか? 配列? 文字列? 標準出力? まずはやりたいことを明確化しましょう。
puroguraman

2019/10/05 13:41

cateyeさん 一つの配列にするとわかりにくくなってしまうのです。第三引数はこれ、第四引数はこれと区別がしたいのです。 Chironianさん やりたいことはC++で可変個数の引数を配列で渡せるようにしたいです。タイトル通りですよ。 名前の付け方が正しいかどうかわかりませんでしたが、printfとか引数を増やせますよね。あれは変数ですが配列でやりたいのです。
Zuishin

2019/10/05 14:08

一つの配列にするとわからなくなるのに配列でやりたいと。
puroguraman

2019/10/05 14:17

三次元の座標を格納する配列です。 一つの配列にxyzいれて、たとえば四角なら四頂点で4つの配列ってな感じです
cateye

2019/10/05 16:17

struct point{ float x,y,z}; std::vector<point> pointVec; とかじゃダメなのでしょうか?
guest

回答3

0

ベストアンサー

こんにちは。

C++らしい安全な可変長パラメータ引数はC言語形式とは異なっています。
可変引数テンプレートと呼ばれます。

ver_regi()へ与えた「float型へキャスト可能な実引数」を array配列へ放り込んでます。
ちょっとばかし難易度高いのですが、頑張ってみて下さい。

C++

1#include <iostream> 2 3template<typename... tTypes> 4void ver_regi(tTypes... iParams) 5{ 6 float array[]= 7 { 8 static_cast<float>(iParams)... 9 }; 10 11 for (float elem : array) 12 { 13 std::cout << elem << "\n"; 14 } 15} 16 17int main() 18{ 19 ver_regi(1.1, 2.2, 3.3); 20}

wandbox

投稿2019/10/05 13:59

編集2019/10/05 14:06
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

puroguraman

2019/10/05 14:23

回答ありがとうございます。 コードまで書いていただいて恐縮ですがレベルが高すぎて。。。 http://wisdom.sakura.ne.jp/programming/c/c62.html ここのを真似したのですが、vaを使う手段は良くないでしょうか?というかこっちは原理的に配列でできませんか?
Chironian

2019/10/05 14:43

リンク先のサンプル・コードは可変長引数の数を先頭の引数で渡しています。サンプル・コードを理解されていないようですので、まずはステップ実行しつつ各変数の内容を確認してみて、振る舞いを確認することをお勧めします。 C++の動的配列はstd::vectorです。std::vector<float>を確保してpush_backで放り込めばよいです。 サンプル・コードの振る舞いを理解すれば容易ですので、まずはトライされてみては如何でしょうか? その上でうまく行かないようなら、「入力に対する期待する出力、および、何がうまくいかないのか(コンパイルに通らない、出力が〇〇となってしまう等)」を質問に追記されると解決が早いと思いますよ。
guest

0

回答に成るかどうか?とりあえずvectorを使った方法。

c++

1#include <iostream> 2#include <vector> 3 4struct point { 5 float x; 6 float y; 7 float z; 8}; 9 10typedef std::vector<point> pointVec; 11 12static void set(pointVec &pv, float x, float y, float z) 13{ 14 point sp; 15 16 sp.x = x; 17 sp.y = y; 18 sp.z = z; 19 // 20 pv.push_back(sp); 21} 22static void print(const pointVec &pv) 23{ 24 for (size_t i = 0; i < pv.size(); i++) { 25 std::cout << "x=" << pv[i].x << " y=" << pv[i].y << " z=" << pv[i].z << std::endl; 26 } 27} 28 29int main(void) 30{ 31 // 32 pointVec pv; 33 set(pv, 1.0f, 2.0f, 3.0f); 34 set(pv, 4.0f, 5.0f, 6.0f); 35 set(pv, 7.0f, 8.0f, 9.0f); 36 set(pv, 0.1f, 0.2f, 0.3f); 37 set(pv, 0.4f, 0.5f, 0.6f); 38 set(pv, 0.7f, 0.8f, 0.9f); 39 // 40 print(pv); 41 // 42 return 0; 43}

実行結果

text

1usr ~/Project/test % ./a.out 2x=1 y=2 z=3 3x=4 y=5 z=6 4x=7 y=8 z=9 5x=0.1 y=0.2 z=0.3 6x=0.4 y=0.5 z=0.6 7x=0.7 y=0.8 z=0.9 8usr ~/Project/test % 9

投稿2019/10/06 01:46

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2019/10/06 02:12

C++11以降ならば 呼び出し方法として print({ {0.1, 0.2, 0.3}, {4, 5, 6}, {.7, .8, .9} }); なんかでもいいですね
guest

0

三次元の座標を格納する配列です。
一つの配列にxyzいれて、たとえば四角なら四頂点で4つの配列ってな感じです

x,y,zの三つ組 を任意の個数、関数に渡したいってこと?

C++

1#include <iostream> 2#include <array> 3#include <vector> 4 5using point3d = std::array<float,3>; // floatの三つ組 6 7template<typename Iter> 8void print(Iter first, Iter last) { 9 while ( first != last ) { 10 const point3d& item = *first; 11 std::cout << item[0] << ',' 12 << item[1] << ',' 13 << item[2] << std::endl; 14 ++first; 15 } 16} 17 18int main() { 19 std::vector<point3d> data = { 20 { 1, 2, 3 }, 21 { 4, 5, 6 }, 22 { 7, 8, 9 }, 23 { 0, 1, 2 }, 24 }; 25 // [x,y,z] を4つ、printに渡す 26 print(data.begin(), data.end()); 27 28}

投稿2019/10/06 00:11

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問