爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 12151|回复: 7

[求助] fortran中的module使用

[复制链接]

新浪微博达人勋

发表于 2012-4-13 09:11:25 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
请教各位:windos下fortran中一个程序里的module在编译后生成的xx.mod模块被别的程序use的时候是否要注意什么问题;我在编写中碰到了如下情况:
首先写了个含有module的程序:
第一个程序:
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
   module global
   implicit none
   integer JJ,II,KK,MIDM,IIB,time
   common JJ,II,KK,MIDM,IIB,time
   !!!!!!!JJ=====>J(纬度)方向上的格点数
   !!!!!!!II=====>I(经度)方向上的格点数
   !!!!!!!KK=====>Z(高度)方向上的层数
   !!!!!!!IIB====>时次数
   !!!!!!!MIDM===>站点个数
   !!!!!!!time===>资料的时间的长度
   real QP,PARR,CTLS
   common QP,PARR,CTLS
   !!!!!!!QP  ====>用于判断是否有降水的阈值
   real lat_sta,lat_end,lon_sta,lon_end,dx,dy
   common lat_sta,lat_end,lon_sta,lon_end,dx,dy
   !!!!!!!起始经纬度!!!!!!!
   !!!lat_sta ====> 起始纬度!!!
   !!!lat_end ====> 终止纬度!!!
   !!!lon_sta ====> 起始经度!!!
   !!!lon_end ====> 终止经度!!!  
   CHARACTER*18 LOGO
   common LOGO
   !!!!!!!LOGO ===>产品的标志或文件名命名的排头
      contains
   !!!!!!!!!!!!!!!此部分用来从文件中读取变量值!!!!!!!!!!!!!!
   subroutine constant
   implicit none
   !!!!!声明从配置文件中读取变量值的变量!!!!!  
     integer stat,i
     real const
     character*80 itt,cdt
      !!---Part1:从配置文件中读取空间信息和公共变量值---!!
      open(10,file='scheme.txt')
         do while(.true.)
            read(10,'(A80)',iostat=stat)itt
            if(stat/=0)exit
            if(itt(1:7)=="lon_sta")then
               do i=8,80
                    if(itt(i:i)=='=')then
                        read(itt(i+1:80),*)lon_sta
                    endif
               enddo
            elseif(itt(1:7)=="lon_end")then
               do i=8,80
                   if(itt(i:i)=='=')then
                      read(itt(i+1:80),*)lon_end
                   endif
               enddo
            elseif(itt(1:7)=="lat_sta")then
               do i=8,80
                   if(itt(i:i)=='=')then
                      read(itt(i+1:80),*)lat_sta
                   endif
               enddo
            elseif(itt(1:7)=="lat_end")then
               do i=8,80
                   if(itt(i:i)=='=')then
                      read(itt(i+1:80),*)lat_end
                   endif
              enddo
            elseif(itt(1:2)=="DX")then
               do i=3,80
                   if(itt(i:i)=='=')then
                      read(itt(i+1:80),*)dx
                   endif
               enddo
            elseif(itt(1:2)=="DY")then
               do i=3,80
                   if(itt(i:i)=='=')then
                      read(itt(i+1:80),*)dy
                   endif
               enddo
            elseif(itt(1:2)=="KK")then
               do i=3,80
                   if(itt(i:i)=='=')then
                      read(itt(i+1:80),*)KK
                   endif
               enddo
            elseif(itt(1:4)=="LOGO")then
               do i=5,80
                   if(itt(i:i)=='=')then
                       LOGO=TRIM(ADJUSTL(itt(i+1:80)))
                   endif
               enddo
            elseif(itt(1:2)=="QP")then
               do i=3,80
                   if(itt(i:i)=='=')then
                       read(itt(i+1:80),*)QP
                   endif
               enddo
            elseif(itt(1:4)=="PARR")then
               do i=5,80
                   if(itt(i:i)=='=')then
                       read(itt(i+1:80),*)PARR
                   endif
                enddo
            elseif(itt(1:4)=="CTLS")then
               do i=5,80
                   if(itt(i:i)=='=')then
                       read(itt(i+1:80),*)CTLS
                   endif
               enddo
            elseif(itt(1:4)=="MIDM")then
               do i=5,80
                   if(itt(i:i)=='=')then
                       read(itt(i+1:80),*)MIDM
                   endif
               enddo      
            endif
         enddo
      close(10)
         JJ=INT((lat_end-lat_sta)/DY)+1
         II=INT((lon_end-lon_sta)/DX)+1
   return
  end subroutine constant
end module global
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
program main
     xxxxxx
     程序块
     xxxxxx
end
此程序编译执行都没有问题;
然后我想在另一个程序中直接使用此mod块,
第2个程序111.f90:
program main
use global   
implicit none
CALL CONSTANT   
    PRINT*,lat_sta,lat_end,jj,ii,lon_sta,lon_end
    write(*,*)"The common constant is ok!"
end
compile的时候没有问题,但是build的时候出现了链接错误:
--------------------Configuration: 111 - Win32 Debug--------------------
Linking...
111.obj : error LNK2001: unresolved external symbol _GLOBAL_mp_CONSTANT@0
Debug/111.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
111.exe - 2 error(s), 0 warning(s)
这可能是什么问题,请教一下各位。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-7-2 12:40:15 | 显示全部楼层
看不出来问题,,
说一下自己的经验了。
我一般把module写在一个.f90里,
写主程序的时候是另一个.f90,在program之前加上include '路径及module文件名',
这样把module和主程序连在一起。
之后就是
program *****
use ***
***
end program
密码修改失败请联系微信:mofangbao
回复 支持 2 反对 0

使用道具 举报

新浪微博达人勋

发表于 2015-7-2 12:42:36 | 显示全部楼层
哎,才看到时间时2012年
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-4-13 18:24:19 | 显示全部楼层
放到同一个工程文件中呢?module没怎么用过,不过我看到的程序还没有把主程序也包含到module中的,module中封装的都是一个个程序块吧,不知道能不能把main程序放进去
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-4-13 21:59:18 | 显示全部楼层
先编译 然后在左边一栏的workspace中add files to project 把那模块加进去  应该就没问题了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-4-14 10:16:43 | 显示全部楼层
谢谢清风和wlzhongouc ,加到同一个工程目前好像不管用,我再看看是不是别的地方有什么不对。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-7-26 15:28:34 | 显示全部楼层
我也碰到这个问题了,怎么解决的啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-7-2 10:17:36 | 显示全部楼层
MODULE中不能包含program main  那样就可以了
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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