如何用可变元素创建C ++数组?

时间:2016-07-11 04:16:12

标签: c++ arrays

我有这个C ++程序:

#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;
}

正如你在这个程序中看到的那样,我正在解决二阶微分方程(如果有一种方法可以将LaTeX方程插入到我的问题中,请告诉我):

d2x / dt2 = -9.8 cos(x)

这是简单摆的运动方程的一个例子。问题行是33和34.在其中我试图将OUT数组的第一个元素定义为diff1,将第二个元素定义为diff2。每当我编译这个程序(名为example.cpp)时,我都会收到错误:

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.

3 个答案:

答案 0 :(得分:3)

确切地说,由于您返回的double数组已经衰减到double*,但该函数被定义为返回double。类型T和类型T的数组在C ++中是不同的类型,一般来说它们之间无法转换。

在这种情况下,您可能最好使用std::pair<T1, T2>#include <utility>),因为您使用的是C ++和标准库,或者是具有两个{{1}字段的结构}}。查找doublestd::pair<>,前者用于制作不同类型的元素对,后者用于制作不同类型任意大小的元组。

当您将std::tie<>的元素写入std::pair时,请使用std::coutfirst成员访问该对的字段。无法使用second的重载流运算符直接输出std::pair

修改

std::cout

答案 1 :(得分:1)

RK4函数的返回类型为double,这是一个值,但您尝试返回其中两个的数组。那不行。您可以将返回类型更改为double*并使用new double[2]来分配数组,但使用std::pair<double, double>作为返回类型会更简单,更安全。然后你就可以return { diff1, diff2 };

答案 2 :(得分: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::tuplestd::pair(限于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};
    }
    
  • 对于移动类型昂贵,您可以使用任何以前的方法,但可以使用 out 参数:

    struct RK4Result
    {
        double diff1;
        double diff2;
    };
    
    void RK4(float t, float x, float dx, float h, RK4Result& res)
    {
        // ...
        res = {diff1, diff2};
    }