Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Tools] Скомпилировать код, где и как? спасибо 
V
    Опции темы
dusnur
Дата 13.11.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



всем привет. фортран совсем не знаю. но есть код который дал преподаватель. где мне его откомпилировать и выполнить программу со своими значениями.
спасибо.
надеюсь на вашу помочь smile 
PM MAIL   Вверх
FatalError
Дата 13.11.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.4.2006

Репутация: нет
Всего: 1



Проблема, собственно, в том, что различные компиляторы Фортрана имеют некоторые собственные фишки или особенности, которых нет у других. Обычно эти особенности встречаются в неких не слишком часто выполняемых действиях, вроде обращения к функции из DLL. Если в программе никаких таких наворотов нет, то ее можно откомпилировать на любом компиляторе.

Еще одна трабла - начиная с Фортрана90 размер переменных принято указывать таким, например, способом: kind=1. Пакость в том, что разные производители плохо договорились, что под каким kind понимать, и значения kind могут не совпадать для разных компиляторов. Если там в программе написано как в Фортране77, к примеру, real*8, то проблем не должно быть.

Чтобы особо не утруждать себя поисками всякого вареза, можно просто скачать бесплатный компилятор g95 на www.g95.org . Устанавливается он элементарно, и к нему идет небольшой такой хелп (на инглише) с достаточно подробным объяснением, как нужно программу откомпилировать. И компилируется все очень просто, понятия проекта (как в коммерческих компиляторах) вообще нет.
PM MAIL   Вверх
dusnur
Дата 13.11.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



да нет. програмам состоит из описания переменных. формул. и потом две функции. больше ничего 

Добавлено @ 22:07
FatalError
не мог бы прямую ссылку дать на компилятор. на сайте ничего не понял.
спасибо

Это сообщение отредактировал(а) dusnur - 13.11.2007, 22:22
PM MAIL   Вверх
FatalError
Дата 14.11.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.4.2006

Репутация: нет
Всего: 1



http://ftp.g95.org/ - это страница загрузки. Сначала - ссылка на исходники компилятора и мануалы (оказывается, есть русский, я не знал!). Потом - ссылки на установочные файлы для разных ОС. Предположим, что надо под Винду - под нее 3 варианта. Последний (обозначенный как g95-Cygwin.exe) мы сходу отметаем, поскольку скомпилированные программы не будут работать без cygwin1.dll, что неудобно. А выбираем мы первый вариант - g95-MinGW.exe. Он никаких dll не требует, но это за счет того, что ко всем программам приваривается содержимое подобной cygwin1.dll, но более мелкой dll-ки: MinGW. Поэтому любая прога будет тяжелее килобайт на триста. В общем, далеко не смертельно, зато ЕХЕ-файл можно спокойно переносить с компьютера на компьютер, и все будет работать.

Прямая ссылка на закачку:  http://ftp.g95.org/g95-MinGW.exe 
PM MAIL   Вверх
dusnur
Дата 14.11.2007, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



спасибо. скачал. компилирую черз командную строку. но выходит такая ошибка:
Unclassifiable statement following IF-clause at (1)
в строке 76.
код
Код


      real k,kt,kO,kd,ksum,mut,n,nc,np
      read(5,*) pvs,png,tvs,k,pr,ccp,n,am,kd,mut,k0,deps,kt
      print 2,pvs,png,tvs,k,p
    2 format(20x,'Исходные данные'//
     *2x,'Давление всасывания',15x,'pvs=',f7.3,1x,'МПА'/
     *2x,'Давление нагнетания',15x,'png=',f7.3,1x,'МПА'/
     *2x,'Температура всасывания',12x,'tvs=',f5.1,3x,'К'/
     *2x,'Показатель адиабаты',17x,'k=',f7.3/
     *2x,'Производительность компрессора',5x,'pr=',f7.3,1x,'м*3/c'/
     *2x,'Средняя скорость поршня',11x,'ccp=',f7.3,1x,'м/с'/
     *2x,'Частота вращения вала',15x,'n=',f6.2,2x,'1/c'/
     *2x,'Относительное мертвое простран-'/
     *2x,'ство',31x,'am=',f6.2/
     *2x,'Коэффициент давления',15x,'kd=',f6.2/
     *2x,'Коэффициент утечек',16x,'mut=',f6.2//) 
      eps=png/pvs
      pi=3.14159    
      dpvs=2.66*0.3/((pvs*10**6)**0.25)
      dpng=2.66*0.7/((png*10**6)**0.25)
      pdvs=(1.-dpvs)*pvs
      pdng=(1.+dpng)*png
      deps=pdng/pdvs
      tng=tvs*(deps* *((k-1. )/k))
      kt=1.-0.01*(deps-1.)
      nc=0.92*k
      np=0.95*nc
      k0=1.-am*(deps**(1./np)-1.)
      ksum=kt * kO * kd
      vn=mut*pr/ksum
      f=2. *vn/ccp    
      d=sqrt(4.*f/pi)
      d=d*10.
      if(d.le.1.) d=okdol(d)
      if(d.gt.1.) d=okpol(d)
      s=4.*vn/(pi*(d**2.)*n)
      s=s*10.
      s=okpo(s)
      dccp=2.*s*n
      df=2.*vn/dccp
      dd=sqrt(4.*df/pi)
      dd=dd*10.
         if(dd.le.1.) dd=okdo1(dd)
      if(dd.gt.1) dd=okpo1(dd)
      dvn=pi*(dd**2.)*S*n/4.
      dpr=ksum*dvn/mut
      print 4, eps, deps, pdvs, pdng, tng, kt, kO, ksum,
     *deep,s,dd,df,dvn,dpr
    4 format(/20x,'РЕЗУЛЬТАТЫ РАСЧЕТА'//
     *2x,'Отношение давлений',16x,'eps=',e10.5/
     *2x,'Отношение давлений с'/
     *5x,'учетом потерь',17x,'deps=',e10.5/
     *2x,'Давление всасывания с'/
     *5x,'учетом потерь',17x,'pdvs=',e10.5,1x,'МПА'/
     *2x,'Давление нагнетания с'/
     *5x,'учётом потерь',17x,'pdng=',e10.5,1x, 'МПА'/
     *2x,'Температура нагнетания',12x,'tng=',e10.5,1x,'К'/
     *2x,'Температурный коэффициент',10x,'kt=',e10.5/
     *2x,'Объемный коэффициент',15x,'кО=',e10.5/
     *2x,'Коэффициент наполнения',11x,'ksum=',e10.5/
     *2x,'Уточненное значение'/
     *5x,'скорости поршня',15x,'deep=',e10.5,1x,'м/с'/
     *2x,'Ход поршня',26x,'s=',e10.5,1x,'м'/
     *2x,'Уточненный диаметр цилиндра',8x,'dd=',e10.5,1x, 'м' /
     *2x,'Уточненное значение'/
     *5x,'площади поршня',18x,'df=',e10.5,1x,'м**2' /
     *2x,'Уточненная теоретическая'/
     *5x,'производительность'13x,'dvn=', e10.5,1x, 'м**3/с' /
     *2x,'Уточненная действительная'/
     *5x,'производительность',13x,'dpr=',e10.5,1x, 'м**3/с' )
      stop
      end
      function okpo1(y)
      y=y*10.
      okpol=aint(y)
      if((y-okpo1).ge.0.5)
      okpo1=okpo1+1.
      okpo1=okpo1/100.
      return 
      end
      function okdo1(x)
      x=x*100.
      okdo1=aint(x)
      if((x-okdo1).ge.0.5) 
      okdo1=okdo1+1.
      okdo1=okdo1/1000. 
      return
      end


PM MAIL   Вверх
FatalError
Дата 14.11.2007, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.4.2006

Репутация: нет
Всего: 1



okpo1=okpo1+1. - как раз 76 строка. Ругательства компилятора на "непонятно что после выражения с If" вызваны синтаксической ошибкой: в данном случае содержимое 76 строки должно было идти в конце  75-й, без перескока на новую строчку. Но это еще не все, мелочи. Разобраться, разобраться надо в этой функции okpo1(y)!

1. В тексте программы функция вызывается как okpol:
if(d.gt.1.) d=okpol(d) (34 строка, скопировано-вставлено)

2. При описании подпрограммы она обозвана okpo1(y) (уже не с l, а с единичкой):

function okpo1(y)
      y=y*10.
      okpol=aint(y)
      if((y-okpo1).ge.0.5)
      okpo1=okpo1+1.
      okpo1=okpo1/100.
      return 
      end

А в теле функции она прописана и как okpol (74 строка), и как okpo1 (строки 76, 77). Под тегом CODE этого не видно, шрифт такой, но при копировании-вставке это дело вылезает в явном виде.

В общем, если это было точно скопировано с текста программы, то в нем полно ошибок (в именах функций), которые надо выявить и исправить.

Кроме того, в листинге сделана рекурсия в объявлении функции. Ведь выражение okpo1=okpo1+1. - это, формально, именно рекурсия, поскольку значение функции okpo1 определено через саму эту функцию. Реально никакой рекурсии не подразумевается, но компилятор нас может не так понять. Лучше вместо okpo1 взять временную переменную, а потом функцию приравнять к ее значению.

Принимая, что истинное имя этой злосчастной функции - okpol (под ним ее вызывали из основной программы), ее можно переписать так:

      function okpol(y)
      real y,tmp
      y=y*10.
      tmp=aint(y)
      if((y-tmp).ge.0.5) tmp=tmp+1.      
      okpol=tmp/100.
      return 
      end

Дальше проверяем сходную функцию okdol. В основной программе она так и названа:

d=okdol(d) 

Зато при ее описании опять пошли в ход единички:

      function okdo1(x)
      x=x*100.
      okdo1=aint(x)
      if((x-okdo1).ge.0.5) 
      okdo1=okdo1+1.
      okdo1=okdo1/1000. 
      return
      end

Плюс та же ошибка с разделением выражения с If на две строки, и та же псевдорекурсия. Переписываем сходным образом:

      function okdol(x)
      real x,tmp
      x=x*100.
      tmp=aint(x)
      if((x-tmp).ge.0.5) tmp=tmp+1.
      okdol=tmp/1000. 
      return
      end

Это еще не все! Похожие фокусы с немного неправильными именами обнаружились и для переменной k0: она объявлена (в первой строке) как kO (с буковкой О), во второй строке она уже k0 (с ноликом!), в 27 строке - k0 (с ноликом), в 28 строке - kO (с буквой О), в 46 строке - опять kO (с буквой О). А по смыслу вроде это должна быть одна и та же переменная!

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

Это сообщение отредактировал(а) FatalError - 14.11.2007, 22:06
PM MAIL   Вверх
dusnur
Дата 14.11.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



FatalError
так ошибки исправил. 
if-ы подправил. функции тоже. должно быть 
   
Код

function okpo1(y)
      y=y*10.
      okpol=aint(y)
      if((y-okpo1).ge.0.5) okpo1=okpo1+1.
      okpo1=okpo1/100.
      return 
      end
      function okdo1(x)
      x=x*100.
      okdo1=aint(x)
      if((x-okdo1).ge.0.5) okdo1=okdo1+1.
      okdo1=okdo1/1000. 
      return
      end

ещё такая штука. в программе есть спец ошибки. они в объявлении переменных. т.е. некоторые переменные не описаны, то компилятор на это не ругается, почему?

теперь я скомпилировал. появился файл *.o
как мне теперь ввести свои данные и получить результаты?


FatalError, спасибо большое что помогаешь.
PM MAIL   Вверх
FatalError
Дата 14.11.2007, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.4.2006

Репутация: нет
Всего: 1



Ну и еще не очень хороша идея вводить кучу данных с клавиатуры, а потом получить результаты расчетов в консольном окне, откуда их никак нельзя скопировать, а только переписать вручную. Почему бы не подправить прогу так, чтобы она читала данные из файла и записывала результаты расчетов в другой файл? Или дописывала бы эти результаты под введенными значениями в тот же самый файл, так даже лучше: сразу есть и что ввели, и что получили. Для простоты мы жестко зашьем в программе имя файла, с которым она будет работать: пусть это будет файл data.txt . Файл должен лежать в той же папочке, что и запускаемая программа. При повторном запуске программы уже обработанный файл придется переименовать, чтобы программа его не видела, да и положить в эту папку второй файл с таким же названием невозможно. 

Тонкий вопрос - кодировка русских букв. Если приведенная прога набирается в какой-то Виндовской программе, то она будет сохранена в кодировке ANSI. При выводе результатов в консольное окно вместо русских букв будут кракозябры, поскольку в консоли применяется ДОСовская кодировка. Но если мы все пишем в файл, то все нормально запишется в ANSI и будет без проблем читаться любой Виндовской программой. Так что вот еще один существенный довод в пользу переделки проги.

Сделаем мы это немного сложновато (на вид): сначала откроем файл data.txt только на чтение, потом закроем, потом опять откроем на запись с дописыванием к имеющемуся содержимому. Может, я не прав, но так надежней.

Что пишется в data.txt? Значения pvs, png, tvs, k, pr, ccp, n, am, kd, mut, k0, deps, kt. Согласно приведенному коду, они должны быть записаны все в одну строчку (поскольку они читаются одним оператором ввода). Это просто неудобно. Лучше поменять прогу так, чтобы каждое число читалось отдельным оператором, тогда они пишутся каждое на отдельной строке. Примерно так:

12.
0.035
6.475
8.1256
- и т.д.

Подправив заодно диверсионные буковки в переменной k0, получаем:

Код

      program kompressor
      implicit none

C  Директива implicit none запрещает использовать переменные, которые
C  не описаны явным образом (в Фортране можно переменные не описывать).
C  Это хорошее средство отлавливания опечаток и "диверсий" вроде тех,
C  которые здесь были устроены.

C  (ну а строчка, начинающаяся с C - это комментарий)

      real pvs, png, tvs, k, pr, ccp, n, am, kd, mut, k0, deps, kt
      real eps, pi, dpvs, dpng, pdvs, pdng, deps, tng, nc, np, ksum
      real vn, f, d, s, dccp, df, dd, dpr
      parameter (pi = 3.14159) 

      open (12, file = 'data.txt', action = 'read', status = 'old', form = 'formatted')

C  Это мы открыли файл data.txt на чтение и присвоили ему номерок 12.
C  Потом этот номерок будем указывать в операторах чтения.

      read(12,*) pvs
      read(12,*) png
      read(12,*) tvs
      read(12,*) k
      read(12,*) pr
      read(12,*) ccp
      read(12,*) n
      read(12,*) am
      read(12,*) kd
      read(12,*) mut
      read(12,*) k0
      read(12,*) deps
      read(12,*) kt
      close(12)

C Все, файл закрыли, теперь открываем его же на запись, номерок 13:

      open (13, file = 'data.txt', action = 'write', 
     *   status = 'append', form = 'formatted')

C  Спецификатор status = 'append' позволяет приписывать что-то в конец
C  имеющегося файла. Правда, он не стандартный, но его практически
C  все компиляторы понимают.

      write (unit = 12, fmt = 2) pvs, png, tvs, k, pr, ccp, n, am, kd, mut

C  В программе была неточность - слишком мало переменных выводили

C  print - нестандартный оператор (некоторые компиляторы его
C  не поддерживают), лучше писать write - по стандарту

    2 format(20x, 'Исходные данные'//
     *2x,'Давление всасывания',15x,'pvs=',f7.3,1x,'МПА'/
     *2x,'Давление нагнетания',15x,'png=',f7.3,1x,'МПА'/
     *2x,'Температура всасывания',12x,'tvs=',f5.1,3x,'К'/
     *2x,'Показатель адиабаты',17x,'k=',f7.3/
     *2x,'Производительность компрессора',5x,'pr=',f7.3,1x,'м*3/c'/
     *2x,'Средняя скорость поршня',11x,'ccp=',f7.3,1x,'м/с'/
     *2x,'Частота вращения вала',15x,'n=',f6.2,2x,'1/c'/
     *2x,'Относительное мертвое простран-'/
     *2x,'ство',31x,'am=',f6.2/
     *2x,'Коэффициент давления',15x,'kd=',f6.2/
     *2x,'Коэффициент утечек',16x,'mut=',f6.2//)

      eps = png/pvs
      dpvs=2.66*0.3/((pvs*1.E6)**0.25)
      dpng=2.66*0.7/((png*1.E6)**0.25)
C  Вместо десятки в степени есть более разумная форма записи
      pdvs=(1.-dpvs)*pvs
      pdng=(1.+dpng)*png
      deps=pdng/pdvs
      tng=tvs*(deps* *((k-1. )/k))
      kt=1.-0.01*(deps-1.)
      nc=0.92*k
      np=0.95*nc
      k0=1.-am*(deps**(1./np)-1.)
      ksum=kt * k0 * kd
      vn=mut*pr/ksum
      f=2. *vn/ccp
      d=sqrt(4.*f/pi)
      d=d*10.
      if(d.le.1.) d=okdol(d)
      if(d.gt.1.) d=okpol(d)
      s=4.*vn/(pi*d*d*n)
C  Вместо квадрата d лучше его самого на себя умножить
      s=s*10.
      s=okpol(s)
      dccp=2.*s*n
      df=2.*vn/dccp
      dd=sqrt(4.*df/pi)
      dd=dd*10.
         if(dd.le.1.) dd=okdol(dd)
      if(dd.gt.1) dd=okpol(dd)
      dvn=pi*dd*dd*S*n/4.
C  А тут вообще была жесть - dd в степени 2. , т.е. в дробной степени!
      dpr=ksum*dvn/mut
      write (13, 4) eps, deps, pdvs, pdng, tng, kt, k0, ksum,
     *deep, s, dd, df, dvn, dpr
    4 format(/20x,'РЕЗУЛЬТАТЫ РАСЧЕТА'//
     *2x,'Отношение давлений',16x,'eps=',e10.5/
     *2x,'Отношение давлений с'/
     *5x,'учетом потерь',17x,'deps=',e10.5/
     *2x,'Давление всасывания с'/
     *5x,'учетом потерь',17x,'pdvs=',e10.5,1x,'МПА'/
     *2x,'Давление нагнетания с'/
     *5x,'учётом потерь',17x,'pdng=',e10.5,1x, 'МПА'/
     *2x,'Температура нагнетания',12x,'tng=',e10.5,1x,'К'/
     *2x,'Температурный коэффициент',10x,'kt=',e10.5/
     *2x,'Объемный коэффициент',15x,'кО=',e10.5/
     *2x,'Коэффициент наполнения',11x,'ksum=',e10.5/
     *2x,'Уточненное значение'/
     *5x,'скорости поршня',15x,'deep=',e10.5,1x,'м/с'/
     *2x,'Ход поршня',26x,'s=',e10.5,1x,'м'/
     *2x,'Уточненный диаметр цилиндра',8x,'dd=',e10.5,1x, 'м' /
     *2x,'Уточненное значение'/
     *5x,'площади поршня',18x,'df=',e10.5,1x,'м**2' /
     *2x,'Уточненная теоретическая'/
     *5x,'производительность'13x,'dvn=', e10.5,1x, 'м**3/с' /
     *2x,'Уточненная действительная'/
     *5x,'производительность',13x,'dpr=',e10.5,1x, 'м**3/с' )

      close(13)
      stop
      end

      function okpol(y)
      real y,tmp
      y=y*10.
      tmp=aint(y)
      if((y-tmp).ge.0.5) tmp=tmp+1.      
      okpol=tmp/100.
      return 
      end

      function okdol(x)
      real x,tmp
      x=x*100.
      tmp=aint(x)
      if((x-tmp).ge.0.5) tmp=tmp+1.
      okdol=tmp/1000. 
      return
      end


ЗЫ: Почему компилятор не ругается на переменные, которые не описаны? Фортран всегда был в этом отношении либерален и имел неявное описание переменных. Т.е. переменные, которые начинались с определенных букв (вроде от i до p), компилятором воспринимались как целые, переменные с буквы d - дробные двойной точности, еще с какой-то (не помню) - комплексные, остальные - дробные. Эти условности работают до сих пор. Чтобы их отключить, надо использовать директиву implicit none (работает на всех компиляторах Фортрана90 и старше, а также на большинстве компиляторов Фортрана77).

Теперь - на счет компиляции. Надо посмотреть как следует в справке про ключики, с которыми запускается g95. Получившийся файл .о - это объектный файл, который еще требуется отлинковать в ЕХЕ. Предположим, что программа записана в файл proga.f, тогда для прямого компилирования в ЕХЕ надо запустить g95 примерно таким образом:

g95 proga.f -o proga

Смысл: компилятору g95 указывают на фортрановский файл proga.f, а ключик -o говорит о том, то полученный файл будет иметь имя proga.exe (если имя не указано, ЕХЕ-файл получит дефолтное имя a.exe)

Это сообщение отредактировал(а) FatalError - 15.11.2007, 00:13
PM MAIL   Вверх
dusnur
Дата 15.11.2007, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



FatalError
Код
* status = 'append' , form = 'formatted')
                 1
error: invalid value for tag 'STATUS' at (1)

if (d.le.1.) d = okdo1(d)
Funktion 'okdo1' at (1) has no implicit type


вот что получается опять.

спасибо

P.S. естественно твой метод чтения из файла хороший. но вот что дал препод то и приходиться решать. спасибо.
давай по твоему методу получим ответы и всё. буду очень благодарен


Это сообщение отредактировал(а) dusnur - 15.11.2007, 20:13
PM MAIL   Вверх
dusnur
Дата 15.11.2007, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



помогите пожалуйста доделать задание smile 
PM MAIL   Вверх
FatalError
Дата 15.11.2007, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.4.2006

Репутация: нет
Всего: 1



Ну да, я писал в комментариях, что status = 'append' - вещь нестандартная, и не все компиляторы понимают. Вот и g95 не понял (я с ним эту фишку проделать не пытался). Значит, открываем файл один раз на чтение и запись, и при записи выводимой инфы все содержание файла сотрется. Это, в принципе, не страшно, поскольку исходные данные будут записаны заново, да еще и с пояснениями.

На счет ругани компилятора про "Funktion 'okdo1' at (1) has no implicit type" - это на счет того, что не оговорили тип возвращаемого функцией результата. В описании функции должно было быть real function, и у okpol - тоже. Да, и опять там единичка вылезла в названии 'okdo1'!

В общем, с поправками будет так:

Код

      program kompressor
      implicit none

C  Директива implicit none запрещает использовать переменные, которые
C  не описаны явным образом (в Фортране можно переменные не описывать).
C  Это хорошее средство отлавливания опечаток и "диверсий" вроде тех,
C  которые здесь были устроены.

C  (ну а строчка, начинающаяся с C - это комментарий)

      real pvs, png, tvs, k, pr, ccp, n, am, kd, mut, k0, deps, kt
      real eps, pi, dpvs, dpng, pdvs, pdng, deps, tng, nc, np, ksum
      real vn, f, d, s, dccp, df, dd, dpr
      parameter (pi = 3.14159) 

      open (12, file = 'data.txt', status = 'old', form = 'formatted')

C  Мы открыли файл data.txt на чтение и запись (по умолчанию) 
C  и присвоили ему номерок 12.

      read(12,*) pvs
      read(12,*) png
      read(12,*) tvs
      read(12,*) k
      read(12,*) pr
      read(12,*) ccp
      read(12,*) n
      read(12,*) am
      read(12,*) kd
      read(12,*) mut
      read(12,*) k0
      read(12,*) deps
      read(12,*) kt

      write (unit = 12, fmt = 2) pvs, png, tvs, k, pr, ccp, n, am, kd, mut

C  Мы пишем все в исходный файл (кстати, в моем предыдущем 
C  варианте была ошибка - не тот номерок файла!)

    2 format(20x, 'Исходные данные'//
     *2x,'Давление всасывания',15x,'pvs=',f7.3,1x,'МПА'/
     *2x,'Давление нагнетания',15x,'png=',f7.3,1x,'МПА'/
     *2x,'Температура всасывания',12x,'tvs=',f5.1,3x,'К'/
     *2x,'Показатель адиабаты',17x,'k=',f7.3/
     *2x,'Производительность компрессора',5x,'pr=',f7.3,1x,'м*3/c'/
     *2x,'Средняя скорость поршня',11x,'ccp=',f7.3,1x,'м/с'/
     *2x,'Частота вращения вала',15x,'n=',f6.2,2x,'1/c'/
     *2x,'Относительное мертвое простран-'/
     *2x,'ство',31x,'am=',f6.2/
     *2x,'Коэффициент давления',15x,'kd=',f6.2/
     *2x,'Коэффициент утечек',16x,'mut=',f6.2//)

      eps = png/pvs
      dpvs=2.66*0.3/((pvs*1.E6)**0.25)
      dpng=2.66*0.7/((png*1.E6)**0.25)
      pdvs=(1.-dpvs)*pvs
      pdng=(1.+dpng)*png
      deps=pdng/pdvs
      tng=tvs*(deps* *((k-1. )/k))
      kt=1.-0.01*(deps-1.)
      nc=0.92*k
      np=0.95*nc
      k0=1.-am*(deps**(1./np)-1.)
      ksum=kt * k0 * kd
      vn=mut*pr/ksum
      f=2. *vn/ccp
      d=sqrt(4.*f/pi)
      d=d*10.
      if(d.le.1.) d=okdol(d)
      if(d.gt.1.) d=okpol(d)
      s=4.*vn/(pi*d*d*n)
      s=s*10.
      s=okpol(s)
      dccp=2.*s*n
      df=2.*vn/dccp
      dd=sqrt(4.*df/pi)
      dd=dd*10.
         if(dd.le.1.) dd=okdol(dd)
      if(dd.gt.1) dd=okpol(dd)
      dvn=pi*dd*dd*S*n/4.
      dpr=ksum*dvn/mut
      write (12, 4) eps, deps, pdvs, pdng, tng, kt, k0, ksum,
     *deep, s, dd, df, dvn, dpr
    4 format(/20x,'РЕЗУЛЬТАТЫ РАСЧЕТА'//
     *2x,'Отношение давлений',16x,'eps=',e10.5/
     *2x,'Отношение давлений с'/
     *5x,'учетом потерь',17x,'deps=',e10.5/
     *2x,'Давление всасывания с'/
     *5x,'учетом потерь',17x,'pdvs=',e10.5,1x,'МПА'/
     *2x,'Давление нагнетания с'/
     *5x,'учётом потерь',17x,'pdng=',e10.5,1x, 'МПА'/
     *2x,'Температура нагнетания',12x,'tng=',e10.5,1x,'К'/
     *2x,'Температурный коэффициент',10x,'kt=',e10.5/
     *2x,'Объемный коэффициент',15x,'кО=',e10.5/
     *2x,'Коэффициент наполнения',11x,'ksum=',e10.5/
     *2x,'Уточненное значение'/
     *5x,'скорости поршня',15x,'deep=',e10.5,1x,'м/с'/
     *2x,'Ход поршня',26x,'s=',e10.5,1x,'м'/
     *2x,'Уточненный диаметр цилиндра',8x,'dd=',e10.5,1x, 'м' /
     *2x,'Уточненное значение'/
     *5x,'площади поршня',18x,'df=',e10.5,1x,'м**2' /
     *2x,'Уточненная теоретическая'/
     *5x,'производительность'13x,'dvn=', e10.5,1x, 'м**3/с' /
     *2x,'Уточненная действительная'/
     *5x,'производительность',13x,'dpr=',e10.5,1x, 'м**3/с' )

      close(12)
      stop
      end

      real function okpol(y)
      real y,tmp
      y=y*10.
      tmp=aint(y)
      if((y-tmp).ge.0.5) tmp=tmp+1.      
      okpol=tmp/100.
      return 
      end

      real function okdol(x)
      real x,tmp
      x=x*100.
      tmp=aint(x)
      if((x-tmp).ge.0.5) tmp=tmp+1.
      okdol=tmp/1000. 
      return
      end

Все! Вроде все путем! Никаких единичек в названиях функций нигде нет! Нужно нажать на кнопочку "выделить все" на рамке вокруг кода, потом скопировать, записать в файл, и это вроде бы должно скомпилироваться.
PM MAIL   Вверх
dusnur
Дата 15.11.2007, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



FatalError
ну опять
Код
if (d.le.1.) d = okdol(d)
Funktion 'okdol' at (1) has no implicit type

:(
PM MAIL   Вверх
FatalError
Дата 15.11.2007, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.4.2006

Репутация: нет
Всего: 1



В общем, так. Я тут попытался сам откомпилировать, но не на g95, a на предыдущей версии, g77 (g95 у меня на компе не настроен как надо). Тоже полезли непонятки с этими функциями, я их переделал в подпрограммы, чтобы компилятор мозги не ломал.  И еще были какие-то дурацкие придирки к описанию формата ввода-вывода, я так и не понял, из-за чего, я немного переписал эти форматы, и все прошло нормально. Короче, я запихал окончательный вариант программы вместе с ЕХЕ-файлом в архив (25 КБ) и кинул на файлообменник:

http://files.filefront.com/kompressorzip/;...;/fileinfo.html
PM MAIL   Вверх
dusnur
Дата 15.11.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



FatalError, скачал. в папке создал data.txt. сделал его только для чтения. запускаю exe. он запускается и всё. далее ничего не происходит. 
я что-то делаю не так7

Это сообщение отредактировал(а) dusnur - 15.11.2007, 23:00
PM MAIL   Вверх
FatalError
Дата 16.11.2007, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.4.2006

Репутация: нет
Всего: 1



Фишка в том, что программа написана так, что она на экран ничего не выводит и все пишет в файл. Может, оно и не очень хорошо. Можно переделать, чтобы дублировался вывод в файл и на экран.

Ну ладно, по поводу того варианта, что есть. Он должен считать исходные данные из файла data.txt, а потом в него же записать результаты расчетов. Так что data.txt не может быть только для чтения! 

Ну, про исходные данные я уже говорил: они должны быть записаны в data.txt в столбик, каждое с новой строки, всего 13 штук.

Программу лучше запускать в сеансе DOS, тогда в консольном окне будут видны сообщения программы об ошибках (если они вдруг будут), типа: файл не найден, не могу открыть файл для записи, и т.п. А так они все теряются.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.0884 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.