Fortran 90 字符数组错误
Fortran 90 Character array error
我必须计算不同日期不同销售间隔的佣金,并形成 table "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。
当运行时,显示错误:Element in REAL(4) array constructor is 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
,要么它应该是其他东西,例如在这种情况下是一个字符串文字。
我必须计算不同日期不同销售间隔的佣金,并形成 table "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。
当运行时,显示错误:Element in REAL(4) array constructor is 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
,要么它应该是其他东西,例如在这种情况下是一个字符串文字。