Передача массива Fortran 90 по ссылке - PullRequest
3 голосов
/ 13 февраля 2012

Что произойдет, если я выделю указатель F90 следующим образом:

real, pointer :: abc(:)

allocate abc (nx*ny*nz)

Я передаю abc подпрограмме, где я переопределяю ее как

real arg1(nx,ny,xz)

Кажется, это работает нормально.

Но если я переопределить как 2D-массив, я получу segfault.

real arg1(nx,ny)

С переупорядоченными массивами, как указано выше, это должно работать.Почему это не удается?Любая помощь будет оценена.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 14 февраля 2012

Сбой, потому что вы лжете компилятору о размере массива.

В Фортране 77 люди все время использовали уловки, потому что выбора не было. В наш нынешний просвещенный век мы никогда не должны совершать подобные трюки - только программисты на Fortran77 и C должны прибегать к такой нелепости.

Согласно ответам на изменение размеров массива в фортране , если вы хотите изменить размер массива или просто создать ссылку на него другой формы, вы можете использовать RESHAPE встроенную или используйте указатель массива.

3 голосов
/ 14 февраля 2012

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

program test
    integer :: nx, ny
    real, pointer :: abc(:)
    nx = 2
    ny = 3
    allocate(abc(nx**3))
    call my_sub(abc, nx, ny)
    write(*,*) abc
end program

subroutine my_sub(abc, nx, ny)
    integer :: nx, ny
    real :: abc(nx,ny)
    abc = 1.0
end subroutine

Чтобы узнать, как передаются массивы, вы можетепрочитайте эту страницу.Внизу вы можете найти таблицу с возможными ситуациями.Здесь применяется нижний левый регистр.

...