fortran读取txt格式二维数据年份、sst报错
刚学文件读取,运用module和function、sunbroutine输入读取得到的年份、温度数据来计算温度拟合结果写入新文件。新文件还是空白,debug显示应该是读文件出了问题,有没有人知道该怎修改?谢谢!以下源代码
program main
use library
implicit none
real::a,b!要声明subroutine
real::T(69,2)
character*30::ans
real,allocatable::y_nihe(:)
integer::i,error
n=69.0
!读SST文件
open(unit=10,file="Global_SST.txt")
do i=1,n
read(10,*) T(i,1:2)
x(i)=T(i,1)
y(i)=T(i,2)
print*,'x=',x(i),'y=',y(i)
end do
close(10)
call nihe(x,y,n,a,b,ans,y_nihe)!不能忘记
!建拟合后数值文件
open(unit=11,file="Global_SST_nihe.txt")
do i=1,n
write(11,*) x(i),y(i),y_nihe
end do
close(11)
end
module library
!real,allocatable,save::x(:),y(:)
real*8,allocatable,save::y(:)
integer,allocatable,save::x(:)
real,save::n!数据数
contains
!计算测试数据x(i)的平均值
real function average_x(x,n)
implicit none
real::sum1!输入参数
integer,allocatable::x(:)!要加(:)否则sub里调用会报错6637
integer::i
real::n
sum1=0.0
do i=1,n
sum1=sum1+x(i)
end do
average_x=sum1/n
return
end
!计算测试数据y(i)的平均值
real function average_y(y,n)
implicit none
real::sum2!输入参数
real*8,allocatable::y(:)!要加(:)否则sub里调用会报错6637
integer::i
real::n
sum2=0.0
do i=1,n
sum2=sum2+y(i)
end do
average_y=sum2/n
return
end
subroutine nihe(x,y,n,a,b,ans,y_nihe)
implicit none
real::a,b,ave_x,ave_y,suma,sumb,sumc,sumd,sume
real*8,allocatable,intent(in)::y(:)
integer,allocatable,intent(in)::x(:)
real,allocatable::y_nihe(:)
character*30,optional::ans
character*10::ac,bc
integer::i
real::n
ave_x=average_x(x,n)!测试数据平均值
ave_y=average_y(y,n)
!求b的公式计算
suma=0.0
do i=1,n
suma=suma+x(i)*y(i)
end do
sumb=0.0
do i=1,n
sumb=sumb+y(i)
end do
sumc=0.0
do i=1,n
sumc=sumc+x(i)
end do
sumd=0.0
do i=1,n
sumd=sumd+x(i)**2
end do
sume=sumc**2
!b的公式计算
b=(n*suma-sumb*sumc)/(n*sumd-sume)
!求a的公式计算
a=ave_y-b*ave_x
!曲线公式输出
write(ac,'(f5.3)')a!数字转字符串
write(bc,'(f5.3)')b
ans="y="//trim(ac)//"+"//trim(bc)//"*x"!要去空格,不然看不到ac后面的
!拟合y的计算
do i=1,n
y_nihe(i)=a+b*x(i)
end do
return
end subroutine
end module library
tet文件内容
1950 20.0961049397786
1951 20.1714002291362
1952 20.2491049766541
1953 20.2443106969198
1954 20.0819886525472
1955 20.0484790802002
1956 20.0665067036947
1957 20.2732753753662
1958 20.3031202952067
1959 20.2691286404928
1960 20.2360420227051
1961 20.2409720420837
1962 20.2072224617004
1963 20.2495829264323
1964 20.0672515233358
1965 20.1047460238139
1966 20.1955901781718
1967 20.1673062642415
1968 20.1893989245097
1969 20.3663450876872
1970 20.2267944018046
1971 20.0539709726969
1972 20.2768607139587
1973 20.2799997329712
1974 20.1227018038432
1975 20.0821773211161
1976 20.1148374875387
1977 20.2787280082703
1978 20.2211915651957
1979 20.3278311093648
1980 20.3143162727356
1981 20.2863869667053
1982 20.2568984031677
1983 20.3954254786174
1984 20.2790896097819
1985 20.2281266848246
1986 20.2801698048910
1987 20.4560572306315
1988 20.3847807248433
1989 20.3487602869670
1990 20.4344404538472
1991 20.3976322809855
1992 20.3218612670898
1993 20.3612923622131
1994 20.3886327743530
1995 20.4801934560140
1996 20.4360527992249
1997 20.5726725260417
1998 20.6212105751038
1999 20.3976710637410
2000 20.3863169352214
2001 20.4906733830770
2002 20.5209345817566
2003 20.5484811464946
2004 20.5385220845540
2005 20.5299703280131
2006 20.5224957466126
2007 20.4423691431681
2008 20.4357821146647
2009 20.5469978650411
2010 20.5540506045024
2011 20.4356409708659
2012 20.4943110148112
2013 20.5247028668722
2014 20.6103471120199
2015 20.7225526173910
2016 20.7179576555888
2017 20.6371006965637
2018 20.6169347763062 可分配数组要先分配,然后才能使用 你的 x,y,y_nihe数组没分配就使用了 Transpose 发表于 2023-12-29 19:36
可分配数组要先分配,然后才能使用 你的 x,y,y_nihe数组没分配就使用了
你好,请问是哪里分配?我在module里声明了,在主程序call subroutine不行吗?之前直接在主程序录入测试数据不读取txt进行测试也是这样的步骤没有问题 do i=1,n
read(10,*) T(i,1:2)
x(i)=T(i,1)
y(i)=T(i,2)
print*,'x=',x(i),'y=',y(i)
end do
把T(i,1)赋值给x(i)之前,要保证x数组是已经分配的,不然是错的 Transpose 发表于 2023-12-29 19:55
do i=1,n
read(10,*) T(i,1:2)
x(i)=T(i,1)
谢谢谢谢!我在主程序给x,y,y_nihe分配大小后能执行并且在新文件中有序写入了!
页:
[1]