如何使用以下代码使用 "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) 和其他控制二进制文件其他模式的说明符。这里不是展示它们的地方,它们在各种手册、教程和教科书中都有解释。
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) 和其他控制二进制文件其他模式的说明符。这里不是展示它们的地方,它们在各种手册、教程和教科书中都有解释。