2011-10-24 5 views
0

私はFortranを全く新しくしていますが、入力テキストファイルを読み込み、Fortranコードを使って値の集合を計算し、それらを出力テキストファイルに変換します。プログラムがエラーを生成する、ケース4、8、11以外のすべてのケースのために働く:ファイルを読み書きして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 

私は以下のコードを掲載しますし、誰も私は、私は非常に多く、それを感謝ありがとうなり、これを解決するのに役立つことができれば!

まずファイル(機能しないだけで、特定の部品):

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つのテキストファイルは、値が存在しない場合(このFortranプログラムでは必須)、値の0の値が置かれる単純な値のリストです。

このプログラムは、別のケース(ここには掲載していません)で正しく機能します。私はこれらのケースで同じことをしない理由を理解していません。

答えて

0

いくつかの他の値に5および6からの単位を変更してみてください:

どのようにi_capa.txtファイルの外観:通常ユニット5は、標準入力(例えばhttp://docs.cray.com/books/S-3695-35/html-S-3695-35/pdollsmg.html

EDITと関連しています〜のように実際には2つの値を2つの行に保持しますか?

では、次のプログラムを実行し、あなたがファイルを読むことができるかどうかを確認できます。これに失敗した場合

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

私はそれを把握することができたし、実際には、それをPythonで実行します。皆さんのお手伝いをいただきありがとうございます。実際にFortranを使っていないので、Fortranのことを理解するのに役立ちました! – user2063

1

読み込みの呼び出しは2つしかなく、両方とも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を編集するか、単に印刷することはできますか? –

関連する問題