Я хочу, чтобы массив удалял все строки после определенного значения индекса из массива в Фортране.Это означает, что если размер массива изначально равен 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
Флаг в основном проверяет, пересекаются ли две окружности или нет.Поэтому, если пересечения нет, значения не присваиваются массивам circlesx
и circlesy
.Размер массивов, которые я выделяю сначала, это максимальное количество точек пересечения n окружностей = n^2-n
.Я получаю ошибку сегментации, если я не выделяю их.
Reshape также не работал, хотя я мог сделать что-то не так.Это дало неклассифицируемую ошибку оператора: -
reshape(circlesx,[ n**2-n-1 ])
Я хочу, чтобы размер круговых массивов изменился на 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]
Есть ли способ сделать это в Фортране?Я использую расширение файла f90 и использую gfortran v7.3.0