Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > Вызов подпрограммы


Автор: Шурф 22.4.2013, 19:07
Вечер добрый.

 Я совсем плохо соображаю в Fortran и програмировании вообще, поэтому строго не судите =)
 Надеюсь, слова типа энтропии никого не введут в ступор, т.к. в принципе они не важны. 
 Вопрос в следующем. В основной программе мне нужно посчитать три параметра: плотность, энтальпию и температуру. 
 При компилировании выдает ошибку следующего содержания:
Код

C:\...\Helium.f90(18): warning FOR4265: symbol ROT referenced but not set
C:\...\Helium.f90(18): warning FOR4265: symbol TT referenced but not set


Я так понял, что нет какой-то ссылки на ROT и TT.
 Что нужно сделать?

 Программа:
Код

program He
call He1 !подключение свойств гелия-1
print*,'zadaj p=(MPa)?';read*,p !задание давления, МПа
print*,'zadaj s=(K)?';read*,s !задание энтропии
print*,'zadaj N=(K)?';read*,N !задание фазового состояния
t=TT !температура
ro=ROT !плотность 
h=CRH(RO,T)      !давление
print*
print*,'p=',p
print*,'s=',s
print*,'Rezult - ro=',ro !плотность
print*,'Rezult - h=',h ! энтальпия
print*,'Rezult - t=',t !температура
read*
end


Подпрограмма:

Код

SUBROUTINE FPST(N,P,S,T,H,RO) ! T(P,S), H(P,S), RO(P,S)
! BЫЧИCЛEHИЕ TEMПEPATУPЫ, ЭHTAЛЬПИИ,
! ПЛOTHOCTИ ПO ДABЛEHИЮ И ЭHTPOПИИ.
      COMMON/A/TKR,PKR,ROKR,R
      IF(PKR.GE.3.)T1=65.
      IF(PKR.LE.3.)T1=3.
      TT=320.
      DT=(TT-T1)/3.
    2 IF(P.GT.PKR.AND.T.LT.TKR)ROT=CRRO(P,TT,0)
      IF(P.GT.PKR.AND.T.GT.TKR)ROT=CRRO(P,TT,1)
      IF(P.LE.PKR)ROT=CRRO(P,TT,N)
      ST=CRS(ROT,TT)
      IF(ABS(S-ST).LE.0.001)GO TO 1
      IF((ST-S).LT.0.)GOTO 3
  3  TT=TT+DT
      GO TO 2
      IF((ST-S).GT.0.)GO TO 4
   4  TT=TT-DT
      DT=DT/2.
      TT=TT+DT
      GO TO 2
    1 T=TT
      RO=ROT
      H=CRH(RO,T)
      RETURN
      END


Если нужна еще какая-то информация, говорите. 
 Помогите, пожалуйста!

Автор: Фантом 22.4.2013, 19:37
Переменные TT и ROT являются локальными для подпрограммы, внешняя программа о них ничего не знает. Соответственно, надо каким-то образом передать их наверх.

P.S. Вы в 2013 году используете стандарт Fortran IV образца 1966 года из религиозных соображений или любви к антиквариату? Ему скоро полвека стукнет, за это время только новых стандартов языка успело появиться пять штук.

Автор: Шурф 22.4.2013, 22:39
главное чтобы то, что я использую, считало то,ч то мне нужно)

так а как их передать наверх? Даже если я копирую часть подпрограммы в программу основную, то все равно ничего не считает(ошибка исчезает, но после ввода значений окно сразу же закрывается)

Код

program He
call He1 
print*,'zadaj p=(MPa)?';read*,p 
print*,'zadaj s=?';read*,s 

N=1
T1=65.
TT=320.
      DT=(TT-T1)/3.
2      ROT=CRRO(P,TT,N)
ST=CRS(ROT,TT)
      IF(ABS(S-ST).LE.0.001)GO TO 1
      IF((ST-S).LT.0.)GOTO 3
  3  TT=TT+DT
      GO TO 2
      IF((ST-S).GT.0.)GO TO 4
   4  TT=TT-DT
      DT=DT/2.
      TT=TT+DT
      GO TO 2
    1 T=TT


ro=ROT
h=CRH(RO,T)        
print*
print*,'p=',p
print*,'s=',s
print*,'Rezult - ro=',ro
print*,'Rezult - h=',h
print*,'Rezult - t=',t
read*

end


Автор: Фантом 22.4.2013, 22:54
Теперь надо бы где-то найти функции CRRO, CRS и CRH, инициализировать содержимое коммон-блока... короче говоря, дописать всю содержательную часть программы.  smile 

Давайте-ка признаваться: это такое извращенное учебное задание или честная попытка приспособить древний код к чему-нибудь? 

Автор: Шурф 22.4.2013, 23:00
с CRRO, CRS и CRH все нормально, там это все как-то считается(это часть большой прграммы). По крайней мере в еще одном варианте другой программы считалось. Отставим их в сторону

основной вопрос в ROT и TT


Признаюсь: древний код к чему-нибдуь. Вся эта дребедень - грубо говоря, справочник теплофизических свойств криоагентов. Мне нужен гелий-1. Без этой программы, которая будет считать энтальпию, плотность и температуру в зависимости от давления и энтропии, я повешусь smile 



Автор: Шурф 22.4.2013, 23:26
как там использовать common?
я что-то почитал про него, вроде то, но до конца не понимаю

Автор: Фантом 23.4.2013, 00:16
Цитата(Шурф @  23.4.2013,  00:00 Найти цитируемый пост)
с CRRO, CRS и CRH все нормально, там это все как-то считается(это часть большой прграммы). По крайней мере в еще одном варианте другой программы считалось.

Отлично, но с этой программой они должны быть слинкованы, иначе ничего работать не будет.

Да, кстати, слона-то я и не приметил... Почему в основной программе вызывается подпрограмма He1 и какое отношение ко всему имеет FPST?

Цитата(Шурф @  23.4.2013,  00:00 Найти цитируемый пост)

основной вопрос в ROT и TT

Нет, это только одна мелочь из целой горы вопросов. Просто эти ошибки компилятор находит раньше остальных.


Цитата(Шурф @  23.4.2013,  00:00 Найти цитируемый пост)

Признаюсь: древний код к чему-нибдуь. Вся эта дребедень - грубо говоря, справочник теплофизических свойств криоагентов. Мне нужен гелий-1. Без этой программы, которая будет считать энтальпию, плотность и температуру в зависимости от давления и энтропии, я повешусь 

Понятно. Тогда давайте сделаем так: запакуйте в архив и прицепите к сообщению все, что у Вас есть по части этой программы. Желательно - в исходном виде, до внесения правок. Посмотрим, что из этого можно собрать.

Автор: Шурф 23.4.2013, 00:35
He1 - это, на сколько я понял, подпрограмма с общей информацией о гелии
FPST - это расчет остальный параметров, которые мне нужны(там еще куча таких подпрограмм)
Запаковал все, что намудрил. В изначальном виде, в котором часть работала. Сначала вообще ничего не работало, но танцы с бубном помогли.
Наверное там много лишнего. Открывал я путем "open workspace..."
helium-основная программа
cryag-z - с подпрограммами

спасибо уже за то, что занимаетесь мной smile  smile 

Автор: Фантом 23.4.2013, 01:45
Ну что ж, теперь все ясно, поскольку хвосты видны. Программа, кстати, совершенно нормально и без каких-либо изменений собирается, но, правда, нормальным же компилятором (а у Вас там, похоже, MS PowerStation). 

Вам надо написать в главной программе следующее:
Код

program He
call He1 !подключение свойств гелия-1
print*,'zadaj p=(MPa)?';read*,p !задание давления, МПа
print*,'zadaj s=(K)?';read*,s !задание энтропии
print*,'zadaj N=(K)?';read*,N !задание фазового состояния

call FPST(N,p,s,t,h,ro)

print*
print*,'p=',p
print*,'s=',s
print*,'Rezult - ro=',ro !плотность
print*,'Rezult - h=',h ! энтальпия
print*,'Rezult - t=',t !температура
read*
end


Получится то, что требуется.

Автор: Шурф 23.4.2013, 10:06
ох, вот оно как значит.
правда окно программы все равно закрывается после ввода значений. Но ладно
спасибо smile 

Автор: Фантом 23.4.2013, 17:17
Запустите получившийся exe-шник из командной строки, тогда ничего не закроется.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)