segmentation-fault
  • fortran
  • 2016-04-01 1 views 1 likes 
    1

    :私は最初にこのコードを実行すると「セグメンテーション違反」のオープン既存のファイルIのように簡単なコードを実行している

    program summation 
    implicit none 
    integer :: sum, a, b 
    
    print*, "This program performs summations. Enter 0 to stop." 
    
    !open(unit=10, file="SumData.DAT", status='replace', action='write',iostat=b, err=100) 
    !100 continue 
    !write(*,*) b 
    
    open(unit=10, file="SumData.DAT", status='replace', action='write') 
    
    sum = 0 
    
    do 
    print*, "Add:" 
    read*, a 
    if (a == 0) then 
        exit 
    else 
        sum = sum + a 
    end if 
        write(10,*) a 
    end do 
    
    print*, "Summation =", sum 
    write(10,*) "Summation =", sum 
    close(10) 
    
    end 
    

    は、それはOKだったし、それがSumData.datファイルを生成しました。しかし、私は再びそれを実行すると、それはopenコマンドで停止し、次のエラーが表示されます:私はSumData.datファイルを削除して、もう一度それを実行した場合

    Program received signal SIGSEGV: Segmentation fault - invalid memory reference. 
    
    Backtrace for this error: 
    #0 ffffffffffffffff 
    #1 ffffffffffffffff 
    #2 ffffffffffffffff 
    #3 ffffffffffffffff 
    #4 ffffffffffffffff 
    #5 ffffffffffffffff 
    #6 ffffffffffffffff 
    #7 ffffffffffffffff 
    #8 ffffffffffffffff 
    #9 ffffffffffffffff 
    #10 ffffffffffffffff 
    #11 ffffffffffffffff 
    #12 ffffffffffffffff 
    #13 ffffffffffffffff 
    #14 ffffffffffffffff 
    #15 ffffffffffffffff 
    #16 ffffffffffffffff 
    #17 ffffffffffffffff 
    #18 ffffffffffffffff 
    

    、それはOKでした。誰もがなぜプログラムが既存のファイルを開くことができないのか知っていますか?

    +0

    問題が特定のバージョンのFortran標準に固有でない限り、汎用[タグ:fortran]タグを使用してください。あなたは確かにFortranの25年前のバージョンに自分自身を制限したくないです。 –

    +0

    データファイルはどのように見えますか? –

    +0

    こんにちはウラジミール、データファイルがない場合、プログラムは1つを作成し、集計結果は次のように書かれます:合計= 2 – elpdotaer

    答えて

    1

    あなたがファイルをどうしようとしている正確に何を指定することは常に良い考えです:あなたはあなたが必要な場合は、それを置き換える、書き込み用にファイルをオープンしようとしていることを指定し、これにより

    open(unit=10, file="SumData.DAT", status='replace', action='write') 
    

    statusを指定しないと、コンパイラは最適と思われるものを自由に実行できます。これにより、エラーが発生する可能性があります。 action specifierについても同様です。

    操作の戻り値を確認するには、iostat=<some integer var>を使用する必要があります。それで、あなたが経験するように醜いランタイムエラーを避けることができます。

    +0

    こんにちはアレキサンダー、あなたの答えのために多くのありがとう。そして私のプロフェッショナルでないコードフォーマットには申し訳ありません。 私はあなたの提案を試みましたが、それでも同じエラーが表示されます。 次に、IOSTATとERRを次のように使用しようとしました。 open(ユニット= 10、ファイル= "SumData.DAT"、ステータス= '置き換え'、アクション= '書き込み'、iostat = b、エラー= 100) 100 continue write(*、*)b プログラムはまだopenコマンドで停止しました。もう少し提案をお願いしますか?ありがとう。 – elpdotaer

    0

    Code :: Blocks 17.12に同梱されているgfortranバージョン5.1.0を使用しようとしたときに、同じ問題が発生しました。 this github issueによると、バージョンに問題があるようです。

    [...] whatever the issue was it's fixed with GCC 5.2.

    コードはmain.f90で、再作成します

    program main 
        IMPLICIT NONE 
        OPEN(10, FILE='tmp.dat', STATUS='OLD', ACTION='WRITE') 
        CLOSE(10) 
    end program main 
    

    gfortran -Wall -o a.out main.f90 
    

    してコンパイルし、実行している

    touch tmp.dat && ./a.out 
    

    戻り

    Program received signal SIGSEGV: Segmentation fault - invalid memory reference. 
    
    Backtrace for this error: 
    #0 ffffffff 
    
    関連する問題