我有这个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.
答案 0 :(得分:3)
确切地说,由于您返回的double
数组已经衰减到double*
,但该函数被定义为返回double
。类型T
和类型T
的数组在C ++中是不同的类型,一般来说它们之间无法转换。
在这种情况下,您可能最好使用std::pair<T1, T2>
(#include <utility>
),因为您使用的是C ++和标准库,或者是具有两个{{1}字段的结构}}。查找double
和std::pair<>
,前者用于制作不同类型的元素对,后者用于制作不同类型任意大小的元组。
当您将std::tie<>
的元素写入std::pair
时,请使用std::cout
,first
成员访问该对的字段。无法使用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::tuple
或std::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};
}