![]() |
|
|
![]()
|
|
| popovda |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 9.6.2006 Где: Москва Репутация: нет Всего: 6 |
Интересует идеология работы Фортран-оператора result. Ведь подпрограмма (не ограничивая общности - функция) может возвращать массив двумя способами:
1. Через intent(out)
2. С помощью оператора result
Сдается мне, что второй способ предпочтительнее, т.к. идет из HPF и только он может использоваться в процедурах без побочного эффекта для возврата массива (pure procedures). И ощущение такое, что в принципе они внутри устроены практически одинаково. То что во втором случае res - автоматический массив - несколько смущает, т.к. может возникнуть фрагментация памяти, хотя, с другой стороны, не будет же программист в одной и той же программе специально вызывать функцию с сильно различными размерами массива, а память для переменных функции выделяется, насколько я помню стандарт, при первом вызове и освобождается при завершении работы программы. И наверняка выделяется вполне приличными блоками. -------------------- С уважением, Попов Д.А. |
||||
|
|||||
| FatalError |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
Я как-то не сталкивался с этим оператором на практике. Полез в хелп-файл для FTN-95, и обнаружил там совсем другое объяснение применения оператора RESULT:
В общем, с рекурсивными функциями все понятно. А в приводимом Вами примере мне вот совсем не ясно, как будет возвращаться массив. Автоматический массив создается при входе в функцию/процедуру и должен при выходе из нее разрушаться. Если только он не прописан с атрибутом SAVE. Без SAVE, мне кажется, данные просто потеряются. Да и то в них заглянуть можно будет только изнутри этой самой функции, если ее вызвать еще разок. Может, я не прав? |
||||||
|
|||||||
| popovda |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 9.6.2006 Где: Москва Репутация: нет Всего: 6 |
Автоматический массив разрушается при выполнении следующего за вызывающим функцию оператором. Посмотри этот код - значения из MyMatmul будут возвращены
-------------------- С уважением, Попов Д.А. |
|||
|
||||
| popovda |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 9.6.2006 Где: Москва Репутация: нет Всего: 6 |
Пообщался на эту тему с Аллой Моисеевной Горелик. Выяснилось, что result - это не оператор, а суффикс при объявлении функции. Кроме того, будет фрагментация памяти или нет - зависит от реализации компилятора. Уже что-то.
-------------------- С уважением, Попов Д.А. |
|||
|
||||
| Cr@$h |
|
||||||||||||||||||||||||||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Ну, процедуры-не-функции тоже могут быть чистыми, даже если будут меня больше одного параметра ;-)
Хм.. Возможно. Но одно дело память для ссылки, а другое дело память для массива у этой ссылки. Т.е. если возвращается массив неизвестной длины, то возвращается ссылка (да как и всегда), а выделение памяти будет каждый раз своё.
Это не совсем автоматический массив функции, это же сама функция. Проверь, например, когда используешь MatMul, памяти ведь нужно в два раза больше. Так и тут: массив функции живёт, пока результат функции не присвоится куда-нибудь или не перестанет использоваться.
При использовании многих функций, получается, что фрагментация памяти как бы будет. Да что там говорить, "вместо" процедур почти все встроенные подпрограммы являются функциями! И это то в божном Fotran! Казалось бы, зачем, почему.. Да потому что по-другому быть не может. Казалось бы, здесь не будет выделений памяти вообще:
а тут -- может и быть:
Но.. первый вариант не подходит для:
Но к массиву функции это не относится. Интересно, что для рекурсии result обязателен. Это как бы переменная каждого экземпляра функции. Добавлено через 10 минут и 57 секунд А вообще, мораль такова. Если функция в конечном итоге присваивается к одному из своих аргументов, то выделения памяти не избежать.
Но до чего обидно, если функция эта имеет такую природу:
и т.п. Ведь компилятору будет очень сложно распознать. Ничего страшного, в том числе и для этого придумали элементные функции. И если тут выделение памяти будет:
то тут -- не факт:
Думаю, разница улавливается прозрачно. Нелишнее выделение памяти -- элемент искусства разработчиков компилятора.
|
||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Fortran | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |