| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Fortran > [General] Разобраться в синтаксисе |
| Автор: artjomp 1.2.2009, 23:25 | ||||
| Здравсвуйте, Уважаемые Знатоки Fortran! Имеется в наличие код на фотране. Необходимо высянить, что эта прога делает. Файлов до фига и в принципе после долгих ковыряний структуру я уяснил, но не понял некоторых, возможно для знающего банальных вещей. Пример:
PRM и F это процедура и функция они описаны тут всё в порядке * что значит тут I=1? В файл запишется правда или ложь этого логического выражения или в файл запишется число 1? ** что означает эта конструкция? По-очереди вызвать все перечисленные в скобках метки? А зачем после скобок буква K? *** как это вообще понимать? Два раза вызывается метка 49 и один раз 42 или тут завуалирован else? И ещё непонятный кусок кода:
Значит ли это, что это цикл от сточки с меткой 140 до строчки с меткой 142? А где же слово CONTINUE? Или оно необязательно? Что такое 1.Е8 в формуле? |
| Автор: Фантом 2.2.2009, 00:05 | ||||||
| В строчке, помеченной одной звездочкой, сидит скрытый цикл. Конструкция 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). |
| Автор: artjomp 2.2.2009, 14:31 |
| Огромное вам человеческое СПАСИБО!!! Вы просто спасли меня, а то я уже просто голову сломал именно в этих местах |
| Автор: FatalError 2.2.2009, 16:02 |
| Cr@$h, y человека же весь код написан в фиксированном формате, а Вы ему подсунули кусок в свободном, которым предполагается заменить имеющийся код. Соответственно, компилятор, дойдя до стыка форматов, начнет матюгаться совершенно не по-деццки. И будет абсолютно прав. Опять же не ясно, к какому компилятору есть доступ у artjomp, вдруг он на g77 сидит? |
| Автор: artjomp 2.2.2009, 16:19 |
| О версии ни малейшего понятия... Комп старый престарый, даже разъём монитора с двухрядным набором штырьков... Какой-то фотран под ДОС. Но сейчас занимаюсь поиском компилятора какой-нибудь новой версии и попробую запустить эту прогу. Ну или в итоге буду "эту польку на родной язык перепёр" (с) на родной Паскаль или Си. Т.е. лучше не изменять код, как указал Cr@$h? Может не заработать на новом? |
| Автор: Cr@$h 2.2.2009, 20:14 | ||||||||
Понимаю всё собственной натурой . Но надежда есть
Попробуйте g95. Правда.
Ни в коем случаею Если можете эту прогу на Pascal и C писать, то лучше используйте более менее современный компилятор Fortran.
В зависимости от того, какой у вас компилятор. Тот код выполнен в стандарте Fortran 90. Ничего стращного, но красиво, не правда ли? |
| Автор: Фантом 2.2.2009, 20:30 | ||
Наоборот, изменяйте. Сохранение старого кода сейчас имеет смысл только в том случае, если Вы собираетесь эту программу на той же машине под ДОС и гонять. А если она Вам нужна в нормальном виде, то лучше и код переделать. При этом, если эта задача для Вас не единичная, то стоит последовать совету Cr@$h'а - пишите не на Паскале или C, а на современном Фортране. |
| Автор: artjomp 2.2.2009, 21:00 | ||||
| Скачал компилятор 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 2.2.2009, 21:55 | ||||
Вопросительного знака как оператора нет, это определенно опечатка.
Похоже, что мониторчик еще EGA. Это очень плохо. Работать на таком - только зрение портить. Я абсолютно серьезно.
Это сочетание - `_ok_' - встречается в программе? Знаки подчеркивания на первой позиции должны встречаться только в служебных словах. Возможно, что компилятор по ходу дела сам где-то поставил этот символ, а потом его не распознал. Возможно, компилятор не совсем правильно настроен, или не совсем правильно задана компиляция (скажем, программа состоит из нескольких файлов, какой-то пропущен). |
| Автор: artjomp 2.2.2009, 22:20 |
| Комп этот уже выбросили. Сочетания `_ok_' нигде в программе не встречается. Компилятор я не настраивал вообще... Просто скачал, установил и запустил Программа была из нескольких файлов. Процедуры и функции были по разным файлам раскиданы. Я их всех в один файл запихал посмотрел ещё раз. Нет ничего не забыл... Что может ещё быть или как настроить компилятор? Может вообще взять какой-нибудь visual fortran там же наверное и оболочка есть, которую можно понастраивать с компилятором? |
| Автор: Фантом 2.2.2009, 22:30 |
А Вы можете отправить сюда то, что скармливали компилятору? Оптимально - всю программу (в однофайловом варианте) и весь вывод компилятора. |
| Автор: Cr@$h 2.2.2009, 22:36 |
В исходны файлах должна быть определена такая фукция Ok. |
| Автор: artjomp 3.2.2009, 15:05 |
| Вот программа в файле. То, что выдаёт компилятор я писал выше 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 она определена само собой |
| Автор: Фантом 3.2.2009, 16:26 |
Что-то я этого определения нигде не вижу. |
| Автор: Cr@$h 3.2.2009, 20:07 | ||
artjomp, код этот написан очень дотошно. Построчно, можно сказать. Если вы собираетесь его профессионально использовать, то лучше переписать под современный диалект. Например, смотрите как компактно записываются последние функции:
Я вовсю использовал конструкторы массивов. Троеточия можете дополнить по образу и подобию. Первую часть программы в переделанном виде тоже показывал. Работать будет на любом современном компиляторе или на компиляторе, поддерживающем Fortran 90. А теперь по делу.
|
| Автор: artjomp 4.2.2009, 00:57 |
| Прошу прощения Я тормоз действительно воткнул не тот файл, где эта функция была. Добавил. Однако.... Теперь компилятор никаких ошибок не выдал просто повисел чёрным экраном и всё. А что теперь-то делать? Как с ней работать? Или может exe-файл куда-нибудь поместился? |
| Автор: artjomp 4.2.2009, 01:01 |
| Прошу проигнорировать вопрос: нашёл exe-файл... только назвается он почему-то a.exe :-( Но в целом послезавтра потащу тестировать на месте результаты! Всем, кто участвовал в помощи огромное преогромное спасибо!!! Я ещё сюда вернусь, когда буду переписывать эту прогу посовременнее |
| Автор: Cr@$h 4.2.2009, 09:51 | ||||
Ясное дело. Вы используете gfortran. Под Windows вы его запускаете с использованием Cygwin или подобной библиотеки. Они позволяют запускать Linux/Unix-приложения. Вот. А gfortran по умолчанию создаёт исполняемый файл a.out. В Windows они и переделывают её в a.exe, чтобы она стала порядочным виндовским приложением. Имя получаемого исполняемого файла там можно задавать.
Давайте. Будем переходить от синтаксиса к семантике
|
| Автор: takedo 17.3.2009, 15:24 |
| Друзья, у меня схожая проблема с автором топика, но может быть лучше кто-нибудь даст ссылку на то место, где лежит описание или учебник по фортрану и конечно же желательно на русском языке? ЗЫ: Быстрый поиск в инете привел к файлу для скачивания которого понадобилось отсылать СМСку, за которую надо платить кучу денежков, а что в книге - непонятно. Так что уж лучше проверенную ссылочку, пожалуйста |
| Автор: Cr@$h 18.3.2009, 00:53 |
| Посмотрите в подфоруме Компьютерная литература на Винграде. |