2016-07-11 6 views
1

私はこのC++プログラムがあります。可変要素を持つC++配列を作成するには?

:あなたはこのプログラムで見ることができるように、私は第二次微分方程式を(私の質問にLaTeXの数式を挿入する方法があるなら、私に教えてください)解決しています

#include <iostream> 
#include <vector> 
#include <string> 
#include <fstream> 
#include <cmath> 

using namespace std; 

double dx2(int t, int x, int dx) 
{ 
    return (-9.8*cos(x)); 
} 

int square(int x) 
{ 
    return (x*x); 
} 

double RK4(float t, float x, float dx, float h) 
{ 
    double k1, k2, k3, k4, l1, l2, l3, l4, diff1, diff2; 
    k1 = h*dx2(t,x,dx); 
    l1 = h*k1; 
    k2 = h*dx2(t+h/2,x+l1/2,dx+k1/2); 
    l2 = h*k2; 
    k3 = h*dx2(t+h/2,x+l2/2,dx+k2/2); 
    l3 = h*k3; 
    k4 = h*dx2(t+h,x+l3,dx+k3); 
    l4 = h*k4; 
    diff1 = (l1+2*l2+2*l3+l4)/float(6); 
    diff2 = (k1+2*k2+2*k3+k4)/float(6); 
    double OUT[] = {diff1, diff2}; 
    return OUT; 
} 

int main() 
{ 
    double diff, t, t0, t1, x, x0, dx, dx0, h, N; 
    N = 1000; 
    t0 = 0; 
    t = t0; 
    t1 = 10; 
    x0 = 0; 
    x = x0; 
    dx0 = 0; 
    dx = dx0; 
    h = (t1 - t0)/float(N); 

    for(int i = 1; i<=N; i++) { 
     diff = RK4(t,x,dx,h); 
     x = x + diff; 
     t = t + h; 
    } 
    cout << diff; 
    return 0; 
} 

を運動の単純な振り子の方程式の例である

D2X/DT2 = -9.8 COS(X)

。問題の行は33と34です。その中でOUT配列の最初の要素をdiff1、2番目の要素をdiff2と定義しようとしています。あなたはdouble*まで減衰double年代の配列を、帰国していることから、正確に

g++ -Wall -o "example" "example.cpp" (in directory: /home/fusion809/Documents/CodeLite/firstExample) 
example.cpp: In function ‘double RK4(float, float, float, float)’: 
example.cpp:33:9: error: cannot convert ‘double*’ to ‘double’ in return 
    return OUT; 
     ^~~ 
Compilation failed. 
+0

'enum'の配列を作成できますか? –

+3

誰かがこのような質問を下げている人は、メモを残すほど親切にしてください。ありがとうございました。経験豊かなC++プログラマーには何が分かりそうかと尋ねていますが、私にとっては問題ないと思います。科学者は必ずしもプログラミング言語を知っているとは限らないことに注意してください。 – iksemyonov

+0

さて、ほとんどのコードは、それが何であれ、問題に無関係であるようです。タイトルと組み合わせると、その質問が何であるかは不明です。 – juanchopanza

答えて

3

が、機能はdoubleを返すように定義されています。私は(example.cppという名前)は、このプログラムをコンパイルするたびに、私はエラーを取得します。 Tの配列とTの型は、C++では異なる型であり、一般的に言えば、それらの間では変換できません。この場合

あなたがC++標準ライブラリ、またはタイプdoubleの2つのフィールドを持つ構造を使用しているので、あなたはstd::pair<T1, T2>#include <utility>)としたほうが良いかもしれません。 std::pair<>std::tie<>を探します。前者は異なるタイプの要素のペアを作成するために使用され、後者は異なるタイプのタプルを作成するために使用されます。

std::pairの要素をstd::coutに書き込むときは、first,secondのメンバーを使用してペアのフィールドにアクセスします。 std::pairは、std::coutのオーバーロードされたストリーム演算子を使用して直接出力することはできません。

編集:

#include <utility> 

std::pair<double, double> RK4(float t, float x, float dx, float h) 
{ 
    /* snip */ 
    diff1 = (l1+2*l2+2*l3+l4)/float(6); 
    diff2 = (k1+2*k2+2*k3+k4)/float(6); 
    return {diff1, diff2}; 
} 

int main() 
{ 
    double x, dx; 
    /* snip */ 
    for(int i = 1; i<=N; i++) { 
     std::pair<double, double> diff = RK4(t,x,dx,h); 
     // or use with C++11 and above for brevity 
     auto diff = RK4(t,x,dx,h); 
     x = x + diff.first; 
     dx = dx + diff.second; 
     t = t + h; 
    } 
    cout << x << " " << dx << "\n" ; 
    return 0; 
} 
+1

'first'と' second'はpublicデータメンバであり、関数ではありません。 –

+0

申し訳ありませんが、私はそれを混乱させています。メモをありがとうございます。 – iksemyonov

+0

OK。私はあなたが意味することに追いつこうとしています、それはちょうど私が私のコードに行う必要があることを正確に心に留めようとしています...あなたの答えはあまりにも理論的に適用されているように思われる、前の例で実装する必要がありますか? – BH2017

1

あなたRK4関数の戻り値の型が単一の値である、doubleですが、あなたはそれらの2の配列を返すようにしようとしています。それは動作しません。戻り値の型をdouble*に変更し、new double[2]を使用して配列を割り当てることができますが、戻り値の型としてstd::pair<double, double>を使用する方が簡単で安全です。次に、return { diff1, diff2 };を実行してください。あなたは、いくつかの選択肢持っている関数から複数の値を返すために

+0

33/34を 'return {diff1、diff2};に変更すると、' g ++ -Wall -o "の例" "example.cpp"(ディレクトリ:/ home/fusion809/Documents/CodeLite/firstExample) の例が得られます。cpp:関数 'double RK4(float、float、float、float)': example.cpp:32:24:エラー:返された ''を 'double'に変換できません。 return {diff1 、diff2}; ^ コンパイルに失敗しました。 ' – BH2017

+0

戻り値の型を' std :: pair 'に変更する必要があります。 – iksemyonov

+0

どのように?私はC++を初めて使っています。申し訳ありませんが、私が求めていることがあなたにとって些細なようであれば、私はこの言語を手に入れようと努力しています。 – BH2017

1

std::array<double, 2> RK4(float t, float x, float dx, float h) 
{ 
    // ... 
    return {{diff1, diff2}}; 
} 

またはstd::vector

std::vector<double> RK4(float t, float x, float dx, float h) 
{ 
    // ... 
    return {{diff1, diff2}}; 
} 
:あなたはタイプを返されるすべてとして

  • あなたは、配列を返すことがあり、同一であり、

  • std::tupleまたはを返すことがあります(2つの要素に限る):

    std::pair<double, double> RK4(float t, float x, float dx, float h) 
    { 
        // ... 
        return {{diff1, diff2}}; 
    } 
    

    または

    std::tuple<double, double> RK4(float t, float x, float dx, float h) 
    { 
        // ... 
        return {{diff1, diff2}}; 
    } 
    
  • また、あなたはいずれかを使用することができ、カスタムクラス

    struct RK4Result 
    { 
        double diff1; 
        double diff2; 
    }; 
    
    RK4Result RK4(float t, float x, float dx, float h) 
    { 
        // ... 
        return {diff1, diff2}; 
    } 
    
  • そして移動する高価なタイプのために作成することができ以前の方法ではなく、の出力パラメータ:

    struct RK4Result 
    { 
        double diff1; 
        double diff2; 
    }; 
    
    void RK4(float t, float x, float dx, float h, RK4Result& res) 
    { 
        // ... 
        res = {diff1, diff2}; 
    } 
    
関連する問題