Я совершенно новичок в Фортране, но мне дали эти файлы (см. Ниже), которые читают входной текстовый файл, используют код Фортрана для вычисления набора значений, а затем записывают их в выходной текстовый файл. Программа работает для всех случаев, кроме случаев 4, 8 и 11, выдавая ошибку:
forrtl: severe (24): end-of-file during read, unit 5, file C:\temp\sharclab\i_capa.txt
Image PC Routine Line Source
Capacity.exe 0046B6EE Unknown Unknown Unknown
Capacity.exe 00468940 Unknown Unknown Unknown
Capacity.exe 00411C9A Unknown Unknown Unknown
Capacity.exe 004118C7 Unknown Unknown Unknown
Capacity.exe 0040C416 Unknown Unknown Unknown
Capacity.exe 0040BBDA Unknown Unknown Unknown
Capacity.exe 0040714C _MAIN__ 16 main.F90
Capacity.exe 0046EB78 Unknown Unknown Unknown
Capacity.exe 004528E0 Unknown Unknown Unknown
kernel32.dll 7C817067 Unknown Unknown Unknown
Я опубликую код ниже, и если кто-нибудь может помочь мне решить эту проблему, я был бы очень признателен, спасибо!
Первый файл (только отдельные части, которые не работают):
Case (4)
DiamRoul = abs(DonneesRlt(1))
DiamPrim = abs(DonneesRlt(2))
NbRoul = abs(int(DonneesRlt(3)))
NbRangRoul = abs(int(DonneesRlt(4)))
LongEff = abs(DonneesRlt(5))
If ((NbRoul==0).OR.(DiamPrim==0)) Then
CodeErr = 1
else ! Calcul si nb corps roulants différent de zéro
Gamma = DiamRoul / DiamPrim
FC = 17.24553 * ((1 + (1.04 * ((1 - Gamma) / (1 + Gamma))
& ** P1) ** P3) ** P4) * (((Gamma ** P2) * (1 - Gamma)
& ** P5) / ((1 + Gamma) ** P11))
ChargeDynSNR = FC * ((NbRangRoul * LongEff) ** P6)
& * (NbRoul ** P7) * (DiamRoul ** P5) * 1.1293
ChargeDynISO = FC * ((NbRangRoul * LongEff) ** P6)
& * (NbRoul ** P7) * (DiamRoul ** P5) * 1.1
ChargeStaSNR = 4.4 * (1 - Gamma) * NbRangRoul * NbRoul
& * LongEff * DiamRoul
ChargeStaISO = ChargeStaSNR
End If
Case (8)
DiamRoul = abs(DonneesRlt(1))
DiamPrim = abs(DonneesRlt(2))
NbRoul = abs(int(DonneesRlt(3)))
LongEff = abs(DonneesRlt(4))
If ((NbRoul==0).OR.(DiamPrim==0)) Then
CodeErr = 1
else ! Calcul si nb corps roulants différent de zéro
Gamma = DiamRoul / DiamPrim
FC = 34.48913 * 0.85 * (Gamma ** P2)
ChargeDynSNR = FC * (LongEff ** P6) * (NbRoul ** P7) *
& (DiamRoul ** P5) * 1
ChargeDynISO = ChargeDynSNR
ChargeStaSNR = 22 * (1 - Gamma) * NbRoul * LongEff
& * DiamRoul
ChargeStaISO = ChargeStaSNR
End If
Case (11)
DiamRoul = abs(DonneesRlt(1))
NbRoul = abs(int(DonneesRlt(2)))
LongEff = abs(DonneesRlt(3))
DiamPrim = abs(DonneesRlt(4))
AngleDeg = 45
AngleMin = 0
AngleSec = 0
NbRoul = abs(int(NbRoul / 2))
NbRangRoul = 2
DiamSpher = 0
If (NbRoul==0) Then
CodeErr = 1
else ! Calcul si nb corps roulants différent de zéro
Alpha = pi * (AngleDeg + (AngleMin / 60) + (AngleSec /
& 3600)) / 180
If (DiamPrim==0) Then
DiamPrim = (DiamSpher - DiamRoul) * DCos(Alpha)
End If
Gamma = (DiamRoul * DCos(Alpha)) / DiamPrim
FC = 17.24553 * ((1 + (1.04 * ((1 - Gamma) / (1 + Gamma))
& ** P1) ** P3) ** P4) * (((Gamma ** P2) * (1 - Gamma)
& ** P5) / ((1 + Gamma) ** P11))
ChargeDynSNR = FC * ((NbRangRoul * LongEff * DCos(Alpha))
& ** P6) * (NbRoul ** P7) * (DiamRoul ** P5) * 1.1
ChargeDynISO = ChargeDynSNR
ChargeStaSNR = 4.4 * (1 - Gamma) * NbRangRoul * NbRoul *
& LongEff * DiamRoul * DCos(Alpha)
ChargeStaISO = ChargeStaSNR
End If
End Select
! Arrondissement de toutes les charges calculées
if (ChargeDynSNR.LE.0) then
ChargeDynSNR = 0
ChargeDynSNRArr = 0
else
Call Arron(TypeRlt, ChargeDynSNR, CapaArr)
ChargeDynSNRArr = CapaArr
end if
if (ChargeDynISO.LE.0) then
ChargeDynISO = 0
ChargeDynISOArr = 0
else
Call Arron(TypeRlt, ChargeDynISO, CapaArr)
ChargeDynISOArr = CapaArr
end if
if (ChargeStaSNR.LE.0) then
ChargeStaSNR = 0
ChargeStaSNRArr = 0
else
Call Arron(TypeRlt, ChargeStaSNR, CapaArr)
ChargeStaSNRArr = CapaArr
end if
if (ChargeStaISO.LE.0) then
ChargeStaISO = 0
ChargeStaISOArr = 0
else
Call Arron(TypeRlt, ChargeStaISO, CapaArr)
ChargeStaISOArr = CapaArr
endif
! Toutes les charges calculées sont multipliées par 10.
Charges(1) = ChargeDynSNR * 10
Charges(2) = ChargeDynISO * 10
Charges(3) = ChargeStaSNR * 10
Charges(4) = ChargeStaISO * 10
ChargesArr(1) = ChargeDynSNRArr * 10
ChargesArr(2) = ChargeDynISOArr * 10
ChargesArr(3) = ChargeStaSNRArr * 10
ChargesArr(4) = ChargeStaISOArr * 10
return
END subroutine
Второй файл (main.F90):
program main
implicit none
integer TypeRlt
! Entrees/Sorties
real*8 DonneesRlt(15)
! Sorties
integer CodeErr
real*8 Charges(4)
integer ChargesArr(4)
open (5, FILE='C:\temp\sharclab\i_capa.txt')
open (6, FILE='C:\temp\sharclab\o_capa.txt')
read(5,*) TypeRlt
read(5,*) DonneesRlt
write(*,*) TypeRlt
write(*,*) DonneesRlt
close(5)
!TypeRlt = 5
call Capacites(TypeRlt,DonneesRlt,Charges,ChargesArr,CodeErr)
write(6,*) ChargesArr(1)
write(6,*) ChargesArr(2)
write(6,*) ChargesArr(3)
write(6,*) ChargesArr(4)
close(6)
write(*,*) ChargesArr(1)
write(*,*) ChargesArr(2)
write(*,*) ChargesArr(3)
write(*,*) ChargesArr(4)
end
Я извиняюсь, если код не был скопирован должным образом. Два текстовых файла - это просто вертикальный список значений, для которых, если нет 15 значений (необходимых для этой программы на Фортране), значение 0 ставится на свое место.
Поскольку эта программа работает правильно для других случаев (о которых я не писал здесь). Я не понимаю, почему он не делает то же самое для этих случаев ..