Ошибка нарушения прав доступа при передаче массива

Прежде чем найти ответ на вопрос, который я задал раньше , я написал очень простой код для очень похожей сетки (есть только два треугольника), как показано ниже, для вызова функции C в фортране. Для простоты кода. Здесь не используется ни интерфейсный модуль, ни iso_c_binding (насколько это возможно). Это очень похоже на этот пост. Есть еще одна ошибка.

program METIS_NoInterface

  implicit none

  integer :: ne, nn
  integer, dimension(:), allocatable      :: eptr, eind
  integer, pointer                        :: vwgt=>null(), vsize=>null()
  integer                                 :: nparts
  real, pointer                           :: tpwgts=>null()
  integer, dimension(0:39)                :: opts
  integer                                 :: objval
  integer, dimension(:), allocatable      :: epart, npart

  ! Input  => 2 tri: too small mesh
  !ne = 2
  !nn = 4
  !nparts = 2
  !allocate(eptr(0:2), eind(0:5))
  !eptr=[0,    3,     4]
  !eind=[0,1,3,1,2,3]

  ! Output
  !allocate(epart(0:1), npart(0:4))

  ! Input  => 4 quad : reasonable result
  ne = 4  
  nn = 9
  nparts = 2
  allocate(eptr(0:ne), eind(0:15))
  eptr=[0,4,8,12,16]
  eind=[0,1,8,7,1,2,3,8,3,4,5,8,5,6,7,8]

  ! Output
  allocate(epart(0:ne-1), npart(0:nn-1))

  ! METIS function call
  call METIS_SetDefaultOptions(opts)
  !call METIS_PartMeshNodal(ne,ne,eptr,eind,vwgt,vsize,nparts,tpwgts,&  !<=syntax error
   call METIS_PartMeshNodal(ne,nn,eptr,eind,vwgt,vsize,nparts,tpwgts,&
                                opts,objval,epart,npart) 

  ! Result print
  write(*,*) epart
  write(*,*) ''
  write(*,*) npart
  write(*,*) ''
end program

Выдает ошибку нарушения прав доступа из-за eind. Он запускается в любом случае, если вместо eind передается c_null_ptr. Размер массива eind и количество элементов совпадают. Как это можно исправить? => решено. Спасибо!

Проблема, с которой я столкнулся, заключалась в системной ошибке при вызове METIS_PartMeshNodal, 2-й аргумент был ne, который совпадает с 1-м аргументом ne. Это должно было быть nn.
Решение состояло в том, чтобы заменить второй аргумент на nn. Приведенный выше код может быть скомпилирован и выполнен.

ПРИМЕЧАНИЕ. Слишком маленькая сетка может не иметь разумного решения из-за схемы METIS.
Пожалуйста, обратитесь к другому post для использования интерфейсного модуля.


person dave    schedule 07.02.2013    source источник
comment
Должен ли второй аргумент METIS_PartMeshNodal быть nn, а не ne? Кроме того, ПОЧЕМУ вы пропустили материал iso_c_binding, который специально предназначен для помощи в подобных вещах? Проще НЕ то же самое, что проще!   -  person Ian Bush    schedule 07.02.2013
comment
Вы уверены, что используете правильные значения для ne и nn? В частности, массивы eptr и eind имеют размер 3 и 6, но ни одна из ваших скалярных переменных, которые вы передаете функции, не содержит таких значений.   -  person Bálint Aradi    schedule 07.02.2013
comment
Я не могу воспроизвести ваше нарушение прав доступа с помощью METIS 5.0.2 и gfortran 4.7 ни с помощью этого кода, ни с блоком интерфейса из вашего другого вопроса. Я получаю epart = [0, 0] и npart = [0, 0, 1, 1, 0] (то есть с nn, переданным в качестве второго аргумента).   -  person sigma    schedule 07.02.2013
comment
Спасибо всем за добрые ответы. После исправления синтаксической ошибки я получил epart=[0,0], npart=[0,0,1,1,-1163005939] (от ivf 2011 с vs2008). Последний элемент устарел, но я получил ответ от Univ. штата Миннесота, что слишком маленькая ячейка может дать неправильный результат. Нарушение доступа, по-видимому, вызвано синтаксической ошибкой. Я получил разумный результат для квадратной сетки 2x2. И до этого поста мне не удалось запустить код с iso_c_binding, но я опубликую результат как можно скорее.   -  person dave    schedule 07.02.2013
comment
Спасибо за комментарии, я завершил программу, которая вызывает функцию METIS_PartMeshNodal из фортрана, используя интерфейсный модуль iso_c_binding. Если кому-то нужен пример, напишите мне ([email protected])   -  person dave    schedule 07.02.2013
comment
Почему бы не отредактировать один из ваших вопросов, чтобы указать точные проблемы, с которыми вы столкнулись, и ответить на них самостоятельно, указав шаги, которые помогли их решить? Таким образом, это должно быть совершенно ясно для любых будущих читателей вашего вопроса.   -  person sigma    schedule 07.02.2013
comment
@sigma Спасибо за совет, и я отредактировал его. Не могли бы вы запустить код с option(7)=1 для нумерации в стиле Fortran? Я получил тот же результат независимо от варианта. Интересно, безупречен ли мой код?   -  person dave    schedule 07.02.2013
comment
На самом деле я хотел оставить нерабочий случай в вопросе и шаги к решению в ответе ниже. Затем вы можете принять свой собственный ответ, чтобы вопрос не оставался открытым. Или удалите вопрос, если вы не считаете, что было бы полезно сохранить его. P.S.: Я также получаю тот же результат с opts(7)=1 или без него. Я бы еще советовал использовать интерфейсный блок, который должен предупреждать о том, что дефолтное реальное tpwgts не совпадает с c_double.   -  person sigma    schedule 11.02.2013