找回密码
 注册
Simdroid-非首页
查看: 236|回复: 8

[3. Fortran] function能否将数组作为输出?

[复制链接]
发表于 2005-5-13 08:57:42 | 显示全部楼层 |阅读模式 来自 江苏南京
手头没什么fortran的书,想问一下fortran中的function能否将
一个一维(或高维)数组作为输出,
谢谢.
偶编了一个小程序做一维数组与二维数组的乘法,好像不行
PROGRAM PQ
IMPLICIT NONE
REAL(KIND=8),EXTERNAL::MATVEC
INTEGER:: I,J,N
REAL(KIND=8)::B(3),C(3),A(3,3),D(3)
DATA A /1,2,3,4,5,6,7,8,9/
!A(3,3)=(/1,2,3,4,5,6,7,8,9/)
B=1.0
N=3
D=MATVEC(3,A,B,C)
WRITE(*,*)D
END PROGRAM PQ

FUNCTION MATVEC(N,M,X,TT)
IMPLICIT NONE
INTEGER::N,I,J
REAL(KIND=8)::M(N,N),X(N),MATVEC(N),TEMP,TT(N)
DO I=1,N,1
  TEMP=0.0
  DO J=1,N,1
    TEMP=TEMP+M(I,J)*X(J)
  ENDDO
  TT( I )=TEMP
  WRITE(*,*)TEMP
ENDDO
RETURN
END FUNCTION MATVEC

另外:
fortran中real(kind=8)::a
可以使a具有15位有效数字,如何再提高有效位数?
谢谢,只是想了解一下。
比如kind=20如何定义?
发表于 2005-5-13 09:36:17 | 显示全部楼层 来自 江苏南京

Re:function能否将数组作为输出?

Simdroid开发平台
我学的是FORTRAN 77,下面是我对楼主的程序作的一些修改,应该可以得到楼主要的东西
PROGRAM PQ
IMPLICIT NONE
REAL(KIND=8),EXTERNAL::MATVEC
INTEGER::I,J,N
REAL(KIND=8)::B(3),C(3),A(3,3),D(3)
DATA A /1,2,3,4,5,6,7,8,9/
!A(3,3)=(/1,2,3,4,5,6,7,8,9/)
B=1.0
N=3
D=MATVEC(3,A,B,C)
WRITE(*,*)D---------->D中的值应该相同,因为FUNCTION函数只能输出单值,要想输出数组可用类似于SUBROUTINE的方法,在其参数中设数组输出,如下:
WRITE(*,*)c------>C即可输出你要的值

END PROGRAM PQ

FUNCTION MATVEC(N,M,X,TT)
IMPLICIT NONE
INTEGER::N,I,J
REAL(KIND=8)::M(N,N),X(N),MATVEC,TEMP,TT(N) --->个人以为不可在MATVEC上加(N)
DO I=1,N,1
  TEMP=0.0
  DO J=1,N,1
    TEMP=TEMP+M(I,J)*X(J)
  ENDDO
  TT(I)=TEMP
  WRITE(*,*)TEMP
matvec=temp------------->function函数的值一定要给,否则 会有警告信息
ENDDO
RETURN
END FUNCTION MATVEC
发表于 2005-5-13 10:32:13 | 显示全部楼层 来自 日本

Re:function能否将数组作为输出?

一个一维(或高维)数组作为输出 => Generally imposible. But maybe realization by returning a pointer to array. (Just guess!)

可以使a具有15位有效数字,如何再提高有效位数 => Fortran standard function SELECTED_REAL_KIND and SELECTED_INT_KIND can detect those machine dependent value.
发表于 2005-5-13 16:42:33 | 显示全部楼层 来自 陕西西安

Re:function能否将数组作为输出?

根据fortran90的标准使用interface可以达到楼主的目的.
interface
  function matvec(n,m,x,tt)
  implicit none
  integer n
  real(kind=8) m( n,n ),x( n ) ,tt( n )
  real(kind=8) matvec( n )       ---->可以是任意精度和维数
  end function
end interface
不妨一试!

评分

1

查看全部评分

发表于 2005-5-13 18:24:44 | 显示全部楼层 来自 日本

Re:function能否将数组作为输出?

根据fortran90的标准使用interface可以达到楼主的目的 =>Oh! Oh! Oh! It would be much appreciated that you can tell me whick item of Fortran standard tell you about this????!!!!!!
It's wondelful that Fortran can return an structure that even C cannot (C++ can). In a handbook of C, that tells that "functions may not return arrays or functions. However, they may return poiters to arrays or functions". That's why I guess Fortran may doing so also, but it is questionable.
发表于 2005-5-13 20:41:04 | 显示全部楼层 来自 江苏南京

Re:function能否将数组作为输出?

看来我得更新知识了,FORTRAN在日新月异,可我还在抱残守旧啊
发表于 2005-5-14 11:55:03 | 显示全部楼层 来自 日本

Re:function能否将数组作为输出?

I have looked up the Fortran standard myself and should say sorry for my above wrong answer. It seems that I was too self-confidient to give an answer with no reference.
The anwser is Fortran can return an array explicitly with no help of pointer. The following program gives an example.

   PROGRAM test
      REAL, DIMENSION( 3 )  :: a = (/ 1., 2., 3./),       &
                            b = (/ 2., 2., 2. /),  r
      r = f(a, b)
      PRINT *, r
   CONTAINS
      FUNCTION f(c, d)
      REAL, DIMENSION( : ) :: c, d
      REAL, DIMENSION(SIZE ( c )) :: f
      f = c*d      
      END FUNCTION f
   END PROGRAM test

A more free style of function defintion is using result, like
     FUNCTION f(c, d) RESULT( d )
     REAL, DIMENSION(SIZE  ( c ) )  :: d

评分

1

查看全部评分

 楼主| 发表于 2005-5-15 10:02:59 | 显示全部楼层 来自 江苏南京

Re:function能否将数组作为输出?

谢谢楼上几位的回复,学到了不少东西,,
偶试试大家的方法。
 楼主| 发表于 2005-5-17 09:33:44 | 显示全部楼层 来自 江苏南京

Re:function能否将数组作为输出?

jinguangyang wrote:
根据fortran90的标准使用interface可以达到楼主的目的.
interface
  function matvec(n,m,x,tt)
  implicit none
  integer n
  real(kind=8) m( n,n ),x( n ) ,tt( n )
  real(kind=8) matvec( n )       ---->可以是任意精度和维数
  end function
end interface
不妨一试!

仔细找到了有关INTERFACE 的用法,可行,
谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-2 01:23 , Processed in 0.060591 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表