2017-02-06 3 views
1

Я пытаюсь понять, как передать некоторые переменные со значениями, подпрограмму, из другой подпрограммы.Передача параметров подпрограмме в Fortran

У меня есть код:

program pg 
call sub() 
end 

subroutine sub() 
character :: P(12,12) 
character :: D(20), N(26), userInput 
integer :: A,B 

A = 5 
B = 2 
userInput = "hello" 
call test(P,D,N,userInput,A,B) 

end subroutine 

subroutine test(P,D,N,userInput,A,B) 

end subroutine test 

Но это дает мне предупреждение:

Warning: Type mismatch in argument 'p' at (1); passed CHARACTER(1) to REAL(4) 

Я не совсем уверен, о том, как избавиться от этого предупреждения, не говоря уже, если вызов подпрограммы правильный (синтаксис мудрый). Любая помощь приветствуется.

+0

Вы должны выполнить подпрограмму 'test'. Как бы то ни было, вы не указали типы аргументов, поэтому используются правила типизации по умолчанию. Похоже, ваш компилятор проверяет интерфейсы и обнаруживает, что они не совпадают. – francescalus

+0

Я довольно новичок в fortran, как бы объявить здесь типы аргументов? Я действительно не знаю, как это сделать. – werrer

+0

Это, возможно, слишком велико, чтобы ответить здесь, но может оказаться полезным [документация] (http://stackoverflow.com/documentation/fortran/1106/procedures-functions-and-subroutines#t=20170206030408357924). – francescalus

ответ

1

Во-первых, почему происходит эта ошибка: Вы явно не объявлены какие-либо переменные подпрограммы test так по умолчанию, применяются правила переменной типа IMPLICIT - переменные, начинающиеся с [A-H,O-Z] рассматриваются как одинарной точности реалов (REAL(4)) и остаток (начиная с [I-N]) являются целыми числами. В этом случае реальные аргументы test: P, D, userInput, A и B; N рассматривается как целое число. Также все они рассматриваются как скалярные величины, поскольку информация о размерах не представлена ​​в test.

В подпрограмме sub переменная P объявлена ​​как массив длиной от 1 до 12 (одиночные символы или CHARACTER(1)). Это объясняет, почему вы получаете ошибку несоответствия типа.

Совет: ознакомьтесь с инструкцией IMPLICIT и начните свой код с IMPLICIT NONE, всегда. Это заставляет вас объявлять все ваши переменные. Это небольшое неудобство позволяет компилятору уловить опечатки и конфликты пространства имен и считается лучшей практикой. Он не решит вашу следующую проблему (P, D и N - это массивы, переданные в качестве аргументов в процедуру, которая ожидает их скаляров), но она избавится от ошибки несоответствия типа.

Для получения бонусных очков ознакомьтесь с атрибутом INTENT для объявлений аргументов. Если вы знаете, что определенные аргументы доступны только для чтения или будут иметь только значения, установленные в рамках процедуры, вы можете объявить их как INTENT(IN) или INTENT(OUT). Это дополнительный защитник от случайного изменения переменных только для чтения или чтения переменных до их инициализации.

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