2011-10-24 5 views
0

저는 Fortran을 완전히 처음 접했지만 입력 텍스트 파일을 읽고 포트란 코드를 사용하여 값 집합을 계산 한 다음이 파일들을 받았습니다 (아래 참조). 출력 텍스트 파일로 변환합니다. 사람이 제가 매우 감사하겠습니다이, 감사합니다 해결하는 데 도움이 될 수 있습니다 나는 다음과 경우의 코드를 게시 할 예정입니다파일 읽기/쓰기 및 Fortran에서 .exe 파일 만들기

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 

:이 프로그램은 오류를 생산, 케이스 4, 8, 11을 제외한 모든 경우에 작동합니다!

첫 번째 파일 (작동하지 않습니다 단지 특정 부분) :

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 

2 개의 텍스트 파일은 15 개의 값이 없으면 (이 포트란 프로그램에 필요) 값의 수직 목록이며 0의 값이 그 자리에 놓입니다.

이 프로그램이 다른 경우에 올바르게 작동하므로 (여기에 게시하지 않았습니다). 나는 왜 이런 경우에 똑같은 행동을하지 않는지 이해할 수 없다 ..

답변

0

다른 값으로 5, 6에서 단위를 변경해보십시오 :

어떻게합니까 i_capa.txt 파일보기 : 보통 장치 (5)는 표준 입력 (참조, 예를 들어 http://docs.cray.com/books/S-3695-35/html-S-3695-35/pdollsmg.html)

편집과 관련된 같이 --- 실제로 두 줄에 두 개의 값이 들어 있습니까?

는 다음과 같은 프로그램을 실행하고 당신이 파일을 읽을 수 있는지 볼 수 있습니다

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 파일의 정확한 내용을 게시하시기 바랍니다 것입니다.

파일이 없거나 DonneesRlt에 실제 값이 15 개 미만이거나 다른 내용이 포함되어있는 것으로 의심됩니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 값을 변경해 보았는데 아무 것도 변경하지 못했습니다. – user2063

+0

내 편집 된 답변보기 –

+0

나는 이것을 알아 냈고 실제로 다른 코드 조각의 문제 인 것입니다. 파이썬에서 그걸로.모든 도움을 주셔서 감사합니다. 그리고 실제로 Fortran을 전혀 사용하지 않기 때문에 실제로 Fortran에 대한 것들을 이해할 수있었습니다! – user2063

1

두 가지 읽기만하고 i_capa.txt 파일을 읽으려고 시도한다. 'end-of-file during read'라는 오류 메시지가 나타나면 i_capa.txt가 프로그램이 예상하는 것보다 짧다는 것을 확신 할 수 있습니다. 그래서 내 첫 번째 추측은 프로그램이 실행될 때 i_capa.txt가 올바르게 설정되지 않았다는 것입니다.

+0

답장을 보내 주셔서 감사합니다.하지만 실제로 이것이 내가 가진 다른 모든 경우에 완벽하게 작동하는 이유를 이해하지 못합니다. – user2063

+0

실제로 i_capa.txt에 무엇이 있는지 확인 했습니까? 즉, 5를 읽기 직전에 중단 점을 놓고 중단 점을 찍을 때 파일을 조사 할 수 있습니까? 오류 메시지가 알려주므로 그 시점에서 파일의 끝에 도달해야합니다. –

+0

계속 진행 : 현재 프로그램의 다른 부분이 파일을 읽은 것으로 보입니다. 5를 읽기 직전에 되감기 5를 넣고 무슨 일이 일어나는가? 또한 : 코드를 실행하기 전에 i_capa.txt를 편집하거나 인쇄하여 실제로 기대되는 것을 확인하십시오. –