如何在C ++中的函数内部更改数组

问题描述

我正在尝试编写C ++ rk4算法,无论尝试如何,我似乎都遇到了相同的错误。我可以编译程序,但是我不断得到zsh: segmentation fault (core dumped) ./main。我认为问题出在rk4函数内:

void funcs::rk4(double *p_vec,double h)
{

    double *k0,*k1,*k2,*k3,*l0,*l1,*l2;


    k0 = force( p_vec );

    for ( int inst = 0; inst < 2; ++inst )
    {
        l0[ inst ] = p_vec[ inst ] + h*( k0[ inst ] );
    }

    k1 = force( l0 );

    for ( int inst = 0; inst < 2; ++inst )
    {
        l1[ inst ] = p_vec[ inst ] + ( h/2 ) * ( k1[ inst ] );
    }

    k2 = force( l1 );

    for ( int inst = 0; inst < 2; ++inst )
    {
        l2[ inst ] = p_vec[ inst ] + ( h/2 ) * ( k2[ inst ] );
    }

    k3 = force( l2 );

    for ( int inst = 0; inst < 2; ++inst )
    {
        ( p_vec )[ inst ] += ( ( k0[ inst ] ) + 2*( k1[ inst ] ) + 2* ( k2[ inst ] ) + ( k3[ inst ] ) )*( h/6 );

    }

}

如果有帮助,这里也是主要功能:

#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include "functions.h"

using namespace std;

int main( int argc,char **argv )
{
    float alpha = 0,beta = 1;
    int Number = 1000;
    double h = ( beta - alpha )/ Number;
    double postiton_0 = 1.0,velocity_0 = 0.0;

    vector<double> time = funcs::linspace( alpha,beta,Number );
    double p_vector[2] = { postiton_0,velocity_0 };

    for ( int inst = 0; inst <= Number; ++inst )
    {
        funcs::rk4( p_vector,h );

        cout << inst << "," << p_vector[ 0 ]
            << "," << p_vector[ 1 ] << endl;
    }

    return 0;

}

非常感谢您!

编辑:

感谢您的快速回复!

以下是来源:

double * funcs::force(double *p_vec)
{
    double force_position = p_vec[ 0 ],force_velocity = p_vec[ 1 ];
    static double force_p_vec[ 2 ];

    double force_acceleration = -force_position*force_position;

    force_p_vec[ 0 ] = force_velocity;
    force_p_vec[ 1 ] = force_acceleration;

    return force_p_vec;
}

问题是,当我尝试在不使用rk4的情况下运行force函数时,我确实得到了数字,也许这就是我使用指针的方式。没有他们,我能做些什么?谢谢。

更新:

我决定接受不使用指针和动态内存分配的建议,并使用以下代码:

void funcs::rk4(double *p_vec,double h)
{

    double temp[ 2 ];

    double *k0 = force( p_vec );

    for ( int inst = 0; inst < 2; ++inst )
    {
        temp[ inst ] = p_vec[ inst ] + h*( k0[ inst ] );
    }

    double *k1 = force( temp );

    for ( int inst = 0; inst < 2; ++inst )
    {
        temp[ inst ] = p_vec[ inst ] + ( h/2 ) * ( k1[ inst ] );
    }

    double *k2 = force( temp );

    for ( int inst = 0; inst < 2; ++inst )
    {
        temp[ inst ] = p_vec[ inst ] + ( h/2 ) * ( k2[ inst ] );
    }

    double *k3 = force( temp );

    for ( int inst = 0; inst < 2; ++inst )
    {
        p_vec[ inst ] += ( ( k0[ inst ] ) + 2*( k1[ inst ] ) + 2* ( k2[ inst ] ) + ( k3[ inst ] ) )*( h/6 );

    }

}

我得到数字,但是它们爆炸到无穷远,这不是预期的效果。这是一个简单的谐波振荡器。位置和速度应在1到0之间振荡。我使用的是相同的力函数。

谢谢!

解决方法

即使最新版本的funcs::rk4()仍然存在一个问题,就是您所有的指针(k0 ... k3)指向{{1} }。因此,当您进行计算时

funcs::force()

所有p_vec[ inst ] += ( ( k0[ inst ] ) + 2*( k1[ inst ] ) + 2* ( k2[ inst ] ) + ( k3[ inst ] ) )*( h/6 ); ... k0实际上具有k3的内容。

因此,您需要k3返回一个数组而不是一个指针。如您所知,您不能返回C样式数组。但是,您可以返回funcs::force()。您的功能变为

std::array

std::array<double,2> funcs::force(double *p_vec) { double force_position = p_vec[ 0 ],force_velocity = p_vec[ 1 ]; std::array<double,2> force_p_vec; //non-static! double force_acceleration = -force_position*force_position; force_p_vec[ 0 ] = force_velocity; force_p_vec[ 1 ] = force_acceleration; return force_p_vec; } 内的每个k0 ... k3也应声明为funcs::rk4()而不是std::array<double,2>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...