2014-01-21 13 views
5

私は、MAC-ポート(OS-X)からのgfortran 4.7を使用して、次の簡単なコードをコンパイルしようとしています:のgfortranと乱数

program main 

implicit none 

integer :: n = 1, clock, i 

integer, dimension(1) :: iseed 

! initialize the random number generator 
call random_seed(size = n) 

call system_clock(COUNT=clock) 

iseed = clock + 37 * (/ (i - 1, i = 1, n) /) 
! iseed = clock 
! iseed = abs(mod((clock*181)*((1-83)*359), 104729)) 
call random_seed(PUT = iseed) 

end program main 

と、このエラーを持っている:

gfortran-mp-4.7 tmp.f90 
tmp.f90:17.23: 

call random_seed(PUT = iseed) 
        1 
Error: Size of 'put' argument of 'random_seed' intrinsic at (1) too small (1/12) 

IドンFortranを全く使わない(私はC++の人です)ので、誰かが助けて作業できるかどうか本当に感謝しています。

p.s.同様の問題で、私はいくつかのフォーラム投稿を見つけましたが、現在の非コメント解決策はthis GCC bug reportに記載されているものと似ています。私はとにかく、並列に実行されませんので、

absと1がin this stack overflow post言及されているが(PIDせずにこれを追加しました

UPDATE:。

次作品:

program main 

implicit none 

integer :: n = 12, clock, i 

integer, dimension(:), allocatable :: iseed 

! initialize the random number generator 
allocate(iseed(n)) 
call random_seed(size = n) 

call system_clock(COUNT=clock) 

iseed = clock + 37 * [(i, i = 0,n-1)] 
call random_seed(PUT = iseed) 

end program main 
+0

あなたがリンクしているGCCバグレポートには解決策があります: 'n = 12'と' integer、dimension(12):: iseed'を設定する必要があります。 'random_seed'の' put'引数には12個の整数の配列が必要です。 – Yossarian

答えて

8

をやや増幅するために@ Yossarianのコメントには、この

call random_seed(size = n) 

は、nで、RNGを初期化する場合に使用する必要があるランク1の整数配列のサイズを返します。 nの値を取得した後、それを割り当て、その後、

integer, dimension(:), allocatable :: iseed 

:私はにその宣言を変更することにより、iseedが割り当てすることをお勧めしたい

allocate(iseed(n)) 

putその後、お好みの値でそれを、それを取り込みます。

あなたは次のように割り当て、1つのステートメントで、それを移入することができるかもしれない:これはあなたのコンパイラがある最新の状態にどのように依存するため

allocate(iseed(n), source = clock + 37 * [(i, i = 0,n-1)]) 

は私がかもしれないを書きます。

EDITは、OPのコメント

ありませんした後、あなたは非常に私が提案し何を理解していません。

(ソース割当を使用して)1つのステートメントで又はallocateいずれか、配列を割り当て、それを移入そしてn

12とを初期化していない

call random_seed(size = n) 

を実行することにより、nの値を取得します文の後に代入が続きます。

allocate(iseed(n)) 
call random_seed(size = n) 

は、一連の操作が正しくありません。これにより、iseedに12個の要素(最初のステートメントが実行されたときのnの値)が設定され、nがRNGに必要な配列のサイズに設定されます。それが12であれば問題は見られませんが、別のコンパイラ、おそらく同じコンパイラの別のバージョンにコードを移植すると、別のサイズの整数配列を必要とするRNGにぶつかる危険性があります。コードに値を固定する必要はありません。そうしないでください。

+0

ご返信ありがとうございます。私は更新コードを入れました、それはあなたが意味するものですか?私は更新のためにうまくコンパイルします – Denis

+0

ありがとうございます。理解しています。 – Denis

関連する問題