24小时热门版块排行榜    

查看: 1609  |  回复: 0

asunshan

银虫 (著名写手)

[求助] 求助:::module中子程序与函数调用

!!!在调用module中的subroutine bezier_curve时
!!!!!为什么函数ab和函数bezier_control如果调研两次就会出现问题!!!
!!!编译时包若如下:
Error        1         error LNK2019: unresolved external symbol _AB referenced in function _FUN_SUM_mp_BEZIER_CURVE        Source1.obj       
Error        2         error LNK2019: unresolved external symbol _BEZIER_CONTROL referenced in function _FUN_SUM_mp_BEZIER_CURVE        Source1.obj       


module fun_sum
implicit none
real(8)::pz0,pz1,pz2,pz3,pz4
real(8)::pr0,pr1,pr2,pr3,pr4
real(8)::k1,k2,r1,r2,c1,c2
real(8)::a,b
real(8)::ti
real(8)::z(0:50),r(0:50)
integer::i
integer::point_num=50
real(8)::co_rz,co_p2
contains
!!!subroutine计算曲线上坐标
subroutine bezier_curve(t,zi,ri)!注意参数之中有数组元素,考虑如何书写语法
implicit none
real(8)::t,zi,ri
!real,external::zuobiao_co
!real,external::bezier_control
!real,external::ab
!real,external::mid_point
pz0=-19.21  
pz4=23.78407
pr0=68.046
pr4=170.615
k1=0.5
k2=30.0
r1=300.0
r2=5000.0
c1=0.1
c2=-0.5
!计算控制点和的坐标
co_rz=zuobiao_co(pr0,pr4,pz0,pz4,k1,k2)
pz1=pz0+c1*(co_rz-pz0)
pr1=pr0+c1*(k2*co_rz+pr4-pr0-k2*pz4)
pz3=pz4+c2*(pz4-co_rz)
pr3=pr4+c2*(k2*pz4-k2*co_rz)
!计算控制点的坐标
a=ab(pz0,pz1,pr0,pr1,r1)                  !!!为什么function_ab和function_bezier_control如果调研两次就会出现问题!!!
b=ab(pz3,pz4,pr3,pr4,r2)
co_p2=mid_point(pz0,pz1,pz3,pz4,pr0,pr1,pr3,pr4)
pz2=((pz1-pz0)*b-(pz4-pz3)*a)/co_p2
pr2=((pr1-pr0)*b-(pr4-pr3)*a)/co_p2
!计算贝塞尔曲线上从起点到终点的个点的坐标
    zi=bezier_control(pz0,pz1,pz2,pz3,pz4,t) !!!为什么function_ab和function_bezier_control如果调研两次就会出现问题!!!
    ri=bezier_control(pr0,pr1,pr2,pr3,pr4,t)
end subroutine

!!!计算控制点,中常见的部分
real function zuobiao_co(r0,r4,z0,z4,ki,kj)
implicit none
real(8)::r0,r4,z0,z4
real(8)::ki,kj
zuobiao_co=(r4-r0+ki*z0-kj*z4)/(ki-kj)
return
end function
!!!计算控制点的坐标
real function mid_point(z0,z1,z3,z4,r0,r1,r3,r4)
implicit none
real(8)::z0,z1,z3,z4,r0,r1,r3,r4
mid_point=(z1-z0)*(r4-r3)-(z4-z3)*(r1-r0)
return
end function
!!!曲线上坐标点计算公式
real function bezier_control(p0,p1,p2,p3,p4,t)!注意参数之中有数组元素,考虑如何书写语法
implicit none
real(8)::p0,p1,p2,p3,p4
real(8)::t
bezier_control=p0*((1-t)**4)+4*p1*t*((1-t)**3)+6*p2*(t**2)*((1-t)**2)+4*p3*(t**3)*(1-t)+p4*(t**4)
return
end function
!!!计算系数a,b
real function ab(zi,zj,ri,rj,r)
implicit none
real(8)::zi,zj,ri,rj,r
ab=zi*rj-zj*ri-(4*((zj-zi)**2.0+(rj-ri)**2.0)**1.5)/(3.0*r)
return
end function

end module fun_sum

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!主程序
program bezier
!use number
use fun_sum
implicit none
character(len=20)::filename="shroud.txt"
integer,parameter::fileid=10
open(fileid, file=filename)
write(fileid,"(2X'编号',4X'z坐标',7X'r坐标')"
write(*,"(2X'编号',4X'z坐标',7X'r坐标')"
do i=0,point_num
  ti=real(i)/real(point_num)
  call bezier_curve(ti,z(i),r(i))
  write(fileid,"(I5,2X,F10.5,2X,F10.5,2X)"i,z(i),r(i)
  write(*,"(I5,2X,F10.5,2X,F10.5,2X)"i,z(i),r(i)
end do
pause
end program
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 asunshan 的主题更新
信息提示
请填处理意见