2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 фортран функцию вызывают одним названием, без параметров
Сообщение11.04.2016, 17:06 
Аватара пользователя


08/08/14

991
Москва
Приходится разбирать один исходник, фортран я читаю "со словарем".
Вызвал непонимание следующий кусок:
есть функция с параметрами, но она вызывается просто по имени, параметры не указываются.

Код:
      cc=OIN(f(i),f(i+1),1.e-3,FLIN)
......
FUNCTION FLIN (X0)
      REAL X(101),Y(100)
      COMMON N,X,Y
      DO 1 I=1,N
      IF (X0.GE.X(i).AND.X0.LT.X(i+1)) GOTO 3
      GOTO 1
  3   FLIN=Y(I)
      GOTO 4
  1   CONTINUE
  4   RETURN
      END

а как же с X0? откуда берется его значение?

 Профиль  
                  
 
 Re: фортран функцию вызывают одним названием, без параметров
Сообщение11.04.2016, 17:11 
Заслуженный участник


09/05/12
25179
levtsn в сообщении #1114142 писал(а):
есть функция с параметрами, но она вызывается просто по имени, параметры не указываются.
Это не вызов, а передача имени функции как параметра. В более, наверное, привычных терминах - передача указателя на функцию как аргумента для другой функции.

 Профиль  
                  
 
 Re: фортран функцию вызывают одним названием, без параметров
Сообщение11.04.2016, 17:32 
Заслуженный участник
Аватара пользователя


04/09/14
5003
ФТИ им. Иоффе СПб
levtsn в сообщении #1114142 писал(а):
есть функция с параметрами, но она вызывается просто по имени
То, что написано - это описание функции. Ей передаются четыре параметра -
Код:
N,X,Y
- через Common- блок, и
Код:
X0
как параметр функции. Строка
Код:
3   FLIN=Y(I)
возвращает значение функции. Весь код - описание функции, а не "передача имени функции как параметра". Это в Фортране по-другому делается. Вызывается эта функция где-то в другом месте.

 Профиль  
                  
 
 Re: фортран функцию вызывают одним названием, без параметров
Сообщение11.04.2016, 17:40 
Аватара пользователя


08/08/14

991
Москва
Тогда, получается вот такой кусок:
(комментарии СИ это мои вопросы к коду.)
Код:

cc=OIN(f(i),f(i+1),1.e-3,FLIN)

c********************************************************
      FUNCTION FLIN (X0)
      REAL X(101),Y(100) /*это берется откуда то извне?*/
      COMMON N,X,Y
      DO 1 I=1,N
      IF (X0.GE.X(i).AND.X0.LT.X(i+1)) GOTO 3 /*как я понял: если X0 больше X(i) и Х(i+1) то вернуть Y(i) */
      GOTO 1
  3   FLIN=Y(I)
      GOTO 4
  1   CONTINUE
  4   RETURN
      END
c****************************************************
      FUNCTION OIN (A,B,EPS,F)
      N=1
    1 OIN=0
        if (n.GT.512) goto 5
      DL=(B-A)/N
      DO 2 I=1,N
      X1=A+(I-1)*DL
      X2=X1+DL
    2 OIN=OIN+0.5*(F(X1)+F(X2))*DL
      s=oin
      IF(N-1) 3,3,4
  3      N=N*2
      GO TO 1
   4    if(abs(s).le.1.e-6) goto 3
      EPS1=ABS((OIN-S)/OIN)
      IF(EPS1.LE.EPS) GO TO 5
      GOTO 3
   5   RETURN
      END

 Профиль  
                  
 
 Re: фортран функцию вызывают одним названием, без параметров
Сообщение11.04.2016, 17:56 
Заслуженный участник


09/05/12
25179
levtsn в сообщении #1114152 писал(а):
Используется синтаксис Fortran
 REAL X(101),Y(100) /*это берется откуда то извне?*/
   COMMON N,X,Y
Это содержимое т.н. COMMON-блока. Опять-таки для простоты можете считать, что это объявление глобальных переменных, через которые в функцию передается часть данных.
levtsn в сообщении #1114152 писал(а):
Используется синтаксис Fortran
IF (X0.GE.X(i).AND.X0.LT.X(i+1)) GOTO 3 /*как я понял: если X0 больше X(i) и Х(i+1) то вернуть Y(i) */

... и закончить цикл. Т.е. ищется первый индекс i такой, что выполняется это условие, и для него возвращается Y(i).

 Профиль  
                  
 
 Re: фортран функцию вызывают одним названием, без параметров
Сообщение11.04.2016, 18:02 
Аватара пользователя


08/08/14

991
Москва
Pphantom в сообщении #1114158 писал(а):
levtsn в сообщении #1114152 писал(а):
Используется синтаксис Fortran
 REAL X(101),Y(100) /*это берется откуда то извне?*/
   COMMON N,X,Y
Это содержимое т.н. COMMON-блока. Опять-таки для простоты можете считать, что это объявление глобальных переменных, через которые в функцию передается часть данных.
levtsn в сообщении #1114152 писал(а):
Используется синтаксис Fortran
IF (X0.GE.X(i).AND.X0.LT.X(i+1)) GOTO 3 /*как я понял: если X0 больше X(i) и Х(i+1) то вернуть Y(i) */

... и закончить цикл. Т.е. ищется первый индекс i такой, что выполняется это условие, и для него возвращается Y(i).

То есть где то выше (в теле основной программы?) заданы N, X(101) и Y(100)?
А в подпрограмме просто используются уже ранее объявленные переменные с какими то сформировавшимися значениями?

 Профиль  
                  
 
 Re: фортран функцию вызывают одним названием, без параметров
Сообщение11.04.2016, 18:17 
Заслуженный участник


09/05/12
25179
levtsn в сообщении #1114160 писал(а):
То есть где то выше (в теле основной программы?) заданы N, X(101) и Y(100)?
А в подпрограмме просто используются уже ранее объявленные переменные с какими то сформировавшимися значениями?
Именно.

 Профиль  
                  
 
 Re: фортран функцию вызывают одним названием, без параметров
Сообщение11.04.2016, 20:14 
Заслуженный участник
Аватара пользователя


04/09/14
5003
ФТИ им. Иоффе СПб
levtsn в сообщении #1114152 писал(а):
если X0 больше X(i)
Если занудствовать, то "больше или равно". Больше -
Код:
.GT.

 Профиль  
                  
 
 Re: фортран функцию вызывают одним названием, без параметров
Сообщение11.04.2016, 20:19 
Заслуженный участник


09/05/12
25179
amon в сообщении #1114230 писал(а):
Если занудствовать, то "больше или равно".
Тогда уж все писать. :-) Условие выглядит так: "если $X0 \geqslant X(i)$ и $X0<X(i+1)$".

 Профиль  
                  
 
 
Сообщение12.04.2016, 12:24 
Аватара пользователя


08/08/14

991
Москва
Откуда он берет X(101), Y(100)?
Код:
  FUNCTION FLIN (X0)
      REAL X(101),Y(100)
      COMMON N,X,Y
      DO 1 I=1,N
      IF (X0.GE.X(i).AND.X0.LT.X(i+1)) GOTO 3
      GOTO 1
  3   FLIN=Y(I)
      GOTO 4
  1   CONTINUE
  4   RETURN
      END


Обыскал весь исходник не нашел:

код: [ скачать ] [ спрятать ]
Используется синтаксис Fortran
C  Programma vychisleniia udarnogo spektra dlia vosproizvedeniia
C  VUP v tcekhe  7
      REAL eps,Ap,FZ(101),DIS(100),f(101),fc(100),gam1(100),SHy(100),
     &Sy(100),SpN(100)
C   eps -- postoiannaia raspredeleniia tcentralnykh chastot polosovykh
C         filtrov apparatury vosproizvedeniia VUP ( Dlia 1/3 oktavnykh
C         polos eps=0.23)  0.13 dlia tc. 7
C   N -- poriadok polosovogo filtra apparatury  vosproizvedeniia VUP
C   M -- chislo polos polosovogo  filtra apparatury  vosproizvedeniia VUP
C   f(M+1) --  granitcy chastot (Gtc) polosovykh filtrov apparatury
C   vosproizvedeniia VUP
C   Ap,ed.g -- maksimalnoe znachenie VUP,ukazannoe v normiruiushchem dokumente
C   K -- chislo polos spektra zadaniia VUP
C   FZ(K+1),Gtc -- chastoty zadaniia spektra  VUP
C   DIS(K)  -- massiv dispersii (%) spektra zadaniia VUP
      COMMON K,FZ,SPN
      EXTERNAL FLIN
      data M/31/,f/1.76,2.22,2.80,3.53,4.45,5.60,7.06,8.90,11.20,14.13,
     & 17.8,22.3,28.06,35.6,45,55,70,90,113,141,181,
     %226,282,356,450,565,710,900,1130,1415,1800,2260,69*0/,
     
     &fc/2.0,2.5,3.1,4.0,5.0,6.3,7.9,10.0,12.6,15.9,
     &20,25,31.5,40,50,63,80,100,125,160,200,250,315,400,500,
     &630,800,1000,1250,1600,2000,69*0/
     
      open(unit=1,status='unknown',file='rezult')
C******************************************************************
 801  write (*,*) '  Vvedite velichinu EPS , gde  eps -- postoiannaia
     &               raspredeleniia tcentralnykh chastot polosovykh
     &               filtrov apparatury vosproizvedeniia VUP
     &               ( Dlia 1/3 oktavnykh polos vvedite eps=0.23,
     &               0.13 DLIa Tc 7)'

      read (*,*,err=802) eps
      goto 201
 802  write (*,*) ' Vy oshiblis !'
         goto 801

C  *****************
 201     write(*,*) '  Vvedite Ap maksimalnoe znach-ie VUP po norme'
      N=4
      read (*,*,err=202) Ap
      goto 203
 202  write (*,*) ' Vy oshiblis!  '
         goto 201
c  ****************
 203    write (*,*) ' Vvedite K norme'
      read (*,*,err=204) K
      goto 205
 204  write (*,*) ' Vy oshiblis!  '
        goto 203
c   ***************
205   write (*,*) ' Vvedite massiv chastot FZ'
      fz(1)=0.
      do 1111 i=1,K+1
 207       write(*,2222) I
2222   format ('  FZ(',i2,')= ',$)
      read(*,*,err=206) FZ(I+1)
      goto 33
 206  write (*,*) ' Vy oshiblis! Vvedite zanovo '
      goto 207
  33  if (i.eq.1) goto 1111
      if (FZ(I+1).gt.0.and.FZ(I+1).gt.FZ(I)) goto 1111
      write (*,700) i,i-1
 700  format('  Vy oshiblis ! U Vas FZ(',i2,') menshe, chem FZ(',i2,')
     & !'
/' Proverte iskhodnye dannye.  Vvedite zanovo')
      goto207
 1111 CONTINUE
c   ****************************
      fz(k+3)=2500.
 2003 write (*,*) ' ‚¢¥¤¨â¥ massiv DIS(%)  dlia normy VUP -- K shtuk'
      DIS(1)=0.
      do 53 i=1,K
 212      write(*,444) I
 444   format ('   DIS(',i2,')= ',$)
      read(*,*,err=210) DIS(I+1)
      goto 53
 210  write (*,*) ' Vy oshiblis ! Vvedite zanovo'
          goto 212
  53  continue
      DIS(k+2)=0.
      k=k+2
C   PROVERKA PRAVILNOSTI VVODA MASSIVA DIS
      SUMD=0.
      DO 2000 I=1,K
 2000 SUMD=SUMD+DIS(I)
      IF (ABS(SUMD-100.).LT.5.E-1) GOTO 2001
      WRITE (*,*) '  Vy oshiblis u Vas summapnaia dispepsiia ne 100 '
      write (*,*) '  *******   Vvedite zanovo i ppavilno ! ****'
      k=k-2
      goto  2003

c   ****************************
 2001      write (1,*) '   Iskhodnye dannye'
           write (1,*) ' *******************'
           write(1,2010) AP,eps,K-2
 2010 format (2x,'** Ap= ',f7.2,' ** EPS= ',f5.3,'  ** K= ',i2,/)
      write(1,2007)
 2007 format ('    FZ(I) - FZ(I+1)  ','    DIS')
      write (1,2008)
 2008 format ('  ------------------------------  ')
      do 2005 i=2,k-1
 2005 write (1,2006) fz(I),fz(I+1),dis(I)
 2006 format (2x,f7.1,' - ',f7.1,3x,f7.2)
      write (1,2011)
 2011 format (////,'             REZULTATY  RASChETA',/)
C
      write(*,123)
 123  format(
     *'       **************************************'/
     *'       *                                    *'/
     *'       *        Zhdite idet schet!!!        *'/
     *'       *                                    *'/
     *'       **************************************')

C   **  Vych-ie norm. spektralnoi plotnosti, zadavaemogo VUP
      DO 3 i=1,K
  3   SpN(i)=DIS(i)/100./(FZ(I+1)-FZ(I))
C1  Vychislenie koeffitcientov gamma1(i) dlia kazhdogo chastotnogo poddiapazona
C  filtrov apparatury vos-iia VUP
C**      write (1,*) '    i      f(i)        f(i+1)      fc(i)      cc   '

       DO 2 i=1,M

C      flintemp = FLIN    (1)
C      print * , flintemp
      cc=OIN(f(i),f(i+1),1.e-3,0)
C      cc=OIN(f(i),f(i+1),1.e-3,FLIN)

      gam1(i)=sqrt(cc/(f(i+1)-f(i)))

 3330     format (2x,i3,4(2x,e11.5))
 2    continue
C2   Paschet maks. znachenii otnositelnogo udarnogo spektra

      DO 4 i=1,M
      SHy(i)=gam1(i)*f(i+1)

 3334     format (2x,i3,2(2x,e11.5))
   4  continue
C3    Vybor maksimalnogo SHy0
      Nmax=1
      SHmax=SHy(1)
      DO 20 i=2,M
      IF (SHmax.GE.SHy(i)) goto 20
      Nmax=i
      SHmax=SHy(i)
  20  CONTINUE

C   ** Opr-ie absoliutnogo znacheniia udarnogo spektra
      Sy0=3.141593/SQRT(2.*eps/N)*Ap

C4  Opr-em znacheniia udarnogo spektra na drugikh chastotakh
       write (1,900)
 900   format (3x,43('-'))
       write (1,901)
 901   format (3x,'| i : f(i)  : f(i+1) : fc(i),Gtc :  Sy(i)  |')
       write (1,900)
       DO 5 i=1,M
       Sy(i)=fc(i)/fc(Nmax)*gam1(i)/gam1(Nmax)*Sy0
       write (1,30) i,f(i),f(i+1),fc(i),Sy(i)
  5    continue
  30   format  (4x,i2,3x,f6.1,3x,f6.1,3x,f6.1,1x,f10.2)
       write (*,*) 'STOP'
       end
c********************************************************
      FUNCTION FLIN (X0)
      REAL X(101),Y(100)
      COMMON N,X,Y
      DO 1 I=1,N
      IF (X0.GE.X(i).AND.X0.LT.X(i+1)) GOTO 3
      GOTO 1
  3   FLIN=Y(I)
      GOTO 4
  1   CONTINUE
  4   RETURN
      END
c****************************************************
      FUNCTION OIN (A,B,EPS,F)
      N=1
    1 OIN=0
        if (n.GT.512) goto 5
      DL=(B-A)/N
      DO 2 I=1,N
      X1=A+(I-1)*DL
      X2=X1+DL
C    2 OIN=OIN
    2 OIN=OIN+0.5*(F(X1)+F(X2))*DL

      s=oin
      IF(N-1) 3,3,4
  3      N=N*2
      GO TO 1
   4    if(abs(s).le.1.e-6) goto 3
      EPS1=ABS((OIN-S)/OIN)
      IF(EPS1.LE.EPS) GO TO 5
      GOTO 3
   5   RETURN
      END

 

 Профиль  
                  
 
 Re: фортран функцию вызывают одним названием, без параметров
Сообщение12.04.2016, 13:27 
Заслуженный участник


09/08/09
3438
С.Петербург
levtsn в сообщении #1114379 писал(а):
Откуда он берет X(101), Y(100)?
В главной программе в неименованном common-блоке размещаются переменные K, FZ(101) и SPN(100):
Код:
    REAL ...,FZ(101), ...,SpN(100)
    ...
    COMMON K,FZ,SPN
Функция FLIN обращается к тем же переменным (областям памяти) в неименованном common-блоке по именам N, X, Y:
Код:
    FUNCTION FLIN (X0)
    REAL X(101),Y(100)
    COMMON N,X,Y
    ...

 Профиль  
                  
 
 Re: фортран функцию вызывают одним названием, без параметров
Сообщение12.04.2016, 17:06 
Заслуженный участник


16/02/13
4105
Владивосток
levtsn в сообщении #1114160 писал(а):
То есть где то выше (в теле основной программы?) заданы N, X(101) и Y(100)?
На всякий случай, возможно, повторюсь: в программе имеется неименованный COMMON-блок. Он один-единственный на всю программу. В каждой единице (программе, подпрограмме, функции) можно задать его «карту». COMMON N,X,Y означает, что в начале блока целое число, потом 201 действительное, к первым 101 из которых мы (внутри функции) будем обращаться по имени X с индексом, к следующим 100 — по имени Y с индексом, к следующим данным обращаться внутре функции FLIN не будем. Все «карты» предполагаются согласованными, хотя никак это не проверяется.

 Профиль  
                  
 
 Re: фортран функцию вызывают одним названием, без параметров
Сообщение12.04.2016, 18:29 
Заслуженный участник


09/05/12
25179
iifat в сообщении #1114424 писал(а):
Все «карты» предполагаются согласованными, хотя никак это не проверяется.
Более того, иногда разная интерпретация содержимого COMMON-блоков в разных процедурах/функциях делалась сознательно, ради своеобразного низкоуровневого преобразования типов.

 Профиль  
                  
 
 Re: фортран функцию вызывают одним названием, без параметров
Сообщение12.04.2016, 18:51 
Заслуженный участник


16/02/13
4105
Владивосток
Ну в общем да. Если очень понимать, что делаешь, можно проделывать страшные вещи с пользой для себя и окружающих :wink:

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group