2011-12-07 7 views
0

私はのgfortranコンパイラを使用して、いくつかのFORTRAN 90のコードをコンパイルしています(Ubuntuの/リナロ4.6.1-9ubuntu3)4.6.1割り当て、使用して、私がしようと試みる際にセグメンテーション違反は、エラー

私のコードをコンパイルした後、私はセグメンテーションフォールトエラーを得ていましたプログラムを実行します。 Valgrindを使用した後、私はコードの下のセクションで問題を見つけることができました。わかるように、DEALLOCATEはALLOCATEに先行することなく使用されていました。私はこのソフトウェアを書いた人ではなく、f90を使って正常にコンパイルされましたが、これは書かれた/コンパイルされた元のマシンにアクセスできなくなったことに注意してください。

CONTAINS 

    !! NewSiteType -------------------------------------------------------------------------- 
    --- 
    !! 
    !!- Searches for the index of a particular atom label 
    !! 
    FUNCTION NewSiteType(top,name,mass) 

    IMPLICIT NONE 

    !-------- function parameters ---------------- 

    INTEGER :: NewSiteType 

    TYPE(TTopology), INTENT(INOUT) :: top 
    CHARACTER(*), INTENT(IN) :: name 
    REAL*8,   INTENT(IN) :: mass 

    !-------- local variables -------------------- 

    TYPE(TSiteType), DIMENSION(SIZE(top%siteTypes)+1) :: tmp 
    INTEGER :: i 



    NewSiteType = 0 

    ! check if a site type was already registered 

    DO i = 1,SIZE(top%siteTypes) 
     IF (top%siteTypes(i)%name == name) THEN 
      NewSiteType = i 
      RETURN 
     END IF 
    END DO 

    ! no, enlarge the list by the current one 

! adding in an ALLOCATE to address a segfault problem hopefully 
    ALLOCATE(top%siteTypes(SIZE(tmp))) 

    tmp(1:SIZE(top%siteTypes)) = top%siteTypes 
    DEALLOCATE(top%siteTypes) 
    ALLOCATE(top%siteTypes(SIZE(tmp))) 
    top%siteTypes = tmp 
    top%siteTypes(SIZE(top%siteTypes)) = TSiteType(name,mass) 
    NewSiteType = SIZE(top%siteTypes) 

    END FUNCTION NewSiteType 

私はラインに

ALLOCATE(top%siteTypes(SIZE(tmp))) 

を追加した問題を解決するにはしかし、これは今、この機能が正常に動作していないとSegfaultの問題を修正しました。これは、配列を入力して検索することを意図しており、入力が配列に含まれていない場合は追加します。しかし、今では、最初の配列を追加したので、未登録の入力が配列に追加されていないように見えます。これは、プログラムが登録されていないサイトを使用しようとしたときに生成される特定のエラーがあるためです。これが唯一の変更だから、私は推測しています。私は、ALLOCATEを追加することによって、何かを間違ってやっています。

私は1つのことを言及したいと思います。最初にValgrindを実行してメモリの問題を発見すると、実行可能ファイル全体を実際に実行するように見えますか?それは私には奇妙に思える。

答えて

3

ライン

ALLOCATE(top%siteTypes(SIZE(tmp))) 

    tmp(1:SIZE(top%siteTypes)) = top%siteTypes 

の順序は意味がありません。最初の変数はtop%siteTypesのメモリを予約し、2番目の変数は割り当てのRHSの変数を使用してそのメモリの内容を使用しますが、変数は初期化されていません。あなたが持っている場所にあるallocateステートメントを見つけると、上記で使用されて以来、割り当てられていない変数の問題は解決されません。

問題は、この関数の外にある可能性があります。これは、明らかに%siteTypesが割り当てられて初期化されていることを前提としています。 "inout"の意図は、変数topが入力(および出力)であることを示唆していますが、入力時に割り当てると変数の内容が消去され、効果的に出力されるようになります。あなたが "if(.not。allocated(top%siteTypes)上位...)"によって割り当てられていないことを確認できます。

関連する問題