私はの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を実行してメモリの問題を発見すると、実行可能ファイル全体を実際に実行するように見えますか?それは私には奇妙に思える。