我需要在两个不同的fortran程序之间交换数据,不幸的是需要分开(两个不同的.exe),一个用f90编写,另一个用f77编写。
目前这是我的解决方案:
- f90(.exe)在f77(master)的开头启动,并使用do while('true')等待来自f77的数据并查询
- 当数据写入某个文件(file_in)时,f90读取,详细说明并将结果写入新文件(file_out)
- f77使用do while('true')等待来自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或硬盘,这个等待时间可能会有所不同不是完美的解决方案。 你有什么想法吗?
由于
答案 0 :(得分:0)
感谢agentp,这解决了我的问题:
考虑使用第二个文件作为在关闭/刷新数据文件后写入的标志,这应该有助于解决一些时序问题
[编辑] 我有一些问题,我用来标记数据文件已准备好。我并不总是能删除这个文件。
这是我的解决方案,在数据文件准备就绪后,我在一个程序上写道:
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
在另一个程序中,我有这个代码来获取标志并删除文件,因为我需要多次交换数据:
- (void)viewDidLoad {
[super viewDidLoad];
self.imageName = @"goldencoaster";
[self.view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"table"]]];
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%@", self.imageName]];
CGRect screen = [[UIScreen mainScreen] bounds];
CGRect bounds = CGRectMake(screen.origin.x+10,
screen.origin.y+10,
screen.size.width-20,
screen.size.height-20);
self.coasterImage.center = self.coasterImage.superview.center;
self.coasterImage.frame = bounds;
self.coasterImage.image = image;
}
或者:
{{1}}
由于