2

这是我最近想知道的,主要是出于好奇。我有心情学习一些旧的编码风格,而 FORTRAN 似乎是一个不错的起点。

我想我应该通过提供一个好的起点来帮助你们。
那么这个 C 程序如何用 FORTRAN 编写呢?

int foo ( int x , int y )
{
    int tempX = x ;
    x += y / 2 ;
    y -= tempX * 3 ;    // tempX holds x's original value.
    return x * y ;
}

我知道整个函数可能是一行:

return ( x + ( y / 2 ) ) * ( y - ( x * 3 ) ) ;

但我问这个问题的目的是看看这四个语句将如何在 FORTRAN 中单独编写,而不是必然组合成一个语句。

4

6 回答 6

7

不要怪我——你说的是旧的编码风格:

C234567
      SUBROUTINE FOO(I,J,K)
C SAVE THE ORIGINAL VALUES
      IORIG = I
      JORIG = J
C PERFORM THE COMPUTATION
      I = I + J/2
      J = J - IORIG*3
      K = I * J
C RESTORE VALUES
      I = IORIG
      J = JORIG
      END SUBROUTINE FOO

我在写这篇文章时不寒而栗,但是

  • 所有变量都是隐式整数,因为它们以 I 和 N 之间的字母开头
  • FORTRAN 通过引用传递,因此重置IJ在最后给出与原始函数相同的效果(即按值传递,因此xy调用例程中未更改)
  • 注释从第 1 列开始,实际语句从第 7 列开始

拜托,拜托,请不要写这样的新代码,除非是开玩笑。

于 2009-07-03T22:13:30.537 回答
2

请参阅函数和子例程

INTEGER FUNCTION foo(i, j)
...
foo = 42
END

然后稍后:

k = foo(1, 2)
于 2009-07-03T18:31:07.113 回答
2

您的函数在 Fortran 中可能如下所示

 integer function foo(m, n)
 integer i

 i = m
 m = m + n/2
 n = n - i*3
 foo = m*n

 end function foo

您应该能够开始学习有关 Fortran 的任何教程。这样的事情可能会有所帮助http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/fortran.html

干杯

于 2009-07-03T18:36:58.043 回答
1

你从哪里学习 FORTRAN?看看维基书吧

源自示例,我会说:

function func(x, y) result(r)
   integer, intent(in) :: x, y 
   integer             :: r 
   integer             :: tempX
   tempX = x
   x = x / 2
   y = y - tempX * 3
   r = x * y
end function foo
于 2009-07-03T18:35:51.383 回答
1

与上面类似,但有一个主程序来说明如何调用它。

C2345678
       program testfoo
         implicit none   
         integer r, foo 
         r = foo(4,5)
         print *, 'result = ', r
       end

       integer function foo(x,y)
         integer x, y
         integer tx, ty
         tx = x + y / 2
         ty = y - x * 3
         foo = tx * ty
         return
       end

请注意,这是 Fortran 77,这是我 23 年前学到的。

于 2009-07-09T16:16:14.900 回答
0

将规则 IJKLMN 应用于整数的真正旧式风格

C2345678
      FUNCTION IFOO(I,J)
      II = I + J/2
      JJ = J - I*3
      IFOO = II*JJ
      END
于 2016-04-29T09:01:57.257 回答