2017-03-08 5 views
-3

私の仕事は、C++をベースにしたOpenFOAM(流体シミュレーションのもの)で動作させました。私はC++については何も知らず、世界のプログラムをコンパイルする方法さえも知らない。 OpenFOAMでは、3次元配列をASCIIファイルとしてテキストファイルに出力できます。私の計算に時間がかからないのでこれは大丈夫です。ファイルには、1行に1つの値があります。これらの値にはどのような順序がありますか?したがってC++はデフォルトでどのように配列を出力しますか?

、FortranでIは

WRITE(*,*) 3d_array 

を行うことができ、それは、それらが保存された順序で配列の値が表示され、これが最初の反復がx方向にあることを意味し、Yに、その後にz方向。出力は次のように出力されます:

integer, allocatable, dimension(x,y,z)::3d_array 
[...] 

do k=1,z 
    do j=1,y 
     do i=1,x 
      write(*,*) 3d_array(i,j,k) 
     end do 
    end do 
end do 

C++での動作は?

+1

もう少し必要です。配列はどのようにC++で宣言されていますか? – sp2danny

+1

私はこのより良い答えをしたいと思います。フィールドのヘッダーには、volScalarFieldと表示されます。私はそれが三次元であることを知っています。サイズを定義する変数はx、y、zでもあり、それらの順序は同じです。 volScalarFieldはC++クラスです。ここには何かがあります:http://openfoamcfd.sourceforge.net/doc/Doxygen/html/dc/d89/namespaceFoam.html#a128しかし、私は今それを取得しません。 –

+0

@DevSolar音色はお詫びしますが、本当に知りたかったのは、配列のデフォルト出力がC++でどのようになっているかです。私はデフォルト出力がないことを知らなかったので、今私は、Quentinのおかげです。 他の回答/コメントが完全な質問を読んでいないように思われたので、私は迷惑になりました。 –

答えて

2

配列の(またはstd::vectorの、またはstd::arrayの)内容をC++の1回の呼び出しで出力する標準機能はありません。あなたは自分でトリプルループを書く必要があります。

あなたが望む順序で書いてください。同じ順序で読んでください。

0

STDを使用した例::ベクトル:

#include <iostream> 
#include <vector> 

int main() { 
std::vector< std::vector< std::vector<int> > >vec3d{ {{0, 1, 2}, {1, 2, 3}}, {{5, 6}} }; 

for (auto i : vec3d) { 
    std::cout << "["; 
    for (auto j : i) { 
     std::cout << "["; 
     for (auto k : j) { 
      std::cout << k << " "; 
     } 
     std::cout << "]"; 
    } 
    std::cout << "]"; 
} 

return 0; 
} 
1

出力にC++にはデフォルトの方法配列はありません。配列要素は、要素を反復処理するだけで出力できます。

しかし、あなたが話していることは、出力そのものとは無関係です。あなたが話しているのは、線形配列(例えば、x-fastestまたはy-fastest)にマッピングされたときの多次元配列のインデックス順序です。

動的に割り当てられた配列について言及すると、C++はすぐに使用できる多次元の割り当てをサポートしないため、インデックスの順序付けには「デフォルト」の方法はありません。 C++で多次元配列を使用する場合は、インデックスを1次元配列にマップする方法を考える必要があります。配列を出力するときは、個々の要素を1つ1つずつ繰り返して印刷します。結果の順序は、索引マッピングのために選択した順序になります。

もちろん、物理的にメモリに格納されている順序とは異なる順序で印刷することもできます。しかし、デフォルトはありません。

関連する問題