今天开始前先说点题外话,说真的,到现在才感受到什么叫男怕入错行,到现在为止,我都对自己现在搞得研究生的这些东西知之甚少,只能说是从零开始,和其他本专业上岸的还真不一样,我作为一个跨专业调剂上岸的人,所要面对的压力就更大了,首先,基础知识我大学四年没学过,得补,其次,未来发展,我也不知道自己所学习的新行业未来的走向如何,没法子把握这一切,搞得这两天很烦躁,再加上又封校了,哎,出都出不去,真的很难受。。。
还是劝大家做事情之前要充分准备吧,不然哭都不知道去哪哭。
闲话不多说了,还是先完成今天的学习任务吧:
指针数组:
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学完之后,我会把我所有的代码放在百度网盘里的。