Fortran Coder

查看: 10225|回复: 3
打印 上一主题 下一主题

SIGSEGV, segmentation fault occurred

[复制链接]

5

帖子

1

主题

0

精华

入门

F 币
29 元
贡献
19 点
跳转到指定楼层
楼主
发表于 2015-3-27 09:27:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位好,我的程序也是这个错误,我是新手,请帮助修改。谢谢。
[Fortran] 纯文本查看 复制代码
module counts
 integer,parameter::nstep=100
 integer,parameter::nvar=3 !Funcion dimentions
 end module counts

 subroutine derivs(n,x,y,dydx)
 implicit none
 integer::n !方程维数
real::dydx(N),x(N),y(N)

 dydx(1)=y(2)*y(3)
 dydx(2)=-y(1)*y(3)
 dydx(3)=-0.51*y(1)*y(2)
 end subroutine derivs

 subroutine rk4(y,dydx,n,x,h,yout,derivs)
 integer,parameter::nmax=3
 real::h,x,dydx(n),y(n),yout(n)
 external::derivs
 integer::i
 real::h6,hh,xh,dym(nmax),dyt(nmax),yt(nmax)
 hh=h*0.5
 h6=h/6.
 xh=x+hh

 do i=1,n !First step,k1=dydx(i)
 yt(i)=y(i)+hh*dyt(i)
 enddo

 call derivs(xh,yt,dyt) !Second step,k2=dyt
 do i=1,n
 yt(i)=y(i)+hh*dyt(i)
 enddo

 call derivs(xh,yt,dym) !Third step,k3=dym
 do i=1,n
 yt(i)=y(i)+h*dym(i)
 dym(i)=dyt(i)+dym(i) !k3=k3+k2
 enddo

 call derivs(x+h,yt,dyt)!Fourth step,k4=dyt
 do i=1,n
 yout(i)=y(i)+h6*(dydx(i)+dyt(i)+2.*dym(i))
 end do !Every step calculate dydx from x and above y(i)

 return
 end subroutine rk4

 subroutine rkdumb(vstart,nvar,x1,x2,nstep,derivs)
 integer::nstep,nvar
 integer,parameter::nmax=3,nstpmx=100
 real::x2,x1,vstart(nvar),xx(nstpmx),y(nmax,nstpmx)
 external derivs

 integer::i,k
 real::h,x,dv(nmax),v(nmax)
 do i=1,nvar !方程维数
v(i)=vstart(i)
 y(i,1)=v(i)
 enddo
 xx(1)=x1
 x=x1
 h=(x2-x1)/nstep !步长
do k=1,nstep
 call derivs(x,v,dv)
 call rk4(v,dv,nvar,x,h,v,derivs)
 if(x+h.eq.x) pause'stepsize not significant in rkdumb.'
 x=x+h
 xx(k+1)=x
 do i=1,nvar
 y(i,k+1)=v(i)
 enddo
 enddo
 return
 end subroutine rkdumb

 program solve319
 use counts
 implicit none
 integer::i
 integer,parameter::nmax=3,nstpmx=100
 real::x2,x1,vstart(nvar),xx(nstpmx),y(nmax,nstpmx)

 external::derivs,rk4,rkdumb
 vstart(1)=0
 vstart(2)=1
 vstart(3)=1
 x1=0
 x2=12
 print*,vstart(1)
 open(unit=11,file='20150327out.dat')
 do i=1,nstep
 write(unit=11,fmt='(3f12.7)')y(1,i),y(2,i),y(3,i)

 call rkdumb(vstart,nvar,x1,x2,nstep,derivs)
 enddo
 end 
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

5

帖子

1

主题

0

精华

入门

F 币
29 元
贡献
19 点
沙发
 楼主| 发表于 2015-3-27 09:36:43 | 只看该作者
楚香饭 发表于 2015-3-16 19:04
SIGSEGV 段错误,比较难判断。可能是数组越界,内存引用错误。建议debug调试分析以判断。

如果你觉得debug ...

请帮忙查看下我的代码,谢谢您!

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

板凳
发表于 2015-3-27 09:40:12 | 只看该作者
你这错误可大了。

subroutine derivs(n,x,y,dydx) 这是 4 个参数吧?第一个是 N 整型,后面三个数组。

但是你所有的 call derivs(xh,yt,dyt) 都是 3 个参数,第一个是 real,后面两个数组。

5

帖子

1

主题

0

精华

入门

F 币
29 元
贡献
19 点
地板
 楼主| 发表于 2015-3-27 10:02:01 | 只看该作者
fcode 发表于 2015-3-27 09:40
你这错误可大了。

subroutine derivs(n,x,y,dydx) 这是 4 个参数吧?第一个是 N 整型,后面三个数组。

你说的太对了!原来问题在这里,谢谢你!我把derivs改成这样就好了。上帝祝福你!
subroutine derivs(x,y,dydx)
implicit none
integer::n !方程维数
real::dydx(*),x,y(*)
         
dydx(1)=y(2)*y(3)
dydx(2)=-y(1)*y(3)
dydx(3)=-0.51*y(1)*y(2)
end subroutine derivs
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-7 01:55

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表