2013-08-20 4 views
2

У меня есть программа fortran. Подпрограмма как программа below.The дает ошибку сегментации после выполнения строки 1434 и печати ниже:Ошибка сегментации при доступе к массиву в программе fortran

i:   115   256    2 
Segmentation fault (core dumped) 

Параметры n1 = 258, n2 = 258, и n3 = 258. пг = 46480. Почему возникает ошибка сегментации?

75  double precision u(nr),v(nv),r(nr),a(0:3),c(0:3) 
76  common /noautom/ u,v,r 
...... 
196  call zero3(u,n1,n2,n3) 
...... 
1418  subroutine zero3(z,n1,n2,n3) 
1419 
1420 c--------------------------------------------------------------------- 
1421 c--------------------------------------------------------------------- 
1422 
1423  implicit none 
1424 
1425 
1426  integer n1, n2, n3 
1427  double precision z(n1,n2,n3) 
1428  integer i1, i2, i3 
1429 
1430 !$omp parallel do default(shared) private(i1,i2,i3) 
1431  do i3=1,n3 
1432   do i2=1,n2 
1433    do i1=1,n1 
1434    print*,"i: ",i1, " ", i2 , " " ,i3 
1435    z(i1,i2,i3)=0.0D0 
1436    enddo 
1437   enddo 
1438  enddo 
1439 
1440  return 
1441  end 
+1

Это, вероятно, означает, что массив, который вы передаете как 'z', не такой большой, как вы сказали. Так как мы не можем видеть определение массива в вызывающем коде, мы не можем делать больше, чем догадываться. –

+0

Определение - двойная точность u (nr), v (nv), r (nr), a (0: 3), c (0: 3) common/noautom/u, v, r. nr is 46480 – user1651758

+1

Пожалуйста, (а) отредактируйте информацию в вопросе и (b) покажите вызов функции. Однако ни один из массивов не находится где-то достаточно большим - 258 * 258 * 258 = 17173512 - поэтому основная свалка почти неизбежна. –

ответ

2

Ваше определение переменное выделяет память для 46480 double в массиве u (а также выделяет так много места для v и r.

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

Когда он пытается получить доступ к элементу достаточно далеко за пределами фактического массива, программа вылетает - вы пытаетесь получить доступ к памяти, которая не выделена вашей программе

Либо вам нужно изменить nr быть меньшее число (35 * 35 * 35 = 42875, так zero3(u, 35, 35, 35) должны быть безопасными (не Грохот), или вам нужно выделить больше пространства для u:

double u(258,258,258) 

или что-то подобное (это время, так как я в последний раз писал Fortran; стандартом был Fortran 77 в то время).

+0

Я также сталкиваюсь с той же проблемой, но в моем случае, даже если я добавлю 'WRITE (*, *) 'Hello World'' заявление после всех операторов INCLUDE и объявлений переменных закончились, это дает мне сообщение об ошибке сегментации. Можете ли вы помочь мне понять, что именно вызывает эту проблему? – Akshay

+0

Если ваша проблема «точно» одинакова, вы выделили пространство 100 KiB (скажем) и пытаетесь сохранить несколько MiB данных в 100 KiB, и авария - это способ компьютера сказать, что вас не устраивает пытаясь выжать пару галлонов в пинтовку. Исправление такое же, как и для этого вопроса: либо вырезать данные, которые вы пытаетесь вставить в банк, меньше, чем пинту, либо увеличить размер банка, чтобы он был как минимум на пару галлонов большой. Или, по-другому, получите правильные размеры. Если этого недостаточно, задайте новый вопрос, убедившись, что в нем достаточно информации. –

Смежные вопросы