質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C++

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

Q&A

1回答

1722閲覧

C++での3D配列の引数に波括弧(中括弧)が使われる場合

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2020/06/22 06:00

お世話になっております。

C++で書かれたコードを読んでいるのですが、C言語系の言語やそもそもプログラミングの経験もそれほどはなく、苦労しております。

次のような、配列の特定の位置への数値の代入文があります。

C++

1THM(1, {1, Construct(Surface(SurfNum).Construction).NumCTFTerms + 1}, SurfNum) = Surface(SurfNum).OutDryBulbTemp;

この中で、THMはArray3D<Real64>と型宣言されております。
この文における、{}の意味がよくわかりません。色々情報を集めてみたものの該当すると思われるものがありません。

情報をいただけると非常にありがたいです。

どうぞよろしくお願いいたします。

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

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

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

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

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

yumetodo

2020/06/22 10:42

は?回答中に退会していったんだが????
guest

回答1

0

当該コードは

https://github.com/NREL/EnergyPlus/blob/9e88f630aeacbd4d030305988ac2d6d071005d80/src/EnergyPlus/HeatBalanceSurfaceManager.cc#L2147
これかな?今度からどこから引っ張ったコードか質問文に含めるのをお忘れなきよう。

cpp

1THM(1, {1, Construct(Surface(SurfNum).Construction).NumCTFTerms + 1}, SurfNum) = Surface(SurfNum).OutDryBulbTemp;

を分解していきます。

まずTHM

cpp

1Array3D<Real64> THM; // Master Temperature History (on the time step for the construct)

のように定義されている変数です。
https://github.com/NREL/EnergyPlus/blob/e3becf2f977340f20dc05a3b3836dc7ecd60b8ed/src/EnergyPlus/DataHeatBalSurface.cc#L240

さて、変数のあとに()を続ける記法といえばなにか、そう、operator()です。Array3Dというクラスはこのoperatorを持つはずです。

探してみるとその基底クラスのArray3クラスが持っています。いくつかoverloadされていますが、該当するのはこれでしょう。

cpp

1 // array( i1, s2, i3 ) 2 Array1S< T > 3 operator ()( int const i1, IS const & s2, int const i3 ) 4 { 5 std::int64_t k( -shift_ ); 6 k += slice_k( I1_, i1, z2_ * z3_ ); 7 DS const d2( I2_, s2, z3_ ); 8 k += slice_k( I3_, i3 ); 9 return Array1S< T >( data_, k, d2 ); 10 }

https://github.com/NREL/EnergyPlus/blob/eb68ccb2bfb3d01807412e33399299da8cdb4b11/third_party/ObjexxFCL/src/ObjexxFCL/Array3.hh#L1127-L1136

第2引数のISが何かというと

cpp

1typedef typename Super::IS IS;

https://github.com/NREL/EnergyPlus/blob/eb68ccb2bfb3d01807412e33399299da8cdb4b11/third_party/ObjexxFCL/src/ObjexxFCL/Array3.hh#L53

となっており、Super

cpp

1 typedef Array< T > Super;

https://github.com/NREL/EnergyPlus/blob/eb68ccb2bfb3d01807412e33399299da8cdb4b11/third_party/ObjexxFCL/src/ObjexxFCL/Array3.hh#L35

となっていますから、Arrayクラスをみると

cpp

1 typedef IndexSlice IS;

https://github.com/NREL/EnergyPlus/blob/eb68ccb2bfb3d01807412e33399299da8cdb4b11/third_party/ObjexxFCL/src/ObjexxFCL/BArray.hh#L31

となっています。

さて、{1, Construct(Surface(SurfNum).Construction).NumCTFTerms + 1}{}はなにかを調べるにはIndexSliceクラスのコンストラクタを見る必要があります。{}記法は、まずstd::initializer_listを引数に取るコンストラクタを探し、なければ通常の()でのコンストラクタ呼び出しと等価になる(こっちはuniform initialization)記法です

探してみるとstd::initializer_listを取るコンストラクタがありました。

cpp

1 // Initializer List of Integer Constructor 2 template< typename U, class = typename std::enable_if< std::is_constructible< int, U >::value >::type > 3 IndexSlice( std::initializer_list< U > const lus ) : 4 l_init_( lus.size() > 0u ), 5 u_init_( lus.size() > 1u ), 6 scalar_( false ), 7 l_( 1 ), 8 u_( 0 ), 9 s_( 1 ), 10 size_( 0u ) 11 { 12 size_type const n( lus.size() ); 13 assert( n <= 3 ); 14 auto i( lus.begin() ); 15 switch ( n ) { 16 case 0: // {} 17 l_ = 1; 18 u_ = 0; 19 s_ = 1; 20 break; 21 case 1: // {l} 22 l_ = *i; 23 u_ = 0; 24 s_ = 1; 25 break; 26 case 2: // {l,u} 27 l_ = *i; 28 u_ = *(++i); 29 s_ = 1; 30 break; 31 case 3: // {l,u,s} 32 l_ = *i; 33 u_ = *(++i); 34 s_ = *(++i); 35 break; 36 } 37 assert( s_ != 0 ); 38 size_ = computed_size(); 39 }

https://github.com/NREL/EnergyPlus/blob/eb68ccb2bfb3d01807412e33399299da8cdb4b11/third_party/ObjexxFCL/src/ObjexxFCL/IndexSlice.hh#L92-L130

という感じで{}の謎は解決されました。

投稿2020/06/22 10:31

編集2020/06/22 10:35
yumetodo

総合スコア5852

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問