Fortran 90字符数组错误

时间:2015-05-25 15:45:18

标签: arrays fortran fortran90 gfortran

我必须计算不同日期的不同销售间隔的佣金,并形成表“日”,“销售”,“佣金”。到目前为止,我已经做到了这一点:

real::a(5),b(5)
character(10)::c(5)=(/Sunday,Monday,Tuesday,Wednesday,Thursday/)

open(1,file='in_1.txt')
open(2,file='out_1.txt')

read(1,*)(a(i),i=1,5)

do i=1,5
    if(0.<a(i).and.a(i)<99.)then
        b(i)=a(i)*.02
    elseif(100.<a(i).and.a(i)<299.)then
        b(i)=a(i)*.05
    elseif(300.<a(i).and.a(i)<499.)then
        b(i)=a(i)*.075
    else
        b(i)=500.*.1+(a(i)-500.)*.125
    endif
enddo

write(2,*)'   Day   ','   Sales   ','   Commissions   '

do i=1,5
    write(2,10)c(i),a(i),b(i)
    10 format(a10,t15,f4.1,t25,f8.2)
enddo

total=0.
do i=1,5
   total=total+b(i)
enddo

write(2,20)total
20 format('Total Commissions',t25,f8.2)

end

从星期日到星期四的销售都在输入文件in_1.txt。

运行时,它显示错误:REAL(4)数组构造函数中的元素是INTEGER(4)。

它是什么意思以及如何解决它?

1 个答案:

答案 0 :(得分:2)

您正在使用隐式输入来掩盖您的基本错误。隐式类型根据变量名的第一个字符指定类型。

数组初始值设定项:

(/Sunday,Monday,Tuesday,Wednesday,Thursday/)

将这些未声明变量的类型解析为

(/ real,integer,real,real,real /)

并发出错误,因为你的实数数组中有一个整数。

下面的测试用例可以更清楚地看到这一点:

print *,(/1., 2, 3., 4., 5./)
end

这不会编译与您的错误相同:

arcon.f90:1:13:

 print *,(/1., 2, 3., 4., 5./)
             1
Error: Element in REAL(4) array constructor at (1) is INTEGER(4)

因此,数组构造函数中的类型必须全部匹配,这就是错误的含义。

修复该错误将是在数组构造函数中使用所有实数,但实际问题是您使用的是应该使用字符串文字的变量。改变行

character(10)::c(5)=(/Sunday,Monday,Tuesday,Wednesday,Thursday/)

character(10)::c(5)=(/"Sunday","Monday","Tuesday","Wednesday","Thursday"/)

但您会发现新错误:

 print *,(/"Sunday","Monday","Tuesday","Wednesday","Thursday"/)
                            1
Error: Different CHARACTER lengths (6/7) in array constructor at (1)

并解决您想要将初始化更改为

的问题
character(10)::c(5)=(/"Sunday   ","Monday   ","Tuesday  ","Wednesday","Thursday "/)

您应始终在代码中使用implicit none,以避免掩盖您的真实错误。没有隐式类型的原始数组构造函数会发出错误

Error: Symbol ‘monday’ at (1) has no IMPLICIT type

告诉您,您要么忘记声明变量monday,要么忘记它应该是其他内容,例如:在这种情况下的字符串文字。