ここから本文です

C++の実引数の部分で配列を作成し、関数に渡すことはできますか? int a[] = { ...

アバター

ID非公開さん

2018/7/2121:23:15

C++の実引数の部分で配列を作成し、関数に渡すことはできますか?

int a[] = { 0, 1, 2 };
f ( a );

f ( int a[] = { 0, 1, 2} );
の様に1行にまとめたいのですが、勉強不足でうまく

できません。
また、作った変数は関数部でしか使いません。

どなたかご教授頂けると幸いです。

補足仮引数の部分を曖昧にしてしまい申し訳ありませんでした。
void f ( int *_i );
のようなポインタ型で受け取ろうと思っています。

OpenGLで3Dの頂点x,y,zの値を渡す殆どの関数に
3つの要素をそれぞれ受け取る
void f ( float x, float y, float z );
3つの要素を配列でまとめて受け取る
void f ( float *v );
の2種類があるのですが、一部の関数だけ配列としてしか受け取ってくれないものがあります。

また構造体を使ってpos.x, pos.y, pos.zのように値を渡しているので、それらをまとめるだけに新しく変数は作りたくなく、できることなら
f ( float[] { pos.x, pos.y, pos.z } );
のようにしたいと思っている限りです。

面倒くさがりなものなので…^_^;

閲覧数:
101
回答数:
3

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tre********さん

2018/7/2122:02:47

/*

とか…?

-----実行結果-----
1
2
3
-----
11
22
33

*/

#include <iostream>
#include <initializer_list>

using namespace std;

//オリジナルf()
void f(const int a[3]) {
for (int i = 0; i < 3; i++)cout << a[i] << endl;
}

//イニシャライザ仕様に対応させるためのf()のオーバーロード(引数をオリジナルに転送)
void f(initializer_list<int> list) {
f(list.begin());
}

int main(void){

int a[] = {1,2,3};
f(a);

cout << "-----" << endl;

f({11,22,33});

return 0;
}

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

prwssさん

2018/7/2409:58:56

>C++の実引数の部分で配列を作成

可変長引数でお茶を濁す、という手段もあります


可変引数テンプレート - cpprefjp C++日本語リファレンス
https://cpprefjp.github.io/lang/cpp11/variadic_templates.html

【C言語】可変長引数を受け取る関数の作り方【stdarg.h(va_list/va_start/va_arg/va_end)】 | MaryCore
http://marycore.jp/prog/c-lang/variable-argument/

ikt********さん

2018/7/2209:59:06

> f ( int a[] = { 0, 1, 2} ); の様に...

C++11以降、以下の構文で可。
f ({0, 1, 2});

ただ、受け手側 の f がまったく書かれてないので、なんとも。
f の仮引数型は、なんなんですか?
それも含めての、意図的な曖昧質問なのかしら。(^_^;)

C++は C言語互換であれ って宿命(?)に縛られてるから、
言語組み込みの生な 配列 の扱いは、基本的にCに
合わせるしかない。
個人的には、
・コンテナ(std::vector, std::array)を使い、
・C互換の 配列のややこしさ を避けて通る
ことをお勧めする。

以下、テキトーに書いたコードピース。
配列 を引数にとる版も入れたけど、
お勧めしない。 vector 使えばいいと思います。
# 配列のreference とかわかる方なら、そもそもこんな
# 質問はなさらないはず。


#include <vector>
#include <array>
#include <iostream>

void f(const std::vector<int>& values) {
    std::cout << __func__ << " ----" << std::endl;
    for (auto v : values)
        std::cout << v << std::endl;
}

void g(const std::array<int, 3>& values) {
    std::cout << __func__ << " ----" << std::endl;
    for (auto v : values)
        std::cout << v << std::endl;
}

void h1(const int (&values)[3]) {
    std::cout << __func__ << " ----" << std::endl;
    for (auto v : values)
        std::cout << v << std::endl;
}

template <std::size_t N>
void h2(const int (&values)[N]) {
    std::cout << __func__ << " ----" << std::endl;
    for (auto v : values)
        std::cout << v << std::endl;
}

void xx(int a[]) {}

int main() {
    f({0, 1, 2});
    g({2, 1, 0});
    h1({3, 7, 5});
    h2({2, 6, 4});
}

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる