![]() |
|
|
![]()
|
|
| artjomp |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 1.2.2009 Репутация: нет Всего: нет |
Здравсвуйте, Уважаемые Знатоки Fortran!
Имеется в наличие код на фотране. Необходимо высянить, что эта прога делает. Файлов до фига и в принципе после долгих ковыряний структуру я уяснил, но не понял некоторых, возможно для знающего банальных вещей. Пример:
PRM и F это процедура и функция они описаны тут всё в порядке * что значит тут I=1? В файл запишется правда или ложь этого логического выражения или в файл запишется число 1? ** что означает эта конструкция? По-очереди вызвать все перечисленные в скобках метки? А зачем после скобок буква K? *** как это вообще понимать? Два раза вызывается метка 49 и один раз 42 или тут завуалирован else? И ещё непонятный кусок кода:
Значит ли это, что это цикл от сточки с меткой 140 до строчки с меткой 142? А где же слово CONTINUE? Или оно необязательно? Что такое 1.Е8 в формуле? |
||||
|
|||||
| Фантом |
|
||||||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
В строчке, помеченной одной звездочкой, сидит скрытый цикл.
Конструкция write(6,2)D,(S(K,I),I=1,KP) - это печать в 6-ой файл (как правило, это по умолчанию вывод на консоль, 5-й файл, соответственно, чтение с консоли) по формату с меткой "2" (он там где-то сверху описан) сначала содержимого переменной D, а потом элементов массива S(K,I) для всех I от 1 до KP. Строчка с двумя звездочками - это переход на метку в зависимости от значения переменной K. Когда K=1 - переход на первую метку из списка (10), когда K=2 - на вторую (12) и т.д. Вся эта конструкция:
на самом деле является реализацией переключателя (switch в C/C++ или case в Паскале). Строчка с тремя звездочками - это арифметический оператор условного перехода. Смысл такой: считается выражение в скобках (т.е. KK-24), и если оно отрицательное, то выполняется переход на первую метку (49), если равно нулю, то на вторую метку (тоже 49), а если положительно, то на третью (42). В итоге вся конструкция
переписывается на современном Фортране в таком виде (метки я сохранил, чтобы было понятнее, что чему соответствует, в реальной программе их можно спокойно стереть):
В "непонятном цикле" цикл действительно до метки 142 включительно. Слово CONTINUE не является обязательным, это просто пустой оператор, который можно снабдить меткой (оно нужно именно для того, чтобы границы циклов и т.п. были лучше видны). 1.E8 - это 1.0*(10^8). |
||||||
|
|||||||
| Cr@$h |
|
||||||||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Если функция Ок чистая, то код:
лучше переписать так:
Старайтесь записывать код кратко, если имеете возможность использовать компилятор, хотя бы поддерживающий F90. От меток можно избавиться. F09 позволяет эффективно записывать без меток вообще любой алгоритм. И добро пожаловать в мир элегантности и скорости современного Fortran. Это сообщение отредактировал(а) Cr@$h - 2.2.2009, 02:21 |
||||||||
|
|||||||||
| artjomp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 1.2.2009 Репутация: нет Всего: нет |
Огромное вам человеческое СПАСИБО!!!
Вы просто спасли меня, а то я уже просто голову сломал именно в этих местах |
|||
|
||||
| FatalError |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
Cr@$h, y человека же весь код написан в фиксированном формате, а Вы ему подсунули кусок в свободном, которым предполагается заменить имеющийся код. Соответственно, компилятор, дойдя до стыка форматов, начнет матюгаться совершенно не по-деццки. И будет абсолютно прав. Опять же не ясно, к какому компилятору есть доступ у artjomp, вдруг он на g77 сидит?
|
|||
|
||||
| artjomp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 1.2.2009 Репутация: нет Всего: нет |
О версии ни малейшего понятия... Комп старый престарый, даже разъём монитора с двухрядным набором штырьков... Какой-то фотран под ДОС.
Но сейчас занимаюсь поиском компилятора какой-нибудь новой версии и попробую запустить эту прогу. Ну или в итоге буду "эту польку на родной язык перепёр" (с) на родной Паскаль или Си. Т.е. лучше не изменять код, как указал Cr@$h? Может не заработать на новом? |
|||
|
||||
| Cr@$h |
|
||||||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Понимаю всё собственной натурой . Но надежда есть
Попробуйте g95. Правда.
Ни в коем случаею Если можете эту прогу на Pascal и C писать, то лучше используйте более менее современный компилятор Fortran.
В зависимости от того, какой у вас компилятор. Тот код выполнен в стандарте Fortran 90. Ничего стращного, но красиво, не правда ли? |
||||||
|
|||||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
Наоборот, изменяйте. Сохранение старого кода сейчас имеет смысл только в том случае, если Вы собираетесь эту программу на той же машине под ДОС и гонять. А если она Вам нужна в нормальном виде, то лучше и код переделать. При этом, если эта задача для Вас не единичная, то стоит последовать совету Cr@$h'а - пишите не на Паскале или C, а на современном Фортране. |
|||
|
||||
| artjomp |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 1.2.2009 Репутация: нет Всего: нет |
Скачал компилятор http://progopedia.ru/implementation/gfortran/
Поборол кучу выдаваемых мелких ошибок. А вот это побороть не могу :-( G:\Program Files\gfortran\bin>gfortran.exe z.for C:\DOCUME~1\APTEM\LOCALS~1\Temp/ccF9HcEa.o:z.for:(.text+0x16dd): undefined reference to `_ok_' C:\DOCUME~1\APTEM\LOCALS~1\Temp/ccF9HcEa.o:z.for:(.text+0x1762): undefined reference to `_ok_' C:\DOCUME~1\APTEM\LOCALS~1\Temp/ccF9HcEa.o:z.for:(.text+0x2754): undefined reference to `_ok_' collect2: ld returned 1 exit status И сразу вопрос ещё возник:
Вопросительный знак - это опечатка? На самом деле
Или в фортране есть такой оператор - вопросительный знак? Просто он ругался на эту строчку, пока я не поставил знак "/" |
||||
|
|||||
| FatalError |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
Вопросительного знака как оператора нет, это определенно опечатка.
Похоже, что мониторчик еще EGA. Это очень плохо. Работать на таком - только зрение портить. Я абсолютно серьезно.
Это сочетание - `_ok_' - встречается в программе? Знаки подчеркивания на первой позиции должны встречаться только в служебных словах. Возможно, что компилятор по ходу дела сам где-то поставил этот символ, а потом его не распознал. Возможно, компилятор не совсем правильно настроен, или не совсем правильно задана компиляция (скажем, программа состоит из нескольких файлов, какой-то пропущен). |
||||
|
|||||
| artjomp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 1.2.2009 Репутация: нет Всего: нет |
Комп этот уже выбросили.
Сочетания `_ok_' нигде в программе не встречается. Компилятор я не настраивал вообще... Просто скачал, установил и запустил Программа была из нескольких файлов. Процедуры и функции были по разным файлам раскиданы. Я их всех в один файл запихал посмотрел ещё раз. Нет ничего не забыл... Что может ещё быть или как настроить компилятор? Может вообще взять какой-нибудь visual fortran там же наверное и оболочка есть, которую можно понастраивать с компилятором? |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
||||
|
||||
| Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
||||
|
||||
| artjomp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 1.2.2009 Репутация: нет Всего: нет |
Вот программа в файле. То, что выдаёт компилятор я писал выше
G:\Program Files\gfortran\bin>gfortran.exe z.for C:\DOCUME~1\APTEM\LOCALS~1\Temp/ccF9HcEa.o:z.for:(.text+0x16dd): undefined reference to `_ok_' C:\DOCUME~1\APTEM\LOCALS~1\Temp/ccF9HcEa.o:z.for:(.text+0x1762): undefined reference to `_ok_' C:\DOCUME~1\APTEM\LOCALS~1\Temp/ccF9HcEa.o:z.for:(.text+0x2754): undefined reference to `_ok_' collect2: ld returned 1 exit status Cr@$h она определена само собой Это сообщение отредактировал(а) artjomp - 4.2.2009, 12:34 |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
||||
|
||||
| Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
artjomp, код этот написан очень дотошно. Построчно, можно сказать. Если вы собираетесь его профессионально использовать, то лучше переписать под современный диалект. Например, смотрите как компактно записываются последние функции:
Я вовсю использовал конструкторы массивов. Троеточия можете дополнить по образу и подобию. Первую часть программы в переделанном виде тоже показывал. Работать будет на любом современном компиляторе или на компиляторе, поддерживающем Fortran 90. А теперь по делу.
Это сообщение отредактировал(а) Cr@$h - 4.2.2009, 00:12 |
|||
|
||||
| artjomp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 1.2.2009 Репутация: нет Всего: нет |
Прошу прощения
Я тормоз действительно воткнул не тот файл, где эта функция была. Добавил. Однако.... Теперь компилятор никаких ошибок не выдал просто повисел чёрным экраном и всё. А что теперь-то делать? Как с ней работать? Или может exe-файл куда-нибудь поместился? Это сообщение отредактировал(а) artjomp - 4.2.2009, 12:33 |
|||
|
||||
| artjomp |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 1.2.2009 Репутация: нет Всего: нет |
Прошу проигнорировать вопрос: нашёл exe-файл... только назвается он почему-то a.exe :-(
Но в целом послезавтра потащу тестировать на месте результаты! Всем, кто участвовал в помощи огромное преогромное спасибо!!! Я ещё сюда вернусь, когда буду переписывать эту прогу посовременнее Это сообщение отредактировал(а) artjomp - 4.2.2009, 01:04 |
|||
|
||||
| Cr@$h |
|
||||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Ясное дело. Вы используете gfortran. Под Windows вы его запускаете с использованием Cygwin или подобной библиотеки. Они позволяют запускать Linux/Unix-приложения. Вот. А gfortran по умолчанию создаёт исполняемый файл a.out. В Windows они и переделывают её в a.exe, чтобы она стала порядочным виндовским приложением. Имя получаемого исполняемого файла там можно задавать.
Давайте. Будем переходить от синтаксиса к семантике
|
||||
|
|||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Друзья, у меня схожая проблема с автором топика, но может быть лучше кто-нибудь даст ссылку на то место, где лежит описание или учебник по фортрану и конечно же желательно на русском языке?
ЗЫ: Быстрый поиск в инете привел к файлу для скачивания которого понадобилось отсылать СМСку, за которую надо платить кучу денежков, а что в книге - непонятно. Так что уж лучше проверенную ссылочку, пожалуйста -------------------- я не гольфист - я хоккеист |
|||
|
||||
| Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Посмотрите в подфоруме Компьютерная литература на Винграде.
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Fortran | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |