2012-04-04 4 views
-5

У меня возникли проблемы с освобождением и выделены аспекты части моего кода FORTRAN. в частности, я думаю, что проблема связана с распределением памяти из поиска в моем сообщении об ошибке в Интернете. Сообщение об ошибке говорит о недопустимых указателях, однако я не использую никаких указателей в своей программе.Проблемы с распределением и распределением памяти в FORTRAN

После завершения итерации № 2 моей петли f (см. Ниже) программа вылетает из системы или, скорее, большую часть времени, когда она сбой, а иногда он просто замерзает. Я уверен, что в этом суть ошибки. поскольку программа подходит к этому моменту.

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

Я просто показываю часть программы для удобства чтения. в частности, я удалил свои вызовы в подпрограммы, которые я написал. Надеюсь, что я предоставил достаточную информацию для вас, программистов, чтобы помочь мне разобраться с проблемой. если нет, укажите, какую другую информацию вы хотите, и я буду рад выполнить ее. Я скомпилировал программу, используя различные параметры компилятора, и исправил некоторые ошибки и удалил все предупреждения. На данный момент, однако, параметры компилятора не дают мне больше информации.

allocate(poffvect(1:6)) 
allocate(phi1out(1:1)) 
allocate(phi2out(1:1)) 
allocate(phi1outs1(1:1)) 
allocate(phi2outs1(1:1)) 

    dummy allocation 
    allocate(phi1outind(1:1)) 
    allocate(phi2outind(1:1)) 
    allocate(phi1outinds1(1:1)) 
    allocate(phi2outinds1(1:1)) 

    do e = 1, 6 
    print *,"e", e 
    do f = 1, 3 

     print *,"f", f, iteratst1(f), trim(filenumcharimp) 

     deallocate(phi1outinds1, STAT = AllocateStatus) 
    if (AllocateStatus /= 0) stop "Error during deallocation of phi1outinds1" 
    print *, "Allocatestatus of phi1outinds1 is", AllocateStatus 
    deallocate(phi2outinds1, STAT = AllocateStatus) 
    print *, "DeAllocatestatus of phi1outinds2 is", AllocateStatus 

    if (AllocateStatus /= 0) stop "Error during deallocation of phi2outinds1" 
    print *, "we deallocate f loop ok", iteratst1(f) 

     allocate(phi1outinds1(1:iteratst1(f)), STAT = AllocateStatus) 
    if (AllocateStatus /= 0) stop "Error during allocation of phi1outinds1" 
    allocate(phi2outinds1(1:iteratst1(f)), STAT = AllocateStatus) 
    if (AllocateStatus /= 0) stop "Error during deallocation of phi1outinds1" 

end do 
end do 

опции компилятора

ifort -free -check -traceback -o adatptmultistage1new.out adatptmultistage1new.f90 

выход

 e   1 
     f   1  5000 43 
    DeAllocatestatus of phi1outinds1 is   0 
    DeAllocatestatus of phi1outinds2 is   0 
    we deallocate f loop ok  5000 
    f loop done   1 
    f   2  10000 43 
Allocatestatus of phi1outinds1 is   0 
DeAllocatestatus of phi1outinds2 is   0 
we deallocate f loop ok  10000 
    f loop done   2 
    f   3  15000 43 
    Allocatestatus of phi1outinds1 is   0 

сообщение об ошибке

*** glibc detected *** ./adatptmultistage1new.out: munmap_chunk(): invalid pointer: 0x0000000000d3ddd0 *** 
    ======= Backtrace: ========= 
    /lib/libc.so.6(+0x77806)[0x7f5863b7b806] 
    . /adatptmultistage1new.out[0x43247c] 
    . /adatptmultistage1new.out[0x404368] 
    ./adatptmultistage1new.out[0x4031ec] 
    /lib/libc.so.6(__libc_start_main+0xfd)[0x7f5863b22c4d] 
    . /adatptmultistage1new.out[0x4030e9] 
    ======= Memory map: ======== 
00400000-004d4000 r-xp 00000000 08:03 9642201 
/home/jgold/smwcv/error_infect/test/surfaces/multistage/adaptonly/adatptmultistage1new.out 
006d4000-006dc000 rw-p 000d4000 08:03 9642201 

[Остальная часть сообщения об ошибке не показаны для краткости]

7fffb004d000-7fffb00bc000 rw-p 00000000 00:00 0       [stack] 
    7fffb01d7000-7fffb01d8000 r-xp 00000000 00:00 0       [vdso] 
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
    Aborted 
+0

Можете ли вы исправить форматирование исходного кода. Отступы тоже помогают. – Chris

+3

http://sscce.org/ – eriktous

+1

Вы не проверяете код состояния, возвращаемый любыми вашими инструкциями allocate или deallocate. Это может обеспечить полезную диагностическую информацию. –

ответ

5

Это очень много кода для нас, чтобы попытаться выяснить. Скомпилировали ли вы его как можно больше параметров отладки компилятора? В частности, вы используете проверку границ массива? Какой компилятор вы используете? Я не вижу инструкции «use» ... было бы лучше поместить ваши подпрограммы в модуль и «использовать» этот модуль, чтобы компилятор мог проверить согласованность аргументов между фактическим и фиктивным аргументами.

EDIT: «двойная свобода или повреждение» предполагает, что память была повреждена. Поскольку у вас нет указателей, есть три возможных способа повреждения памяти:

  1. Используйте выделенную переменную, которая не была выделена. Если оператор allocate не работает, программа, вероятно, выбросит ошибку в этот момент. Возможно, вы используете переменную, которую вы забываете выделить.
  2. Имеет несогласие между аргументами в вызове процедуры и ожидаемой процедурой, то есть между фактическим и фиктивным аргументами. Использование модуля позволит компилятору лучше проверить это.
  3. Запись вне размера массива с использованием недопустимого значения индекса - это приведет к перезаписи «случайной» памяти, например, внутренних структур, описывающих следующий массив. В этом случае будет проверяться включение индексирования во время выполнения или проверка привязки к массиву. С использованием ifort: -check bounds или -check all.Для очень сквозной проверки: -O2 -stand f03 -check all -traceback -warn all -fstack-protector -assume protect_parens -implicitnone
+1

Привет, я попробую ваши предложения. мои извинения за количество кода. Я использую код, а затем изменяю его, чтобы добавить дополнительную сложность. Я использую ifort. что вы имеете в виду под контролем границ массива –

+0

нормально, поэтому я сделал это, и хотя это помогло мне, сообщив мне о переменных, которые больше не использовались в программе. Я не вижу ничего очевидного из сообщений, которые он предоставил. Я отправляю сообщение от применения этих параметров, чтобы вы могли его увидеть и, надеюсь, интерпретировать его лучше, чем я могу. Я действительно ценю твою помощь. спасибо –

+0

Похоже, у вас теперь есть проблема со связью. Есть ли более ранние сообщения об ошибках или предупреждения? –