![]() |
|
|
![]()
|
|
| Гость_Sun |
|
|||
|
Unregistered |
Народ! Кто нибудь знает как в фортране 90 вернуть из функции массив?
|
|||
|
||||
| Cr@$h |
|
||||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Гость_Sun
В фортране все по-божески. Массив также может быть результатом функции. Интерфейс к такой функции должен быть задан явно. Если функция не является ссылкой, то границы массива должны быть описательными выражениями, которые вычисляются при входе в функцию. Пример. Составить функцию, возвращающую массив из первых n положительных элементов передаваемого в нее массива.
Это сообщение отредактировал(а) Cr@$h - 25.8.2006, 01:38 |
||||
|
|||||
| Балабол |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
Функция созданная по аналогичным мотивам
Результат
|
||||
|
|||||
| FatalError |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
А в чем проблема? Компилятор не хочет работать с этим deferred-shape массивом, если он не является динамическим. О чем всех честно предупреждает. Если этот массив тупо прописать как ALLOCATABLE, все возражения должны исчезнуть.
|
|||
|
||||
| Балабол |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
Проблема естественно в голове, которая заточена под структурное программирование, но спасибо за наводку
|
|||
|
||||
| popovda |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 9.6.2006 Где: Москва Репутация: нет Всего: 6 |
Причем тут динамический массив?!
Какой компилятор используется? (: ) в массивах надо указывать только для динамических массивов, либо указателей на массив, либо МАССИВОВ-ФОРМАЛЬНЫХ ПАРАМЕТРОВ!!! Для остального есть автоматические массивы. Но это стандарт 90 и выше. А у вас расширение файла .for. Потому его и компилирует 77-компилятор. Расширение f90 и компилятор соответствующий. У меня код сразу проглотил. Это сообщение отредактировал(а) popovda - 15.5.2008, 21:17 -------------------- С уважением, Попов Д.А. |
|||
|
||||
| FatalError |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
С этими ( : ) массивами вообще дело не так просто. Они были введены в стандарт Фортрана77 именно для использования в качестве массивов-формальных параметров. А потом из стандарта Фортрана95 deferred-shape массивы были ИСКЛЮЧЕНЫ. Так что совсем современные компиляторы не обязаны с ними работать в качестве формальных параметров функций и подпрограмм. Кстати, случай, который компилировал Балабол, как раз под этот вариант подпадает. Понятное дело, эти массивы в свое время были прописаны в жутком количестве программ, и поддержка этой фишки теперешними компиляторами крайне желательна. Но не обязательна, поскольку они уже нестандартные. Вот мне и показалось, что компилятор у Балабола их напрямую и не поддерживает, и поэтому требует, чтобы массивы эти прописали как динамические. Тогда, мол, так уж и быть, откомпилирую. Но я был, скорее всего, не прав. Проблема, как мне теперь кажется, в "сишном" стиле написания заголовка функции в примере Балабола, как у Маяковского, лесенкой. Выпендреж это и ни к чему. В результате синтаксические ошибки: пропали запятые и закрывающая кавычка. При фиксированной форме записи получается, что функция имеет один параметр: cm, дальше конец строки и обрыв параметров, cordbox уже не входит. И кавычки нет на месте. Мне кажется, компилятор вообще не понял, что это такое, и просто выдал формальную придирку.
|
|||
|
||||
| popovda |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 9.6.2006 Где: Москва Репутация: нет Всего: 6 |
Конечно! В оформлении кода Вы абсолютно правы. Я его руками вводил и как надо
-------------------- С уважением, Попов Д.А. |
|||
|
||||
| FatalError |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
Ну, значит, не так понял.
|
|||
|
||||
| popovda |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 9.6.2006 Где: Москва Репутация: нет Всего: 6 |
Эти 2 термина почему-то часто путают.
-------------------- С уважением, Попов Д.А. |
|||
|
||||
| Иванофф |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 8.9.2006 Репутация: нет Всего: нет |
задававшего вопрос ответ вроде и не интересует.
зачем массив неизвестной длины возвращать как значение функции, разбираться с отладкой и согласованием длин. для передачи значений есть параметры. а значение функции допустим указывает на успешность или неуспешность операции. приведенные примеры как занятие йогой. сложно и непонятно зачем. |
|||
|
||||
| popovda |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 9.6.2006 Где: Москва Репутация: нет Всего: 6 |
Насчёт размеров возвращаемого функцией (а вопрос был именно про функцию, на него и отвечали ) массива - часто длина известна, например, как при произведении матриц (matmul), там используются автоматические массивы. А вот если размер вычисляется внутри функции, то гораздо удобнее вернуть размещаемый массив. Эта черта современных стандартов языка реализована практически во всех компиляторах
или так
Хотя часто эффективнее и удобнее пользоваться процедурами. Это сообщение отредактировал(а) popovda - 20.5.2008, 11:18 -------------------- С уважением, Попов Д.А. |
||||
|
|||||
| Иванофф |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 8.9.2006 Репутация: нет Всего: нет |
а если вопрошавший прочитал только первую главу "функции" в учебнике и сразу задал этот вопрос, потом прочитал главу "подпрограммы" и решил его для себя. надо говорить не только как можно сделать, но и как привильнее сделать.
|
|||
|
||||
| popovda |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 9.6.2006 Где: Москва Репутация: нет Всего: 6 |
И всё же для этого надо правильно ставить вопрос. Потом, мне подход с функциями нравится больше. Тем более, что сам стандарт языка подразумевает такой подход - он более информативен, а хороший компилятор (плохим компилятором Фортрана просто нет смысла пользоваться) всё равно очень качественно оптимизирует вызов такой функции. Заметьте разницу - например в C при вызове функции можно опустить результат, т.е.
a = func(); или просто func(); сработают. В Фортране это недопустимо. Только a = func(). Чтобы переменная результата была заранее определена и при оптимизации не создавалось доп. переменной (по сути вызовы функции и процедуры в этом случае не отличаются, отличается лишь вызов в коде). Потом, результат вызова функции можно сразу использовать в качестве фактического параметра, а процедуры - нет. Например, C = transpose(conjg(matmul(A,X))) Что на мой взгляд короче, понятнее и удобнее. Тем более, если промежуточные матрицы не нужны. Но это уже моё личное мнение. -------------------- С уважением, Попов Д.А. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Fortran | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |