векторная функция Fortran дает ошибку шины - PullRequest
1 голос
/ 06 декабря 2011

Следующая программа выдает ошибку шины ... есть идеи, почему?

  program main
  integer, parameter :: n = 3
  integer, dimension(n) :: out

  out = rep(1,n)
  print *, (out(i), i=1,n)

  end program

  function rep(x,n)
  integer :: x
  integer :: n
  integer, dimension(n) :: rep

  do i=1,n
     rep(i) = x
  enddo

  end function

Я думаю, что это связано с integer, dimension(n) :: rep, но я не уверен, почему это происходит.

Ответы [ 2 ]

5 голосов
/ 06 декабря 2011

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

  module m_rep

  contains

  function rep(x,n)

  implicit none

  integer :: x
  integer :: n
  integer :: i
  integer, dimension(n) :: rep

  do i=1,n
     rep(i) = x
  enddo

  end function

  end module

, затем используйте модуль в своей основной программе со строкой

  use m_rep

Кроме того, используйте неявный none дляубедитесь, что все ваши переменные объявлены правильно.

1 голос
/ 06 декабря 2011

Все еще не совсем ответ на ваш вопрос, но, возможно, вызов функции вместо вас будет работать:

program main
implicit none
integer :: i
integer, parameter :: n = 3
integer, dimension(n) :: out

call repeat(1,3,out) 
print *, (out(i), i=1,n)

end program

subroutine repeat(x,n,y)
implicit none
integer :: i   
integer,intent(in) :: x,n
integer,dimension(n),intent(out) :: y

do i=1,n
  y(i) = x
enddo

endsubroutine

Надеюсь, кто-то придет с ответом для вашей функции.Проблема, с которой я столкнулся, заключается в том, что Fortran не позволит вам сделать что-то вроде:

integer,external :: rep(n)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...