2014-01-21 19 views
5

Я пытаюсь скомпилировать следующий простой код, используя Gfortran 4.7 из УДС-портов (OS-X):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) 

Я не «Я использую Fortran вообще (я парень C++), поэтому было бы очень полезно, если кто-то сможет помочь и заставить его работать.

p.s. По аналогичной проблеме я нашел пару сообщений на форуме, текущее решение о несогласии аналогично решению, упомянутому в this GCC bug report.

Один с abs упоминается 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'. Аргумент 'put' для' random_seed' требует массив из 12 целых чисел. – Yossarian

ответ

8

Чтобы несколько усиливающих на комментарий @ Yossarian, этот

call random_seed(size = n) 

возвращает в n размер целочисленного массива ранга 1, который вы должны использовать, если вы хотите инициализировать RNG. Я бы предложил сделать iseed изменив быть выделена его декларации:

integer, dimension(:), allocatable :: iseed 

затем, после получения значения для n, выделить его:

allocate(iseed(n)) 

заполнить его с вашими любимыми значениями, то put его.

Вы могли бы выделить и заполнить его в одном заявлении, как это:

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

Я пишу мог бы, потому что это зависит от того, до настоящего времени, ваш компилятор.

EDIT, после того, как ОП комментарий

Нет, вы не совсем поняли, что я предложил.

Получить значение n, выполнив

call random_seed(size = n) 

не инициализирует n до 12.

Затем выделить массив и заполнить его, либо в отчете (с использованием источников выделения) или allocate с последующим заданием.

В

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

последовательность операций является неверным.Это устанавливает iseed, чтобы иметь 12 элементов (что является значением n, когда выполняется первый оператор), а затем устанавливает n размеру массива, требуемого RNG. Пока это 12, вы не увидите никаких проблем, но как только вы портируете свой код на другой компилятор, возможно даже на другую версию того же самого компилятора, вы рискуете запуском в RNG, который требует целочисленного массива разного размера , Нет необходимости вносить в ваш код значение, поэтому нет.

+0

Спасибо за ваш ответ. Я поставил код обновления, это то, что вы имели в виду? Я компилирую штраф – Denis

+0

спасибо за обновление. Понял. – Denis

Смежные вопросы