fortran代码用于比较两组变量

问题描述 投票:0回答:1

我正在尝试获取一行数据,其中字符位置21:28是x值,字符位置29:36是y值。我想将这两组数字放在两个变量中并进行比较。然后,如果x <= y我不想将其写入新文件,则将其写入新文件。

下面是我的代码,但是很难学习fortran,因此缺少某些部分。

program open
implicit none




call getarg(1,"block2.gro")
open(12,file="output.gro",status ='new')

Line =0
x = (21:28) !from input file to be x variable
y= (29:36)  !from input file to be y variable
row =       !unsure if I need a variable to contain the row
Line=line +1
    if (line .ne. 2) then
        if x < y
        write(12,*) row 
        line = line+1
        else 
        line=line +1
    end if

end program open

任何学习fortran的帮助或有用的地方,将不胜感激!

fortran row
1个回答
2
投票

[在学习新语言时,您需要慢慢开始。我感觉到您正在尝试一次做太多事情。

这里只是一些不起作用的东西:

  1. 您正在使用implicit none,这应该很好。但是您没有声明任何变量。您使用了几个变量(linexyrow),但是从不告诉编译器它们是什么类型。

  2. getarg是一个子程序,它returns命令行参数的内容。这意味着您需要传递character(len=<something>)变量作为第二个参数,而不是常量。这将失败。

  3. 您永远不会真正打开输入文件或从中读取文件。

  4. x = (21:28)的语法无效,但是我想你知道。

  5. 我认为应该在某处有一个循环,但没有。

顺便说一句,您甚至没有告诉我们xy是整数还是浮点值。

Fortran从文本文件中读取数字时实际上非常灵活。如果x和y是文本文件中唯一的数字,则只需执行read(<unit>, *) x, y

program read_block
    implicit none
    real :: x, y
    integer :: ios

    open(unit=101, file='block2.gro', action='read', status='old')
    do
        read(101, *, iostat=ios) x, y
        if (ios /= 0) exit
        print *, x, y
    end do
    close(101)
end program read_block

如果其中还有其他字符,则可能必须使用显式格式:

read(101, '(20X, 2F8.3)', iostat=ios) x, y

或者,如果仍然想要整行,则可以读取整行,然后从中提取xy的值:

real :: x, y
character(len=100) :: row     ! make sure that the length is sufficient to hold entire line
integer :: ios

...

read(101, '(A)', iostat=ios) row
if (ios /= 0) exit
read(row(21:28), *) x
read(row(29:36), *) y
...

我建议您尝试运行此代码,查看其作用,然后使用您的Google技能继续进行操作,并了解每行的作用以及执行的原因。

© www.soinside.com 2019 - 2024. All rights reserved.