Fortran Coder

查看: 10239|回复: 6
打印 上一主题 下一主题

[文件读写] 在函数子程序中用if结构时遇到奇怪的报错,望各位大大斧正

[复制链接]

26

帖子

5

主题

0

精华

熟手

F 币
123 元
贡献
78 点
跳转到指定楼层
楼主
发表于 2015-5-17 20:05:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 McP 于 2015-5-17 21:06 编辑

函数子程序代码如下
[Fortran] 纯文本查看 复制代码
function ks(n,th,thwp,thj,c1,c2,c3,c4,d1,d2,d3,d4,dx1,dx2,dx3,dx4,t) result(kss)
implicit none
integer,intent(in)::n,dx1,dx2,dx3,dx4,t
real,intent(in)::th,thwp,thj,c1,c2,c3,c4,d1,d2,d3,d4
real::kss
first: if(th>thj) then kss=1.0 !此行报错为Error: Syntax error, found IDENTIFIER 'THEN' when expecting one of: THEN
             else !此行报错为Error: An ELSE statement occurred without a corresponding IF THEN statement.
next: if(t>=0.and.t<dx1) then kss=c1*((th-thwp)/(thj-thwp))**d1  !此行报错为Error: Syntax error, found IDENTIFIER 'THEN' when expecting one of: THEN
            elseif(t>=dx1.and.t<(dx1+dx2)) then kss=c2*((th-thwp)/(thj-thwp))**d2   !此行报错为Error: Syntax error, found IDENTIFIER 'THEN' when expecting one of: THEN
         elseif(t>=(dx1+dx2).and.t<(dx1+dx2+dx3)) then kss=c3*((th-thwp)/(thj-thwp))**d3   !此行报错为Error: Syntax error, found IDENTIFIER 'THEN' when expecting one of: THEN
         elseif(t>=(dx1+dx2+dx3).and.t<=(dx1+dx2+dx3+dx4)) then kss=c4*((th-thwp)/(thj-thwp))**d4   !此行报错为Error: Syntax error, found IDENTIFIER 'THEN' when expecting one of: THEN
         else print*,'该时间超出计算范围' !此行报错为Error: Syntax error, found '*' when expecting one of: <END-OF-STATEMENT> ;
         endif next !此行报错为Error: An ENDIF occurred without a corresponding IF THEN or ELSE statement.
endif first
end function

当然,一但把if结构改成if语句就没问题了,但希望弄清楚为什么会出现这么诡异的情况。望得闻圣音!
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2015-5-17 21:43:09 | 只看该作者
if ( ... ) a = 1
注意这种用法不写 then

或者

if ( ... ) then
  a = 1
else
  a = 2
end if

这两种用法

26

帖子

5

主题

0

精华

熟手

F 币
123 元
贡献
78 点
板凳
 楼主| 发表于 2015-5-17 21:47:19 | 只看该作者
本帖最后由 McP 于 2015-5-17 21:48 编辑
vvt 发表于 2015-5-17 21:43
if ( ... ) a = 1
注意这种用法不写 then

您好!您说的第一种应该是if语句,改成这种确实就没问题了。
但这个程序里用的是if结构,也就是您说的第二种(还有if结构的嵌套,next嵌套在first内),但编译出错,错误在每一行出错程序后面附有,还望能指点一二!

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
地板
发表于 2015-5-17 21:50:50 | 只看该作者
[Fortran] 纯文本查看 复制代码
function ks(n,th,thwp,thj,c1,c2,c3,c4,d1,d2,d3,d4,dx1,dx2,dx3,dx4,t) result(kss)
implicit none
integer,intent(in)::n,dx1,dx2,dx3,dx4,t
real,intent(in)::th,thwp,thj,c1,c2,c3,c4,d1,d2,d3,d4
real::kss
if(th>thj) then 
   kss=1.0
else
  if(t>=0.and.t<dx1) then
    kss=c1*((th-thwp)/(thj-thwp))**d1
  elseif(t>=dx1.and.t<(dx1+dx2)) then 
    kss=c2*((th-thwp)/(thj-thwp))**d2
  elseif(t>=(dx1+dx2).and.t<(dx1+dx2+dx3)) then 
    kss=c3*((th-thwp)/(thj-thwp))**d3
  elseif(t>=(dx1+dx2+dx3).and.t<=(dx1+dx2+dx3+dx4)) then 
    kss=c4*((th-thwp)/(thj-thwp))**d4
  else 
    print*,'该时间超出计算范围'
  endif
endif
end function 

26

帖子

5

主题

0

精华

熟手

F 币
123 元
贡献
78 点
5#
 楼主| 发表于 2015-5-17 22:17:22 | 只看该作者
vvt 发表于 2015-5-17 21:50
[mw_shl_code=fortran,true]function ks(n,th,thwp,thj,c1,c2,c3,c4,d1,d2,d3,d4,dx1,dx2,dx3,dx4,t) resul ...

if(...)then后的语句写在下一行就好了啊。。。如此神奇!
多谢大大指点!

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
6#
发表于 2015-5-18 08:29:53 | 只看该作者
另外,我从来没使用命名的 if,比如你的 first 和 next。一点用都没有,还破坏程序可读性。
我也极少使用命名的 Do,这个稍微有点用,但能不用就不用。

26

帖子

5

主题

0

精华

熟手

F 币
123 元
贡献
78 点
7#
 楼主| 发表于 2015-5-18 19:50:44 | 只看该作者
vvt 发表于 2015-5-18 08:29
另外,我从来没使用命名的 if,比如你的 first 和 next。一点用都没有,还破坏程序可读性。
我也极少使用命 ...

命名是看教材例题上有才模仿的,说是层次性比较强,也增加可读性。。。
do我一般也直接enddo,但看网上也有不少码友用命名和continue的。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-4-23 17:14

Powered by Tencent X3.4

© 2013-2024 Tencent

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