如何使用以下代码使用 "iswap" 子程序输出 "data1.dat" 文件?

How to output "data1.dat" file using "iswap" subroutine using the following code?

 subroutine iswap (file, b)
  integer  b
  open(1,file = "file",status='unknown',form="unformatted")
  write (1) b
  close(1)
  end

  program callex                                                                                                                                                                         
  open(22, file = 'data1.dat')
  call iswap(file,2)
  close(22)
  stop                                                                                                                                                                                   
  end

输出:空dat1.dat文件

我对 Fortran 完全陌生。我正在尝试使用“iswap”子例程编写生成包含 b 值(即 2)的输出文件“dat1.dat”的代码,但我得到的是一个空文件。你能告诉我我在代码中犯的错误吗?

提前致谢。

open(1,file = "file",status='unknown',form="unformatted")

您正在打开(创建 if 不退出)创建一个名为“file”的文件

并由

write (1) b

您将 b 的值写入此文件。

文件“data1.dat”在单元 22 下打开,因此如果要写入此文件,则必须写入该单元。

write (22) b

没有理由在您的子程序中打开和关闭另一个名为“file”的文件。

使用 implicit none. 也很重要,否则你会惊讶于在 call iswap(file,2).

您可以将单元号传递给您的子程序

  subroutine iswap (unit, b)
  implicit none
  integer  unit, b
  
  write (unit) b

  end

  program callex    
  implicit none                                                                                                                                                                     
  open(22, file = 'data1.dat')
  call iswap(22,2)
  close(22)
                                                                                                                                                                                    
  end

end之前的stop语句是没有道理的。它是无用的,可能会引入一些令人惊讶的消息,例如信号 FPE 异常。

最后,您应该尽快学会如何将您的子程序放入模块中。我强烈建议尽可能避免使用外部子程序。还使用一些一致的缩进(行首的空格),以便结构更清晰可见。


module subs
  implicit none

contains

  subroutine iswap (unit, b)
    integer, intent(in) ::  unit, b
    write(unit) b
  end subroutine
end module

program callex   
  use subs
 
  implicit none
                                                                                                                                                               
  open(22, file = 'data1.dat')
  call iswap(22, 2)
  close(22)                                                                                                                                                                       
end program

status="unknown"也挺没用的。如果要指定状态,请选择特定的内容 "old""new""replace",否则就将其省略。 open 语句中还有许多其他说明符值得学习,例如 action (read/write) 和其他控制二进制文件其他模式的说明符。这里不是展示它们的地方,它们在各种手册、教程和教科书中都有解释。