Fortran Coder

查看: 14368|回复: 8
打印 上一主题 下一主题

[求助] 如何使用function重载运算符运算后返回一个数组

[复制链接]

22

帖子

6

主题

0

精华

入门

StarkLee

F 币
96 元
贡献
52 点
跳转到指定楼层
楼主
发表于 2014-12-6 14:11:11 来自移动端 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RT
求高手指点
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

22

帖子

6

主题

0

精华

入门

StarkLee

F 币
96 元
贡献
52 点
沙发
 楼主| 发表于 2014-12-6 14:37:11 来自移动端 | 只看该作者
补充:数组运算得到数组

100

帖子

0

主题

0

精华

专家

F 币
550 元
贡献
291 点

规矩勋章元老勋章

QQ
板凳
发表于 2014-12-6 16:13:17 | 只看该作者
我这里有一个重载 matmul 的代码,给你当例子吧

[Fortran] 纯文本查看 复制代码
01module matmul_int
02  INTERFACE OPERATOR(.mm.)
03    module procedure fc
04  END INTERFACE
05contains
06  
07  function fc(a,b)
08    real , intent( IN ) :: a(:,:) , b(:,:)
09    real :: fc(size(a,dim=1),size(b,dim=2))
10    fc = matmul(a,b)
11  end function fc
12end module matmul_int
13  
14program main
15  use matmul_int
16  real :: x(3,2) , y(2,4)
17  x = 1 ; y = 2
18  write(*,*) x .mm. y
19end

评分

参与人数 1F 币 +9 贡献 +9 收起 理由
fcode + 9 + 9 赞一个!

查看全部评分

838

帖子

2

主题

0

精华

大宗师

F 币
3937 元
贡献
2339 点
地板
发表于 2014-12-6 19:10:45 | 只看该作者
普通的 + - * / 都是可以运用于数组的。

real a(3,4), b(3,4), c(3,4)
c = a + b

评分

参与人数 1F 币 +9 贡献 +9 收起 理由
fcode + 9 + 9 赞一个!

查看全部评分

22

帖子

6

主题

0

精华

入门

StarkLee

F 币
96 元
贡献
52 点
5#
 楼主| 发表于 2014-12-6 21:41:14 | 只看该作者
本帖最后由 306908677 于 2014-12-7 20:54 编辑
百事可乐 发表于 2014-12-6 16:13
我这里有一个重载 matmul 的代码,给你当例子吧

[Fortran] 纯文本查看 复制代码
01module matmul_int
02[/quote]
03[mw_shl_code=fortran,true]  program main
04  implicit none
05 
06   interface
07        subroutine random_arr(a)
08        implicit none
09        integer(4),intent(out),allocatable ::a(:)
10        end
11   end interface
12 
13   interface operator(.U.)
14        Function addy(c1, c2)
15        implicit none
16        integer, intent(in) :: c1(:), c2(:)
17        integer, intent(out):: addy(20)


错误:
Function addy(c1, c2)
1
错误: (1)处的符号不是一个 DUMMY 变量
/Users/StarkLee/Desktop/EQU2.F90:33.1:

function addy(c1,c2)
1
错误: (1)处的符号不是一个 DUMMY 变量
Jarvis:~ StarkLee$

什么原因啊==

22

帖子

6

主题

0

精华

入门

StarkLee

F 币
96 元
贡献
52 点
6#
 楼主| 发表于 2014-12-7 00:11:45 来自移动端 | 只看该作者
li913 发表于 2014-12-6 19:10
普通的 + - * / 都是可以运用于数组的。

real a(3,4), b(3,4), c(3,4)

嗯嗯,thanx~

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

7#
发表于 2014-12-7 00:31:30 | 只看该作者
照猫画虎还不会?

[Fortran] 纯文本查看 复制代码
01Module S
02  Interface Operator (.U.)
03    Module Procedure Addy
04  End Interface Operator (.U.)
05Contains
06  Function Addy(C1, C2)
07    Implicit None
08    Integer, Intent (In) :: C1(:), C2(:)
09    Integer :: Addy(20)
10    Integer :: Arry1(20), Arry2(20)
11    Integer I, Len
12    Logical :: Flg(20)
13    Len = Size(C1)
14    Arry1 = -1
15    Do I = 1, Len
16      Arry1(C1(I)) = C1(I)
17    End Do
18    Len = Size(C2)
19    Arry2 = -2
20    Do I = 1, Len
21      Arry2(C2(I)) = C2(I)
22    End Do
23    Addy = -3
24    Flg = All(Arry1.Eq.Arry2)
25    Print *, Flg
26    Addy = Merge(Arry1, Addy, Flg)
27  End Function Addy
28End Module S
29Program Main
30  Use S
31  Implicit None
32 
33  Interface
34    Subroutine Random_arr(A)
35      Implicit None
36      Integer (Kind=4), Intent (Out), Allocatable :: A(:)
37    End Subroutine Random_arr
38  End Interface
39 
40 
41  Integer, Allocatable :: A(:)
42  Integer, Allocatable :: B(:)
43  Integer Lena, Lenb
44 
45  Call Init_random_seed()
46  Call Random_arr(A)
47  Call Random_arr(B)
48  Lena = Size(A)
49  Lenb = Size(B)
50  Print *, 'A'
51  Write (*, 10) A
52  Print *, 'B'
53  Write (*, 10) B
54  10 Format (20I3)
55 
56End Program Main

22

帖子

6

主题

0

精华

入门

StarkLee

F 币
96 元
贡献
52 点
8#
 楼主| 发表于 2014-12-7 13:39:08 | 只看该作者
fcode 发表于 2014-12-7 00:31
照猫画虎还不会?

[mw_shl_code=fortran,true]Module S

多谢大家的耐心指点~

仔细看了一遍原来function不能定义为 out~
问题已解决

955

帖子

0

主题

0

精华

大师

F 币
188 元
贡献
77 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
9#
发表于 2014-12-7 13:41:50 | 只看该作者
是的,in,out只能对虚参进行。返回值不是虚参
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-4-28 15:49

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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