Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran:在两个不同程序之间交换数据_Fortran - Fatal编程技术网

Fortran:在两个不同程序之间交换数据

Fortran:在两个不同程序之间交换数据,fortran,Fortran,我需要在两个不同的fortran程序之间交换数据,不幸的是,需要分开(两个不同的.exe),一个用f90编写,另一个用f77编写。 目前这是我的解决方案: -f90(.exe)在f77(主)的开头启动,并使用do while('true')和inquire等待来自f77的数据 -当数据写入某个文件(文件\输入)时,f90将读取、详细说明并将结果写入新文件(文件\输出) -f77使用do while('true')和inquire等待来自f90的数据 -继续 这是f77中程序的示例代码: C

我需要在两个不同的fortran程序之间交换数据,不幸的是,需要分开(两个不同的.exe),一个用f90编写,另一个用f77编写。
目前这是我的解决方案:
-f90(.exe)在f77(主)的开头启动,并使用do while('true')和inquire等待来自f77的数据 -当数据写入某个文件(文件\输入)时,f90将读取、详细说明并将结果写入新文件(文件\输出) -f77使用do while('true')和inquire等待来自f90的数据 -继续 这是f77中程序的示例代码:

   C Write data for f90
   open(210, file=file_in, action='write', status='replace', form='unformatted')
   write(210) data
   close(210)
   do while (.true.)
       inquire(file=KDTree_out, exist=file_exist)
       if (file_exist) then
           call sleepqq(2)
           exit
       endif
   enddo
   open(220, file=KDTree_out, action='read', status='old', form='unformatted')
   read(220) value
   close(220, status='delete')
这是f90中程序的示例代码:

do while(.true.)
    inquire(file=KDTree_in, exist=file_exist)
    if (file_exist) then
          call sleepqq(2)
          ! Read data
          open(100, file=file_in, action='read', status='old', form='unformatted')
          read(100) data
          close(100, status='delete')

          ! Elaborate data

          ! Write data     
          open(150, file=file_out, action='write', status='replace', form='unformatted')
          write(150) value
          close(150)

      endif
enddo
此解决方案似乎工作得很好,但正如您所看到的,有一些sleepqq(2)(微秒)可以避免文件结束错误,但如果您有和ssd或硬盘,此等待时间可能会有所不同,因此不是完美的解决方案。 你有什么想法吗


感谢

感谢agentp,这解决了我的问题:

考虑使用第二个文件作为关闭/刷新数据文件后写入的标志,这将有助于解决一些计时问题

[编辑] 我对用于标记数据文件已就绪的文件有一些问题。我不总是能够删除此文件

这是我的解决方案,数据文件准备好后,我在一个程序上写入:

open(202, file=chk_file2)
close(202)
在另一个程序中,我使用以下代码获取标志并删除文件,因为我需要多次交换数据:

do while (.true.)
   inquire(file=chk_file2, exist=file_exist)
   if (file_exist) then
102   continue
      istat = 1
      do while (istat.eq.0)
         open(401, file=chk_file2, iostat=istat, err=102)
         close(401, status='delete', err=102)
      enddo
      exit
   endif
enddo
或:


谢谢

您的“F77”程序不是F77,但它(显示的片段)是F90。这不是您需要单独程序的唯一原因?F77程序是商业软件的用户子程序。而我需要F90的。所以他们需要分开。我对你的问题没有什么要直接说的,我也不知道你案件的全部细节。然而,如果这是我的项目,我会想办法做到这一点,而不需要多个程序与临时文件共享数据。“F77”和“F90”之间的区别通常是不需要的:如果您同时编译两个代码块,那么就编译器而言,它们都是Fortran。也就是说,绝大多数F77代码没有理由不能在使用F90的程序中共存。[需要注意]好的,我不能合并F77和“我的”F90代码,因为正如我所说的“F77程序是商业软件的用户子程序”。所以我可以写一个用户子程序来做我想做的事情,但在F77中,但要做我想做的事情,我需要的是在F90中。这两个程序不是同时编译的。主机启动一个exe文件,该文件可以从python/fortran/生成。。。我希望能说得够清楚。我的意见只是说有点要考虑。如果你有,这是不合适的。那就够了。
do while (.true.)
   inquire(file=chk_file2, exist=file_exist)
   if (file_exist) then
102   continue
      do while (.true.)
          open(400, file=chk_file2, iostat=istat, err=102)
          if (istat.eq.0) then
              close(400, status='delete', err=102)
              exit
          endif
      enddo
      exit
   endif
enddo