我无法将文件中的数据读入数组,我是编程新手 和fortran所以任何信息都将是一种祝福。
这是程序正在读取的txt文件的示例
!60
!USS Challenger 1.51 12712.2 1.040986E+11
!USS Cortez 9.14 97822.5 2.009091E+09
!USS Dauntless 5.76 27984.0 2.599167E+09
!USS Enterprise 2.48 9136.3 1.478474E+10
!USS Excalibur 3.83 32253.0 1.286400E+10
总共有60艘船。变量用空格分隔
如下
翘曲因子,光年距离,实际速度。
这是我使用的当前代码,它给出了错误模块或主要 程序阵列' m'在(1)必须具有恒定的形状
PROGRAM engine_performance
IMPLICIT NONE
INTEGER :: i ! loop index
REAL,PARAMETER :: c = 2.997925*10**8 ! light years (m/s)
REAL,PARAMETER :: n = 60 ! number of flights
REAL :: warpFactor ! warp factor
REAL :: distanceLy ! distance in light years
REAL :: actualTT ! actual time travel
REAL :: velocity ! velocity in m/s
REAL :: TheoTimeT ! theoretical time travel
REAL :: average ! average of engine performance
REAL :: median ! median of engine performance
INTEGER, DIMENSION (3,n), ALLOCATABLE :: M
OPEN(UNIT=10, FILE="TrekTimes.txt")
DO i = 1,n
READ(*,100) warpFactor, distanceLY, actualTT
100 FORMAT(T19,F4.2,1X,F7.1,&
1X,ES 12.6)
WRITE(*,*) M
END DO
CLOSE (10)
END PROGRAM engine_performance
答案 0 :(得分:0)
我第一次阅读你的代码时,我错误地将M
读作一个数组,在这个数组中你的程序将存储船只文件中的数字。仔细观察后,我意识到(a)M
是一个整数数组,(b)代码后面的read语句读取输入文件的每一行,但不会将warpFactor, distanceLY, actualTT
存储在任何地方。 / p>
猜测M
应该是与每艘船相关的数字因子的表示,这里是如何修复你的代码。如果猜测范围广泛,请说明您要做的事情以及代码中存在的任何问题。
首先,修复M
REAL, DIMENSION (:,:), ALLOCATABLE :: M
术语(3,n)
不能用于可分配数组的声明。因为先前声明n
是一个实常数,所以它不能作为数组范围的规范。如果它可能是数组的声明将其维度固定在(3,60)
,这意味着该数组不能被分配。
因此,也要将n
的声明更改为
INTEGER :: n
它不再是一个参数,你将从文件的第一行读取它的值,这就是为什么它首先出现在文件中。
其次,我认为您的数组中已切换行和列。该文件有60行(船只),每行有3列数字数据。因此,当需要分配M
时,请使用语句
ALLOCATE(M(n,3))
当然,在此之前,您必须从文件的第一行读取n
,但这不应该是一个严重的问题。
第三,将值读入数组。变化
READ(*,100) warpFactor, distanceLY, actualTT
到
READ(*,100) M(i,:)
将读取整行i
。
最后,在文件的每一行上引导!
的那些 - 摆脱它们(使用编辑器或重新创建没有它们的文件)。它们阻止了易读的价值观。使用!
当前阅读n
需要格式规范,如果没有它,则只需read(10,*)
。
哦,绝对最后:你应该在你有这个程序工作之后,将你的注意力转移到你最喜欢的Fortran教程中定义类型的主题,并学习如何声明{ {1}}增加了表现力和编程的便利性。