Fortran Coder

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

[求助] unexpected junk after else statement at

[复制链接]

10

帖子

4

主题

0

精华

入门

F 币
65 元
贡献
31 点
跳转到指定楼层
楼主
发表于 2019-11-13 19:56:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
MODULE MOD_FUNC

! module contains functions for P and S-wave velocities, density and
! quality factors in sediments (1st layer)

IMPLICIT NONE

CONTAINS
!==================== 1D INHOMOGENEOUS MEDIUM =========================
!------------------------------------------------- P or S-wave velocity
  FUNCTION FUNCV (Z)

    USE NRTYPE, ONLY: WP

    REAL(WP), INTENT(IN) :: Z
    REAL(WP)             :: FUNCV

    if (z<5) then
      !layer
      funcv = 180
    else if(5<=z<18) then
      !layer
      funcv = 200
    else if(18<=z<54) then
      !layer
      funcv = 360
    else if(54<=z<92) then
      !layer
      funcv = 400
    else if(92<=z<130) then
      !layer
      funcv = 440
    else if(130<=z<165) then
      !layer
      funcv = 460

    else
      !halfspace
      funcv = 970
    end if

  END FUNCTION FUNCV

!--------------------------------------------------------------- Density
  FUNCTION FUNCRHO (Z)

    USE NRTYPE, ONLY: WP

    REAL(WP), INTENT(IN) :: Z
    REAL(WP)             :: FUNCRHO


    if(z<5) then
      !layer
      funcrho = 1220
    else if(5<=z<18) then
      !layer
      funcrho = 1487
    else if(18<=z<54) then
      !layer
      funcrho = 1945
    else if(54<=z<92) then
      !layer
      funcrho = 1966
    else if(92<=z<130) then
      !layer
      funcrho = 1966
    else if(130<=z<165) then
      !layer
      funcrho = 1966
    else
      !halfspace
      funcrho = 2123
    end if

  END FUNCTION FUNCRHO

!------------------------------------------- P or S-wave quality factor
  FUNCTION FUNCQ (Z)

    USE NRTYPE, ONLY: WP

    REAL(WP), INTENT(IN) :: Z
    REAL(WP)             :: FUNCQ

    if(z<165) then
      !layer
      funcq = 50
    else
      !halfspace
      funcq = 10000
    end if
  END FUNCTION FUNCQ

END MODULE

这是代码,运行后出现图片的错误,unexpected junk after else statement

2019-11-13 19-02-53 的屏幕截图.png (69.85 KB, 下载次数: 339)

出现这种错误

出现这种错误
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

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

沙发
发表于 2019-11-14 08:46:52 | 只看该作者
130<=z .and. z<165

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

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

板凳
发表于 2019-11-14 09:01:23 | 只看该作者
其实你的函数可以简化一下。
[Fortran] 纯文本查看 复制代码
  FUNCTION FUNCRHO (Z)
    USE NRTYPE, ONLY: WP
    REAL(WP), INTENT(IN) :: Z
    REAL(WP)             :: FUNCRHO
    Real(WP) , parameter :: zList(*) = [-huge(z),5._WP,18._WP,54._WP,92._WP,130._WP,165._WP,huge(z)]
    Real(WP) , parameter :: fList(*) = [1220._WP,1487._WP,1945._WP,1966._WP,1966._WP,1966._WP,2123._WP]
    integer :: i
    Do i = 1 , size(zList)-1
      if( zList(i) <= z .and. z < zList(i+1) ) then
        funcRho = fList(i)
        return
      end if
    End Do    
  END FUNCTION FUNCRHO


这样更易读、易修改、易扩展

250

帖子

2

主题

0

精华

宗师

F 币
1731 元
贡献
872 点

规矩勋章

地板
发表于 2019-11-14 09:02:23 | 只看该作者
5<=z<18
这是新的写法吗?可以编译成功但是结果不对。

10

帖子

4

主题

0

精华

入门

F 币
65 元
贡献
31 点
5#
 楼主| 发表于 2019-11-14 15:44:58 | 只看该作者
fcode 发表于 2019-11-14 09:01
其实你的函数可以简化一下。
[mw_shl_code=fortran,true]  FUNCTION FUNCRHO (Z)
    USE NRTYPE, ONLY: WP ...

谢谢了。改了就对了

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
6#
发表于 2019-11-14 19:38:36 | 只看该作者
本帖最后由 vvt 于 2019-11-14 19:40 编辑

5<=z<18
等效于
(5<=z)<18
那么

情况1:
如果 5<=z 是 .true.
而.true. 一般在内存里是 0x01 或 0x0001 之类,或者 0xFF 之类的
.true. < 18 等效于 1<18 或 -1<18,结果是 .true.

情况2:
如果 5<=z 是 .false
而.false. 一般在内存里是 0x00 或 0x0000 之类的
.false. < 18 等效于 0<18,结果也是 .true.

所以,不管怎样,这个表达式的结果都是 .true.


250

帖子

2

主题

0

精华

宗师

F 币
1731 元
贡献
872 点

规矩勋章

7#
发表于 2019-11-15 09:21:23 | 只看该作者

明白了,谢谢
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-25 16:24

Powered by Tencent X3.4

© 2013-2024 Tencent

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