2014-10-26 2 views
1

Я запускаю программу FORTRAN, которая динамически выделяет память для довольно больших массивов, а иногда и не вписывается в память.fortran test over over over

Таким образом, распределение

allocate(my_array(really big_number)) 

даст ошибку

Operating system error: Cannot allocate memory 
Allocation would exceed memory limit 

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

ответ

1

Использование: allocate(my_array(really big_number),stat=ierror)

stat= С спецификатором, статус выделения будет сохранен в указанном переменном (ierror в примере). «Нуль» означает, что выделение выполнено успешно, ненулевое означает, что оно не выполнено.

От стандарта Fortran 90 (ftp://ftp.nag.co.uk/sc22wg5/N001-N1100/N692.pdf) на ALLOCATE заявлении:

Если STAT= спецификатора присутствует, успешное выполнение ALLOCATE заявления вызывает стат переменный, чтобы стать определен с значения нуль.

Если условие возникает ошибку во время выполнения оператора ALLOCATE , стат переменный становится определенным с процессора зависимым положительным целым числом. Если при выполнении оператора ALLOCATE возникает ошибка , то не содержит спецификатор STAT=, выполнение исполняемой программы завершено.

+1

Стоит отметить, что это не доказательство бомбы. Ошибка En может по-прежнему возникать при доступе к массиву в некоторых системах. –