Ошибки рекурсивной сегментации Фортрана - PullRequest
3 голосов
/ 14 апреля 2010

Мне нужно спроектировать и реализовать подпрограмму на Фортране, чтобы определить размер кластеров на квадратной решетке, и казалось чрезвычайно удобным рекурсивно кодировать подпрограмму. Однако всякий раз, когда размер моей решетки выходит за пределы определенного значения (около 200 на сторону), подпрограмма постоянно переходит в состояние ошибки. Вот моя процедура обнаружения кластеров:

RECURSIVE SUBROUTINE growCluster(lattice, adj, idx, area)
    INTEGER, INTENT(INOUT)  :: lattice(:), area 
    INTEGER, INTENT(IN)     :: adj(:,:), idx

    lattice(idx) = -1
    area = area + 1

    IF (lattice(adj(1,idx)).GT.0) &
        CALL growCluster(lattice,adj,adj(1,idx),area)

    IF (lattice(adj(2,idx)).GT.0) &
        CALL growCluster(lattice,adj,adj(2,idx),area)

    IF (lattice(adj(3,idx)).GT.0) &
        CALL growCluster(lattice,adj,adj(3,idx),area)

    IF (lattice(adj(4,idx)).GT.0) &
        CALL growCluster(lattice,adj,adj(4,idx),area)
END SUBROUTINE growCluster

где adj (1, n) представляет северного соседа сайта n, adj (2, n) представляет запад и т. Д. Что может привести к ошибочному поведению сегфо? Является ли кластер "слишком большим" для больших размеров решетки?

Ответы [ 2 ]

4 голосов
/ 15 апреля 2010

Я думаю, что вы столкнулись с переполнением стека. Если ваша решетка превышает 200 единиц с каждой стороны, это 40000 единиц, что означает, что вы повторяете 40000 раз. В зависимости от размера вашего стека и размера фрейма стека, вы можете легко исчерпать пространство стека.

Вам придется преобразовать свой алгоритм в алгоритм, который использует меньше стекового пространства для обработки больших решеток. Википедия предоставляет несколько реализаций (в псевдокоде) о том, как выполнять заливку без потери стека.

1 голос
/ 15 апреля 2010

1) Вы пытались скомпилировать, а затем запустить с включенной проверкой диапазона индексов? Просто чтобы убедиться, что большой размер не выявляет ошибку, при которой код переходит границы массива в недопустимую память. Это простая проверка.

2) Возможно, у вашей программы недостаточно памяти: попробуйте увеличить ограничение размера стека для каждого процесса. Как это сделать, зависит от операционной системы - поищите здесь, или в Google, или сообщите нам свою операционную систему.

...