簡體   English   中英

Fortran 90字符數組錯誤

[英]Fortran 90 Character array error

我必須計算不同日期不同銷售間隔的佣金,並形成一個表格“ Day”,“ Sales”,“ Commissions”。 到目前為止,我已經做到了:

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

這是什么意思,以及如何解決?

您正在使用隱式輸入,這掩蓋了您的基本錯誤。 隱式鍵入根據變量名的第一個字符分配類型。

數組初始化器:

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

將這些未聲明變量的類型解析為

(/實數,整數,實數,實數,實數/)

並發出錯誤,因為您的實數數組中有一個整數。

您可以通過下面的測試案例更清楚地看到這一點:

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要么就應該聲明其他變量,例如,在這種情況下為字符串文字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM