Fortran Coder

查看: 6404|回复: 3
打印 上一主题 下一主题

[指针] 如何将下列函数改写成fortran程序

[复制链接]

13

帖子

8

主题

0

精华

入门

F 币
83 元
贡献
51 点
跳转到指定楼层
楼主
发表于 2016-1-15 15:10:02 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
现在我是想使用fortran写这个函数,写为fortran后,再调用c中的一个函数,将这个改写的fortran子程序的地址传递给c函数。
[C] 纯文本查看 复制代码
void my_neighbors(void** neighbor_addrs,int* num_neigh, targs* args)
{
    int starti=args->starti;
    int startj=args->startj;
    void* src_addr=args->src_addr;

    *num_neigh=0;
    if(starti - BLKX>=0)
      neighbor_addrs[(*num_neigh)++]=(void*)(src_addr - BLKX * SIZEY * SIZEZ * 8);
    if(starti + BLKX < SIZEX)
        neighbor_addrs[(*num_neigh)++]=(void*)(src_addr + BLKX * SIZEY * SIZEZ * 8);
    if(startj - BLKY >= 0)
        neighbor_addrs[(*num_neigh)++]=(void*)(src_addr - BLKY * SIZEZ * 8);
    if(startj + BLKY < SIZEY)
        neighbor_addrs[(*num_neigh)++]=(void*)(src_addr + BLKY * SIZEZ* 8);
}

群主告诉我在fortran中没有类似void类型。那改成integer,即integer,dimension(:),pointer :: neighbor_addrs.改成指针数组后,我知道有一个库函数loc()可以获得对象地址。但是如果改成integer会不会造成信息丢失?
neighbor_addrs[(*num_neigh)++]=(void*)(src_addr - BLKX * SIZEY * SIZEZ * 8);改写方式我是这样想的,如下: 前面已经改成了integer类型。
integer loc
neighbor_addrs => loc(src_addr - BLKX * SIZEY * SIZEZ * 8 不知道我改写的对不对?我实际上想希望这条语句改写可以想原来语句似得。可以
neighbor_addrs(num_neigh) = locsrc_addr - BLKX * SIZEY * SIZEZ * 8).
具体如何改写,请大家教教我。
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

13

帖子

8

主题

0

精华

入门

F 币
83 元
贡献
51 点
沙发
 楼主| 发表于 2016-1-16 16:08:13 | 显示全部楼层
本帖最后由 苏坡,man 于 2016-1-16 16:14 编辑

a. neighbor_addrs 指向的内容是指定的是 在c中void**类型
b. args->src_addr 指向的内容是void*
c. neighbor_addrs 这个指针数组有256大小
我今天将这个void my_neighbors(void** neighbor_addrs,int* num_neigh, targs* args)进行了改写,改写如下:
subroutine neighbor(neighbor_addrs,num_neigh,args)
28           implicit none
29           include 'global.h'
30           integer(c_int),pointer :: neighor_addrs !改成整形的指针
31           integer(c_int),pointer :: num_neigh
32           integer(c_int) num
33           class(struct),pointer :: args
34           integer(c_int) starti,startj
35           integer(c_int),pointer :: src  !也写成了整形指针
36              starti = args%starti
37              startj = args%startj
38              src => args%src_addr
39              num = 0
40         
41           if (starti>=BLKX)then
42              neighbor_addrs=>c_loc(src-BLKX*BLKY*Z*8)
43              num=num+1
44             num_neigh=>num  !num_neigh实际上是计数用的
45           endif
46           if (starti<X-BLKX)then
47              neighbor_addrs=>c_loc(src+BLKX*BLKY*Z*8) !这个c_loc是不是应该写为loc,或者说不需要使用c_loc,直接赋值给neighbor_addrs
48              num=num+1
49              num_neigh=>num
50           endif
51           if (startj>=BLKY)then
52              neighbor_addrs=>c_loc(src-BLKY*Z*8)
53              num=num+1
54              num_neigh=>num
55           endif
56           if (startj<Y-BLKY)then
57              neighbor_addrs=>c_loc(src+BLKY*Z*8)
58              num=num+1
59              num_neigh=>num
60           endif
61          end subroutine neighbor
这个函数最后也是要传递给系统中c的函数,在系统中使用的 neighbor_addrs类型仍然是void**,num_neigh是int*,src_addr是void*
原先的c程序的代码如下:原先c程序代码改写fortran语言编写。
typedef struct{
  int starti, endi;
  int startj, endj;
  int k_N;
  int iter;
void* src_addr;
}targs;
void my_neighbors(void** neighbor_addrs,int* num_neigh, targs* args)
{
    int starti=args->starti;
    int startj=args->startj;
    void* src_addr=args->src_addr;
  
    *num_neigh=0;
    if(starti - BLKX>=0)
        neighbor_addrs[(*num_neigh)++]=(void*)(src_addr - BLKX * SIZEY * SIZEZ * 8);
    if(starti + BLKX < SIZEX)
        neighbor_addrs[(*num_neigh)++]=(void*)(src_addr + BLKX * SIZEY * SIZEZ * 8);
    if(startj - BLKY >= 0)
        neighbor_addrs[(*num_neigh)++]=(void*)(src_addr - BLKY * SIZEZ * 8);
    if(startj + BLKY < SIZEY)
        neighbor_addrs[(*num_neigh)++]=(void*)(src_addr + BLKY * SIZEZ* 8);
}
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-15 06:18

Powered by Tencent X3.4

© 2013-2024 Tencent

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