Чтение / запись файла, а затем создание файла .exe в Fortran - PullRequest
0 голосов
/ 24 октября 2011

Я совершенно новичок в Фортране, но мне дали эти файлы (см. Ниже), которые читают входной текстовый файл, используют код Фортрана для вычисления набора значений, а затем записывают их в выходной текстовый файл. Программа работает для всех случаев, кроме случаев 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 ставится на свое место.

Поскольку эта программа работает правильно для других случаев (о которых я не писал здесь). Я не понимаю, почему он не делает то же самое для этих случаев ..

Ответы [ 2 ]

1 голос
/ 24 октября 2011

Есть только два вызова для чтения, и оба пытаются прочитать файл i_capa.txt.Когда вы видите сообщение об ошибке: «конец файла во время чтения», вы можете быть уверены, что i_capa.txt короче, чем ожидает программа.Итак, мое первое предположение заключается в том, что i_capa.txt не был правильно настроен, когда ваша программа начала выполнение.

0 голосов
/ 24 октября 2011

Попробуйте изменить единицы измерения с 5 и 6 на некоторые другие значения: обычно единица 5 связана со стандартным входом (см., Например, http://docs.cray.com/books/S-3695-35/html-S-3695-35/pdollsmg.html)

РЕДАКТИРОВАТЬ:

Как работает i_capa.txt файл выглядит так: --- действительно ли он содержит два значения в две строки?

Можете ли вы запустить следующую программу и посмотреть, можете ли вы прочитать файл в:

implicit  none

integer TypeRlt
real*8 DonneesRlt(15)

open (5, FILE='C:\temp\sharclab\i_capa.txt')

read(1,*) TypeRlt
read(1,*) DonneesRlt

print*, TypeRlt
print*, DonneesRlt

Еслиэто терпит неудачу, не могли бы вы опубликовать точное содержимое вашего i_capa.txt файла.

Я подозреваю, что у вас либо нет файла, либо он содержит менее 15 реальных значений для DonneesRlt, либо он содержит что-тоостальное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...