Fortran学习16:指针2

今天开始前先说点题外话,说真的,到现在才感受到什么叫男怕入错行,到现在为止,我都对自己现在搞得研究生的这些东西知之甚少,只能说是从零开始,和其他本专业上岸的还真不一样,我作为一个跨专业调剂上岸的人,所要面对的压力就更大了,首先,基础知识我大学四年没学过,得补,其次,未来发展,我也不知道自己所学习的新行业未来的走向如何,没法子把握这一切,搞得这两天很烦躁,再加上又封校了,哎,出都出不去,真的很难受。。。

还是劝大家做事情之前要充分准备吧,不然哭都不知道去哪哭。

闲话不多说了,还是先完成今天的学习任务吧:

指针数组:

Fortran中时可以把指针声明成数组的,有两种使用方法:

        1、把指针指到其他数组

        2、配置内存空间来使用

先看看第一种情况:

program main
    implicit none
    integer,POINTER::a(:)
    integer,TARGET::b(5)=(/1,2,3,4,5/)
    a=>b
    write(*,*)a
    a=>b(1:3)
    write(*,*)a
    a=>b(1:5:2)
    write(*,*)a
    a=b(5:1:-1)
    write(*,*)a
    stop 
end 

输出呢,明眼人一看就知道了,我就不贴图了,没啥意思。

再来看第二种情况:

program main 
    implicit none
    integer,pointer::a(:)
    ALLOCATE(a(5))
    a=(/1,2,3,4,5/)
    write(*,*)a
    DEALLOCATE(a)
    stop "over"
end 
    

输出就是12345,

还是要提醒的,这Fortran太老了,压根就没有java的回收机制,allocate完了必须要deallocate回收掉。

我还没试过多维数组嘞,今天试一试:

program main
    implicit none
    INTEGER,pointer::a(:,:)
    integer ,target::b(2,2,2)
    integer i
    forall(i=1:2)
    b(:,i,1)=1
    b(:,i,2)=2*i
    end forall
    a=>b(:,:,1)    
    write(*,"(9I2)")a
    a=b(1:2,1:2,2)
    write(*,*)a
    stop 
end 

我发现只有用c++的高亮来高亮Fortran代码还挺好看的。

指针变量一样可以作为参数在函数之间进行传递,甚至可以做函数的返回值,使用时有些策略:

        1、要把指针传给函数的时候,要声明这个函数的参数使用接口interface

        2、不需要使用intent

        3、如果函数的返回值是指针,那就需要定义函数的interface

跟着书上来一个:

program main 
    implicit none
    integer,target::a(8)=(/10,15,8,25,9,20,17,19/)
    integer,pointer::p(:)
    interface 
        function getmin(p)
            integer,pointer::p(:)
            integer,pointer::getmin
        end function
    end interface

    p=>a(1:8:2)
    write(*,*)getmin(p)

    stop "over"
end program 
function getmin(p)
    implicit none
    integer ,pointer::p(:)
    integer,pointer::getmin
    integer i,s,min
    s=size(p, dim=1)
    min=2**30
    do i=1,s
        if(min>p(i))then
        min=p(i)
        getmin=>p(i)
        end if
    end do 
RETURN
end function 

还不错嘛,但我一般是搞个 排序算法,输出最小值/脸红

哎,试试看呢:

function getmin(p)
    implicit none
    integer ,pointer::p(:)
    integer, pointer::getmin
    integer i,j,temp,s
    s=size(p, dim=1)
    do i=1,s
        do j=1,s
            if(p(i)<p(j))then
            temp=p(i)
            p(i)=p(j)
            p(j)=temp
            end if
        end do 
    end do 
getmin=p(1)
return 
end function 

 perfect!!!

其实,如果不想用interface的话,因为他实在是太麻烦了,可以把函数直接封装在module中,等于是已经写好了使用接口:

module f1
contains 
function getmin(p)
    implicit none
    integer ,pointer::p(:)
    integer, pointer::getmin
    integer i,j,temp,s
    s=size(p, dim=1)
    do i=1,s
        do j=1,s
            if(p(i)<p(j))then
            temp=p(i)
            p(i)=p(j)
            p(j)=temp
            end if
        end do 
    end do 
getmin=p(1)
return 
end function 
end module

然后再在主程序里面use module_name就🆗啦,没啥新奇的,可以试试看。

今天就到这里吧,这本Fortran学完之后,我会把我所有的代码放在百度网盘里的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值