2015-02-20 2 views
-1

Взаимодействуя с Fortran 77 результатов подпрограммы в ошибке «Invalid доступа к памяти» с кодом, который я суммированы ниже:Недопустимый доступ к памяти с Fortran 77 подпрограммой

subroutine mysub1() 
    parameter :: kk=22 
    real, dimension(KK) :: A 
    call F77SUB(A) 
end 

subroutine mysub2() 
    parameter, integer :: kk=22 
    real, dimension(:,:), allocatable :: A 
    integer :: jj 

    jj = 12 
    allocate(A(kk,jj)) 

    call F77SUB(A(:,1)) ! ERROR: Invalid memory access 
end 

Где F77SUB является Фортран подпрограммой Я пытаюсь который берет 1D-массив и записывает на него. В приведенном выше коде mysub1 работает, но mysub2 нет.

Может ли кто-нибудь предположить, что проблема выше, или предоставить подробную информацию о том, как массивные аргументы фактически передаются между подпрограммами F90 и F77? Я видел экземпляры скаляров, передаваемых в подпрограммы F77, которые, по-видимому, просто берут адрес памяти скаляра в начало массива. Любое просвещение будет оценено по достоинству.

+0

вы можете отредактировать свой вопрос, чтобы исправить это, а не комментировать. Кроме того, используется 'jj' перед распределением? Если нет, то что это? Что такое интерфейс для 'F77SUB' и как фиктивная переменная' A' объявлена ​​внутри этой функции (предполагается, что функция, потому что 'CALL' отсутствует?) – casey

+0

вы уверены, что' F77SUB' не имеет доступа к массиву (или что-то еще) за границами? – agentp

ответ

1

Слишком долго для комментариев, но не совсем ответ ..

кода вы Размещенный Crazee, и пытаюсь исправить обобщенный код является бесплодной задача, поэтому я не буду тратить много времени на него. Вот пара вопиющих ошибок, пожалуйста, не отвечайте, сообщив нам, что в вашем «реальном» коде ошибки отсутствуют.

  1. F77SUB(A(:,1)) синтаксически неправильно для вызова подпрограммы, call F77SUB(A(:,1)) правильно.
  2. Выделение массива, который не объявляется подлежащим распределению, не рекомендуется.
  3. Дается аргумент о предоставлении явного значения intent.
  4. Дихотомия, которую вы рисуете между программами Fortran 90 и FORTRAN77, вводит в заблуждение. Если ваш компилятор может скомпилировать Fortran 90 (и он должен иметь возможность, или у вас не будет каких-либо allocatables), тогда вам лучше подумать о том, что ваш код является просто фортраном.
+0

Я исправил упомянутые синтаксические ошибки (1 и 2). # 3 не имеет большого смысла для меня, так как у меня нет аргументов процедуры в моих процедурах выше. Вы не сделали никаких предложений о том, какова может быть проблема. – user2664470

+2

Вы все еще просите нас попробовать разобраться с проблемами с суммированной версией кода. Опубликуйте минимальный, компилируемый пример, который воспроизводит проблему. Вероятно, лучше всего включить код для 'f77sub' в любые сделанные вами обновления. Вероятно, также лучше всего включить, порезав «точное сообщение об ошибке». Вероятно, также хорошая идея для повторной компиляции и повторного выполнения с проверкой границ массива и проверкой аргументов подпрограммы - ваша документация компилятора расскажет вам, как сделать то и другое. О, и вы только фиксировали синтаксис для вызова подпрограммы один раз. –

0

Я нашел проблему. Я объявлял 1D A двойной точностью и 2D A был реальным. Как-то это позволило мне передать их обоих в рутину F77 без жалобы.

+0

В основном ошибка была в другой версии кода, указанной в вопросе? Вы должны либо отредактировать вопрос, чтобы отразить ошибку, либо удалить все это. Разумеется, полезный урок, который вы узнали здесь, не проверяет тип проверки на * внешних вызовах подпрограммы. – agentp

+0

«Конечно, полезный урок, который вы узнали здесь, не проверяет тип на внешних вызовах подпрограмм« Спасибо! Это объясняет проблему. Что считается внешним? например, как я могу обеспечить проверку типов? – user2664470

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