从Fortran中的数组中删除索引值之后的所有行

Yuk*_*ita 2 arrays fortran

我想要一个数组从Fortran中的数组中删除某个索引值之后的所有行.这意味着如果数组的大小最初是p,它应该变为q,其中q是索引,之后将删除所有内容.

以下是相关的代码:

real(8), allocatable :: circlesx(:),circlesy(:)
allocate(circlesx(n**2-n))
allocate(circlesy(n**2-n))

do i=1,n-1
    do j=i+1,n
        call intersect2circles(stlo(i),stla(i),distance(i),stlo(j),stla(j),distance(j),ax,ay,bx,by,flag)
        if (flag==0) then
            circlesx(k)=ax
            circlesy(k)=ay
            circlesx(k+1)=bx
            circlesy(k+1)=by
            k=k+2
        endif
    enddo
enddo
Run Code Online (Sandbox Code Playgroud)

该标志基本上检查两个圆是否相交.因此,如果没有交集,没有值被分配给阵列circlesxcirclesy.我首先分配的数组的大小是n个圆=的最大交点数n^2-n.如果我不分配它,我会遇到分段错误.

重塑也没有用,虽然我可能在那里做错了.这给出了一个无法分类的陈述错误: -

reshape(circlesx,[ n**2-n-1 ])
Run Code Online (Sandbox Code Playgroud)

我希望圆圈数组的大小k-2在循环完成后更改为

所以我需要的是,如果n = 2,那么circlex和circley的大小为2,那么,

circlesx=[0,0]
.
.
some calculations
.
.
circlesx=[1.2,0] ! only one value has been allocated
.
.
reshape the array accordingly
.
.
circlesx=[1.2]
Run Code Online (Sandbox Code Playgroud)

在Fortran有什么办法吗?我正在使用f90文件扩展名并使用gfortran v7.3.0

fra*_*lus 5

这里关于动态调整数组大小的问题通常关心放大数组.这是一个更难的问题.1

但是,基本考虑因素大致相同.考虑

integer, allocatable :: arr(:)
allocate(arr(3))
arr = [1, 2, 3]

end
Run Code Online (Sandbox Code Playgroud)

通过内在的任务,我们可以从其他地方看到我们可以写作

integer, allocatable :: arr(:)
arr = [1, 2, 3]

end
Run Code Online (Sandbox Code Playgroud)

并已arr分配到正确的形状作为任务的一部分.

我们已经看到这样:放大阵列

arr = [arr, 4]
Run Code Online (Sandbox Code Playgroud)

删除"坏值":

arr = PACK(arr, arr>1.and.arr<4)
Run Code Online (Sandbox Code Playgroud)

只选择前几个元素非常简单

arr = arr(:q)
Run Code Online (Sandbox Code Playgroud)

编译器需要特殊标志来编译这样的代码正确的日子正在慢慢传递,但是(特别是如果使用旧版本)检查编译器文档以确保如何确保在内部赋值上进行自动分配.


1即使在没有动态内存分配的日子里,也只是处理"较短"的数组.获取您需要的大型静态数组,并对使用的元素进行一些记录.在现代代码中,您可能会在使用旧库时看到这些人工制品.