Andrew10
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Igorr Цитата: По-моему вы не поняли этот Вопрос 1. Поподробнее: Фортран явно видит, что массив pD занимает только 100х100х8 байт, следовательно, второй кусок памяти для него может являться незанятой (так ли это?) памятью , т.е. он может ее использовать, например, при вызове какого-нибудь ALLOCATE - и зарезервирует (может ли?) ее для другого массива, и действия над элементами этого нового массива изменят содержимое второй части массива pD, тем самым его попортив. Так вопрос: возможно ли такое? (Хочется услышать знание или обоснованное мнение.) | Может быть я не понял, но мне пока кажется, что понял . И дал ответ именно на Ваш вопрос. Еще раз: В вызываемой подпрограмме есть декларация DOUBLE PRECISION pD(100,100) причем имя массива pD фигурирует в списке передаваемых в подпрограмму переменных. При работе подпрограммы не происходит выделения дополнительной памяти. В подпрограмму передается только ссылка на первый элемент массива. Размерности массива из этого описания в самой подпрограмме используются только для адресации его элементов относительно этого первого элемента. Никакие динамические и статические распределения памяти не затронут той области памяти, которая уже распределена под массив в вызывающей программе, независимо от того, написана она на С, или на Фортране. Вот пример, подтверждающий мои слова. На заре моей туманной юности было принято писать на Фортране что-то вроде такого: PROGRAM FOO ... REAL A(100) ... CALL BAR(A) .... END SUBROUTINE BAR(A) REAL A(1) ... ... ... RETURN END Это позволяло задавать размерности всех массивов только в основной программе и не следить за ними в подпрограммах. Но это, конечно, накладывало на программиста дополнительную ответственность за правильность кода в подпрограммах, чтобы не было выхода за пределы массива. Конечно, если код самой подпрограммы написан некорректно, например где-нибудь будет изменен элемент с индексами pD(150,150), то произойдет выход за пределы описанного в подпрограмме массива и вторая его половина запортится. Но это ошибка программиста, а не компилятора. В современных компиляторах по умолчанию включены опции проверки таких ситуаций, что-нибудь вроде \check:bounds. Они замедляют работу программы и после отладки их обычно отключают. |