Нужна помощь в отладке записи в файл на фортране

Я пишу код, который дискретизирует круг, а затем возвращает, какие точки будут в интервале, указанном пользователем. Используя переменные x,y и theta, он записывает значения y и theta, как они должны быть в файл info.dat, но записывает, что x равен нулю, независимо от того, что я делаю. У него нет проблем с записью в points.dat. Кстати, все переменные были правильно определены с самого начала как выделяемые, целевые, указатели и т. Д.

open(unit=2, file="points.DAT")

print*, 'Please enter the reference angle of the arc in degrees, number of points on the arc, and radius of the arc.'
read(*,*) a, n, r
a = a * pi / 180


allocate(x(1:n),y(1:n),theta(1:n))
do i = 1,n
    theta(i:i) = a*(i-1)/n
    x(i:i) = r * cos(theta(i:i))
    y(i:i) = r * sin(theta(i:i))
    xcoord(i:i) => x(i:i)
    ycoord(i:i) => y(i:i)
    angle(i:i) => theta(i:i)        
write(2,*) 'x',i,'=',x(i:i),'y',i,'=',y(i:i), 'theta', i,'=', theta(i:i)    
end do
deallocate(x,y,theta)   
    close(2)

    open(unit=3, file="info.DAT")
print*, 'Please specify the interval of interest between 0 and 360 degrees'
read(*,*) b, c
b = b * pi / 180
c = c * pi / 180

do i = 1, n
    if (any(b <= angle(i:i) .and. angle(i:i) <= c)) then
        write(3,*) 'x', i, '=', xcoord(i:i), 'y', i, '=', ycoord(i:i), 'theta', i, '=', angle(i:i)
    end if
end do
close(3)

1 ответ

Хотя ты не показываешь это xcoord ycoord angle должен быть объявлен как POINTER, Вы устанавливаете их так, чтобы они указывали на каждый отдельный элемент x() y() theta() в свою очередь, оставьте их указывающими на N-ые элементы, а затем освободите базовые массивы, чтобы указатели теперь не были определены (указывают на освобожденную память).

Если у вас есть параметры отладки на вашем компиляторе (или, возможно, во время выполнения) и вы используете их, они обязательно должны определить доступ к 1..n-1, в то время как указатель связи установлен на (n:n), и могут обнаружить это даже (n) недействителен из-за освобождения. По счастливой случайности память, ранее использовавшаяся x был забит чем-то еще, но неудачей y а также theta все еще имеют свои ценности.

Другие вопросы по тегам