![]() |
|
![]() ![]() ![]() |
|
dusnur |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 13.11.2007 Репутация: нет Всего: нет |
всем привет. фортран совсем не знаю. но есть код который дал преподаватель. где мне его откомпилировать и выполнить программу со своими значениями.
спасибо. надеюсь на вашу помочь ![]() |
|||
|
||||
FatalError |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
Проблема, собственно, в том, что различные компиляторы Фортрана имеют некоторые собственные фишки или особенности, которых нет у других. Обычно эти особенности встречаются в неких не слишком часто выполняемых действиях, вроде обращения к функции из DLL. Если в программе никаких таких наворотов нет, то ее можно откомпилировать на любом компиляторе.
Еще одна трабла - начиная с Фортрана90 размер переменных принято указывать таким, например, способом: kind=1. Пакость в том, что разные производители плохо договорились, что под каким kind понимать, и значения kind могут не совпадать для разных компиляторов. Если там в программе написано как в Фортране77, к примеру, real*8, то проблем не должно быть. Чтобы особо не утруждать себя поисками всякого вареза, можно просто скачать бесплатный компилятор g95 на www.g95.org . Устанавливается он элементарно, и к нему идет небольшой такой хелп (на инглише) с достаточно подробным объяснением, как нужно программу откомпилировать. И компилируется все очень просто, понятия проекта (как в коммерческих компиляторах) вообще нет. |
|||
|
||||
dusnur |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 13.11.2007 Репутация: нет Всего: нет |
да нет. програмам состоит из описания переменных. формул. и потом две функции. больше ничего
Добавлено @ 22:07 FatalError, не мог бы прямую ссылку дать на компилятор. на сайте ничего не понял. спасибо Это сообщение отредактировал(а) dusnur - 13.11.2007, 22:22 |
|||
|
||||
FatalError |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
http://ftp.g95.org/ - это страница загрузки. Сначала - ссылка на исходники компилятора и мануалы (оказывается, есть русский, я не знал!). Потом - ссылки на установочные файлы для разных ОС. Предположим, что надо под Винду - под нее 3 варианта. Последний (обозначенный как g95-Cygwin.exe) мы сходу отметаем, поскольку скомпилированные программы не будут работать без cygwin1.dll, что неудобно. А выбираем мы первый вариант - g95-MinGW.exe. Он никаких dll не требует, но это за счет того, что ко всем программам приваривается содержимое подобной cygwin1.dll, но более мелкой dll-ки: MinGW. Поэтому любая прога будет тяжелее килобайт на триста. В общем, далеко не смертельно, зато ЕХЕ-файл можно спокойно переносить с компьютера на компьютер, и все будет работать.
Прямая ссылка на закачку: http://ftp.g95.org/g95-MinGW.exe |
|||
|
||||
dusnur |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 13.11.2007 Репутация: нет Всего: нет |
спасибо. скачал. компилирую черз командную строку. но выходит такая ошибка:
Unclassifiable statement following IF-clause at (1) в строке 76. код
|
|||
|
||||
FatalError |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
okpo1=okpo1+1. - как раз 76 строка. Ругательства компилятора на "непонятно что после выражения с If" вызваны синтаксической ошибкой: в данном случае содержимое 76 строки должно было идти в конце 75-й, без перескока на новую строчку. Но это еще не все, мелочи. Разобраться, разобраться надо в этой функции okpo1(y)!
1. В тексте программы функция вызывается как okpol: if(d.gt.1.) d=okpol(d) (34 строка, скопировано-вставлено) 2. При описании подпрограммы она обозвана okpo1(y) (уже не с l, а с единичкой): function okpo1(y) y=y*10. okpol=aint(y) if((y-okpo1).ge.0.5) okpo1=okpo1+1. okpo1=okpo1/100. return end А в теле функции она прописана и как okpol (74 строка), и как okpo1 (строки 76, 77). Под тегом CODE этого не видно, шрифт такой, но при копировании-вставке это дело вылезает в явном виде. В общем, если это было точно скопировано с текста программы, то в нем полно ошибок (в именах функций), которые надо выявить и исправить. Кроме того, в листинге сделана рекурсия в объявлении функции. Ведь выражение okpo1=okpo1+1. - это, формально, именно рекурсия, поскольку значение функции okpo1 определено через саму эту функцию. Реально никакой рекурсии не подразумевается, но компилятор нас может не так понять. Лучше вместо okpo1 взять временную переменную, а потом функцию приравнять к ее значению. Принимая, что истинное имя этой злосчастной функции - okpol (под ним ее вызывали из основной программы), ее можно переписать так: function okpol(y) real y,tmp y=y*10. tmp=aint(y) if((y-tmp).ge.0.5) tmp=tmp+1. okpol=tmp/100. return end Дальше проверяем сходную функцию okdol. В основной программе она так и названа: d=okdol(d) Зато при ее описании опять пошли в ход единички: function okdo1(x) x=x*100. okdo1=aint(x) if((x-okdo1).ge.0.5) okdo1=okdo1+1. okdo1=okdo1/1000. return end Плюс та же ошибка с разделением выражения с If на две строки, и та же псевдорекурсия. Переписываем сходным образом: function okdol(x) real x,tmp x=x*100. tmp=aint(x) if((x-tmp).ge.0.5) tmp=tmp+1. okdol=tmp/1000. return end Это еще не все! Похожие фокусы с немного неправильными именами обнаружились и для переменной k0: она объявлена (в первой строке) как kO (с буковкой О), во второй строке она уже k0 (с ноликом!), в 27 строке - k0 (с ноликом), в 28 строке - kO (с буквой О), в 46 строке - опять kO (с буквой О). А по смыслу вроде это должна быть одна и та же переменная! В общем, все это дело похоже на чью-то наглую и преднамеренную диверсию, когда в тексте программы специально заменили буковки на похожие циферки (или наоборот), чтобы программа выглядела нормальной, но не компилировалась. Или, что еще хуже, компилировалась бы в неправильную программу, которая выдавала бы совсем не то, что нужно. Это сообщение отредактировал(а) FatalError - 14.11.2007, 22:06 |
|||
|
||||
dusnur |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 13.11.2007 Репутация: нет Всего: нет |
FatalError,
так ошибки исправил. if-ы подправил. функции тоже. должно быть
ещё такая штука. в программе есть спец ошибки. они в объявлении переменных. т.е. некоторые переменные не описаны, то компилятор на это не ругается, почему? теперь я скомпилировал. появился файл *.o как мне теперь ввести свои данные и получить результаты? FatalError, спасибо большое что помогаешь. |
|||
|
||||
FatalError |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
Ну и еще не очень хороша идея вводить кучу данных с клавиатуры, а потом получить результаты расчетов в консольном окне, откуда их никак нельзя скопировать, а только переписать вручную. Почему бы не подправить прогу так, чтобы она читала данные из файла и записывала результаты расчетов в другой файл? Или дописывала бы эти результаты под введенными значениями в тот же самый файл, так даже лучше: сразу есть и что ввели, и что получили. Для простоты мы жестко зашьем в программе имя файла, с которым она будет работать: пусть это будет файл data.txt . Файл должен лежать в той же папочке, что и запускаемая программа. При повторном запуске программы уже обработанный файл придется переименовать, чтобы программа его не видела, да и положить в эту папку второй файл с таким же названием невозможно.
Тонкий вопрос - кодировка русских букв. Если приведенная прога набирается в какой-то Виндовской программе, то она будет сохранена в кодировке ANSI. При выводе результатов в консольное окно вместо русских букв будут кракозябры, поскольку в консоли применяется ДОСовская кодировка. Но если мы все пишем в файл, то все нормально запишется в ANSI и будет без проблем читаться любой Виндовской программой. Так что вот еще один существенный довод в пользу переделки проги. Сделаем мы это немного сложновато (на вид): сначала откроем файл data.txt только на чтение, потом закроем, потом опять откроем на запись с дописыванием к имеющемуся содержимому. Может, я не прав, но так надежней. Что пишется в data.txt? Значения pvs, png, tvs, k, pr, ccp, n, am, kd, mut, k0, deps, kt. Согласно приведенному коду, они должны быть записаны все в одну строчку (поскольку они читаются одним оператором ввода). Это просто неудобно. Лучше поменять прогу так, чтобы каждое число читалось отдельным оператором, тогда они пишутся каждое на отдельной строке. Примерно так: 12. 0.035 6.475 8.1256 - и т.д. Подправив заодно диверсионные буковки в переменной k0, получаем:
ЗЫ: Почему компилятор не ругается на переменные, которые не описаны? Фортран всегда был в этом отношении либерален и имел неявное описание переменных. Т.е. переменные, которые начинались с определенных букв (вроде от i до p), компилятором воспринимались как целые, переменные с буквы d - дробные двойной точности, еще с какой-то (не помню) - комплексные, остальные - дробные. Эти условности работают до сих пор. Чтобы их отключить, надо использовать директиву implicit none (работает на всех компиляторах Фортрана90 и старше, а также на большинстве компиляторов Фортрана77). Теперь - на счет компиляции. Надо посмотреть как следует в справке про ключики, с которыми запускается g95. Получившийся файл .о - это объектный файл, который еще требуется отлинковать в ЕХЕ. Предположим, что программа записана в файл proga.f, тогда для прямого компилирования в ЕХЕ надо запустить g95 примерно таким образом: g95 proga.f -o proga Смысл: компилятору g95 указывают на фортрановский файл proga.f, а ключик -o говорит о том, то полученный файл будет иметь имя proga.exe (если имя не указано, ЕХЕ-файл получит дефолтное имя a.exe) Это сообщение отредактировал(а) FatalError - 15.11.2007, 00:13 |
|||
|
||||
dusnur |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 13.11.2007 Репутация: нет Всего: нет |
FatalError,
вот что получается опять. спасибо P.S. естественно твой метод чтения из файла хороший. но вот что дал препод то и приходиться решать. спасибо. давай по твоему методу получим ответы и всё. буду очень благодарен Это сообщение отредактировал(а) dusnur - 15.11.2007, 20:13 |
|||
|
||||
dusnur |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 13.11.2007 Репутация: нет Всего: нет |
помогите пожалуйста доделать задание
![]() |
|||
|
||||
FatalError |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
Ну да, я писал в комментариях, что status = 'append' - вещь нестандартная, и не все компиляторы понимают. Вот и g95 не понял (я с ним эту фишку проделать не пытался). Значит, открываем файл один раз на чтение и запись, и при записи выводимой инфы все содержание файла сотрется. Это, в принципе, не страшно, поскольку исходные данные будут записаны заново, да еще и с пояснениями.
На счет ругани компилятора про "Funktion 'okdo1' at (1) has no implicit type" - это на счет того, что не оговорили тип возвращаемого функцией результата. В описании функции должно было быть real function, и у okpol - тоже. Да, и опять там единичка вылезла в названии 'okdo1'! В общем, с поправками будет так:
Все! Вроде все путем! Никаких единичек в названиях функций нигде нет! Нужно нажать на кнопочку "выделить все" на рамке вокруг кода, потом скопировать, записать в файл, и это вроде бы должно скомпилироваться. |
|||
|
||||
dusnur |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 13.11.2007 Репутация: нет Всего: нет |
FatalError,
ну опять
:( |
|||
|
||||
FatalError |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
В общем, так. Я тут попытался сам откомпилировать, но не на g95, a на предыдущей версии, g77 (g95 у меня на компе не настроен как надо). Тоже полезли непонятки с этими функциями, я их переделал в подпрограммы, чтобы компилятор мозги не ломал. И еще были какие-то дурацкие придирки к описанию формата ввода-вывода, я так и не понял, из-за чего, я немного переписал эти форматы, и все прошло нормально. Короче, я запихал окончательный вариант программы вместе с ЕХЕ-файлом в архив (25 КБ) и кинул на файлообменник:
http://files.filefront.com/kompressorzip/;...;/fileinfo.html |
|||
|
||||
dusnur |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 13.11.2007 Репутация: нет Всего: нет |
FatalError, скачал. в папке создал data.txt. сделал его только для чтения. запускаю exe. он запускается и всё. далее ничего не происходит.
я что-то делаю не так7 Это сообщение отредактировал(а) dusnur - 15.11.2007, 23:00 |
|||
|
||||
FatalError |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 11.4.2006 Репутация: нет Всего: 1 |
Фишка в том, что программа написана так, что она на экран ничего не выводит и все пишет в файл. Может, оно и не очень хорошо. Можно переделать, чтобы дублировался вывод в файл и на экран.
Ну ладно, по поводу того варианта, что есть. Он должен считать исходные данные из файла data.txt, а потом в него же записать результаты расчетов. Так что data.txt не может быть только для чтения! Ну, про исходные данные я уже говорил: они должны быть записаны в data.txt в столбик, каждое с новой строки, всего 13 штук. Программу лучше запускать в сеансе DOS, тогда в консольном окне будут видны сообщения программы об ошибках (если они вдруг будут), типа: файл не найден, не могу открыть файл для записи, и т.п. А так они все теряются. |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Fortran | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |