2015-05-25 60 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或者說,它應該是別的東西,例如在這種情況下是字符串文字。