2015-05-25 42 views
0

我必须计算不同日期的销售时间间隔的佣金,并形成一个表格“日”,“销售”,“佣金”。到目前为止,我已经做到了这一点:Fortran 90字符数组错误

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)。

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

+0

编译器在第2行大量散播。我使用Code :: Blocks 13.12作为编译器。 –

+2

如果这是你的完整代码,那么'implicit none'作为你的第一行会告诉你为什么会出现问题 – francescalus

+3

隐式规则 - > Sunday =单精度实数 - >实数(4)数组 - >星期一=整数 - >错误? – roygvib

回答

2

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

数组初始化:

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

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

(/真实的,整数,实数,真实的,真实/)

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

您可以通过下面的测试案例更清楚地看到这一点:

arcon.f90:1:13: 

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

因此,在数组构造的类型必须:

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

这不相同的错误你编译所有匹配,这就是错误的含义。


要修正这个错误是使用所有实数在数组构造的,但实际的问题是,你正在使用的变量,你应该使用字符串文字。行

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或者说,它应该是别的东西,例如在这种情况下是字符串文字。