![]() |
|
|
![]()
|
|
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Дело для меня очень важное
Итак, имею такие файлы: output.for - сама программа, дальше подрограммы pinread.for pureread.for ABEOS10.for Initial.for multifac.for SETEOS10.for Логически pinread.for должна выполняться первой, поэтому с нее и начал. Она берет данные из внешнего файла. Так вот при компиляции возникают такие ошибки: --------------------Configuration: pinread - Win32 Debug-------------------- Linking... pinread.obj : error LNK2001: unresolved external symbol _TRIMLEN@8 pinread.obj : error LNK2001: unresolved external symbol _STRINT@20 pinread.obj : error LNK2001: unresolved external symbol _LEFT@8 pinread.obj : error LNK2001: unresolved external symbol _CASEFOLD@8 pinread.obj : error LNK2001: unresolved external symbol _LENCHAR@8 pinread.obj : error LNK2001: unresolved external symbol _SHIFT@12 pinread.obj : error LNK2001: unresolved external symbol _PUTINKOM@8 pinread.obj : error LNK2001: unresolved external symbol _KOM2IV@20 pinread.obj : error LNK2001: unresolved external symbol _KOM2R8V@20 pinread.obj : error LNK2001: unresolved external symbol _STRREAL8@20 dfor.lib(DFORMAIN.OBJ) : error LNK2001: unresolved external symbol _MAIN__ Debug/pinread.exe : fatal error LNK1120: 11 unresolved externals Error executing link.exe. pinread.exe - 12 error(s), 0 warning(s) В чем проблема, куда копать? Может кто-нибудь подсказать? P.S. Исходный код pinread прикрепил файлом Присоединённый файл ( Кол-во скачиваний: 6 )
pinread.for 5,08 Kb |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: нет Всего: 37 |
Компилируется она без ошибок. Это ошибки линковщика. Так и должно быть, ведь ты не указал ему остальные объектники. (Они соответственно из других for-ов получаются).
|
|||
|
||||
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Ну да, Точно, компилируется, но экзешник не создается и программа не запускается. А как указать ему объектники?
Кстати, для каждой подпрограммы и программы нужно создавать отдельный проект в Fortran? Или все в один проект и вместе компилировать? Если в один, то в какой структуре и как это правильней сделать? |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Файл с основной программой и файлы с подпрограммами включи в один проект. Если подразумевается фортран-проект в рамках какой-либо IDE, то "нажатие кнопки" компоновки (Build) проекта приведет к компиляции всех (нескомпилированных) исходников + компоновка(линковка) полученных при компиляции объектников. Можно отдельные файлы проекта компилить по отдельности, а потом компоновать.
( Можно конечно компилить подпрограммы в разных проектах а затем объектные файлы включать в проект с главной программой - но это делается, как правило, если подпрограммы большие и/или над ними работают разные программисты и/или они часто используются в разных проектах. Также можно часто используемые подпрограммы оформить в виде статических или динамических библиотек) Это сообщение отредактировал(а) FCM - 16.5.2009, 13:21 |
|||
|
||||
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Спасибо за объяснение. Собрал все в один проект, теперь ошибки линковщика пропали.
Сейчас обнаружил ошибки программного кода в файлах output.for и pureread.for. В output.for 4 ошибки: output.for(118) : Error: Syntax error, found '.' when expecting one of: <LABEL> <END-OF- output.for(135) : Error: Syntax error, found '.' when expecting one of: <LABEL> <END-OF-STATEMENT> ; BLOCK BLOCKDATA PROGRAM TYPE COMPLEX BYTE CHARACTER ... output.for(65) : Warning: A jump into a block from outside the block may have occurred. [9999] output.for(107) : Warning: A jump into a block from outside the block may have occurred. [9000] output.for(120) : Error: An unterminated block exists. if(nkomp.eq.2)then output.for(111) : Error: An unterminated block exists. if (find.eq.'H') then Error executing df.exe. output.obj - 4 error(s), 3 warning(s) С незаконченными блоками IF понятно, только интересно куда могли деться их ENDIF? И что за многоточия, что под ними кроется? Или там действительно куска кода не хватает? А вот с BLOCK BLOCKDATA мне совсем не понятно, я с этим не сталкивался. Нашел кое-что в Бартеньеве, но мало что понял. И еще в pureread есть ошибки в коде. Но с ними позже, может с ними станет яснее, когда с output получится разобраться. Присоединённый файл ( Кол-во скачиваний: 4 )
output.for 6,72 Kb |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Про многоточие спроси у авторов. (на фортране вроде как нет многоточия)
Одного endif, по-видимому, не хватает. Может так?
А на самом деле, чтобы надежно ловить подобные и другие опусы нужно иметь для всей программы результаты тестового расчета !!! Это сообщение отредактировал(а) FCM - 20.5.2009, 17:27 |
|||
|
||||
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Вы имеете ввиду тестовый расчет программы, с того времени когда она работала? Ведь сейчас не сделать, т.к. не компилируется.
Ну а вот эта ошибка Error: Syntax error, found '.' when expecting one of: <LABEL> <END-OF-STATEMENT> ; BLOCK BLOCKDATA PROGRAM TYPE COMPLEX BYTE CHARACTER ... о чем говорит? И как от нее избавиться можно? |
|||
|
||||
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
А, все, разобрался - эта ошибка от этих многоточий. Убрал их, все ушло.
Так, теперь последний файл pureread.for Тут интересуют вот эти две ошибки и им подобные C:\pureread.for(61) : Error: This name has already been used as an external function name. [TM] TM(I)=TMJA ------------^ C:\pureread.for(61) : Error: This function, which is specified as the left side of an assignment statement, is invalid. [TM] TM(I)=TMJA Чаго это он ругается? И еще вот эти C:\pureread.for(35) : Error: This label has not been defined as a FORMAT label. [903] IF (NEG.NE.0) READ(NEG,903) KUERZ(I),TKR(I),PKR(I), -------------------------------^ C:\pureread.for(35) : Error: Constants and expressions are invalid in read-only I/O lists. [KUERZ] IF (NEG.NE.0) READ(NEG,903) KUERZ(I),TKR(I),PKR(I), -------------------------------------^ C:\pureread.for(36) : Error: Constants and expressions are invalid in read-only I/O lists. [INK] > OMEGA(I),(AM(J,I),J=1,3),(ink(j,i),j=1,8),NAM(I) Остальные ошибки (неопределенная ссылка, незаконченный блок и опять эти многоточия) вроде понятны. Файлик прикрепил. Присоединённый файл ( Кол-во скачиваний: 2 )
pureread.for 2,69 Kb |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Прежде всего, следует иметь ввиду, что программы на старом фортране интенсивно используют всякие неявно выполняемые вещи, среди которых самую большую неприятность (источник трудно диагностируемых ошибок) представляет неявное присвоение типов. (В современном фортране рекомендуется отсекать это безобразие инструкцией IMPLICIT NONE)
Массив TM не определен в программе, но поскольку TM неявно присвоен тип REAL*8, то компилятор думает, что TM(I) это функция, но не может найти определение функции с таким именем. Еще не определены массивы INK, DHM. Надо до исполняемых инструкций вставить что-нибудь типа REAL*4 DHM(NKOMP), TM(NKOMP) INTEGER INK(MK,NKOMP) (размеры и типы массивов я выбрал исходя из контекста - перепроверь) Это сообщение отредактировал(а) FCM - 23.5.2009, 12:04 |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Под меткой 903 должен быть определен формат считывания инструкцией FORMAT. Но таковой в исходнике нет. В приципе можно попробовать в READ вместо 903 указать * . Наверное потому, что 1) KUERZ является параметром процедуры, а тут вдруг считывается из файла. 2) Явное опрделение INK, предложенное выше, должно устранить эту ошибку. Кроме того непонятно откуда READ производит считывание. Нужно же предварительно открыть файл, а после считывания закрыть. Возможно, это READ создатели планировали к удалению из программы? Ну и для цикла DO 3000 должен быть указана инструкция 3000 CONTINUE причем по -видимому предпоследней (перед END) в подпрограмме . Это сообщение отредактировал(а) FCM - 22.5.2009, 19:25 |
|||
|
||||
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Спасибо за терепение и направление по пути истинному
Все сделал, все ошибки ушли, кроме одной с этим KUERZ. Метку 903 в READ я пока зменил на *. Что касается самого KUERZ - это порядковый номер вещества в базе данных. И по идее (насколько я понимаю) он должен считываться из файла poly.in Этот файл был в купе со всей программой, прикрепляю его сюда. Номер вещества должен быть в 4 строке текстового файла (COMP), и в данном случае, это вроде бы среднее число - 16902. Постараюсь еще уточнить. Присоединённый файл ( Кол-во скачиваний: 3 )
poly.in 1,27 Kb |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Нельзя параметр KUERZ, являющийся формальным параметром процедуры, изменять внутри процедуры "левым" образом.
Возможно , изначально KUERZ считывался из файла, потом считывание перенесли в другую процедуру, а KUERZ сделали параметром процедуры, но до ума дело в pureread.for не довели. Чтобы понять это, нужно видеть, где и как вызывается процедура из pureread.for. В выложенных ранее файлах она не вызывается. Это сообщение отредактировал(а) FCM - 26.5.2009, 14:01 |
|||
|
||||
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Хм... Вероятно в этой подпрограмме (pinread.for)
На всякий случай, все файлы программы + текстовый файл в архиве тут выложу. Может с ними картина яснее будет. Присоединённый файл ( Кол-во скачиваний: 5 )
Prog.rar 12,16 Kb |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
По-моему подпрограмма purere10 из pureread.for нигде не используется.
Проверь это сам с помощью поиска в каждом из исходников. Зато там используется много подпрограмм (FILESPLT, TRIMLEN, DDBFILE. FILECON, RUNSTR, IPAS, READINP И ДР. ) неизвестно откуда. Возможно они входят в некоторую библиотеку, которая компоновалась вместе с данным проектом. Либо использовался незнакомый мне компилятор. Известно, какая ОперационнаяСистема и какой компилятор использовался у них? Также (компилятором) замечено, что размеры некоторых одноименных COMMON-блоков, идентичных по объявленным в них переменным, в разных процедурах различается. По-видимому, имеет место несоответствие типов (например, одна и та же переменная включаемая в один и тот же COMMON-блок в одной процедуре заявлена как REAL*8, а в другой процедуре как REAL*4 ( то же касается INTEGER*4 и INTEGER*2) ) Это сообщение отредактировал(а) FCM - 28.5.2009, 08:41 |
|||
|
||||
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Да, в приведенных (переданных мне) файлах они действительно не вызываются.
Вот что мне удалось выяснить. Используемые подпрограммы не используются какими-то специфичными библиотеками, а сами по себе являются специфичными подпрограммами. Т.е. тут не одна такая программа, а несколько, которые постоянно модифицируются и служат для разных целей, но в принципе работают одинакого и все используют одни и те же подпрограммы. Я докопался до архива программ и нашел все, что вызываются в программе. Программа писалась на Digital Fortran 6.1 (наверное там и компилировалась???) Мне по-видимому передали только модифицированные файлы программы, которые соответствуют другой модели (т.е. которой мне надо пользоваться) вычисления. Поэтому в тех других подпрограммах ошибок не должно быть. Их, по идее, не должно быть и в этих несколких модифицированных файлах которые мне передали (перечислены в первом посте), т.к. эта модифицированная программа работала и с ее помощью была написана диссертация. Может быть случайно кто-то что-то немного наковырял, других версий у меня нету. Так вот подпрограммы purere10 и pinread вызываются в READINP.
Так на данный момент надо выяснить где вызывается процедура использующая параметр KUERZ?Немного запутался в терминологии: процедура, т.е. здесь это подпрограмма purere10? Прикалываю этот READINP P.S. Так же нашел эту диссертацию, там есть небольшое описание структуры программы. Попробую дособирать еще несколько подпрограмм, которые там озвучены и собрать их в проекты. А проекты в одну Workspace. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Fortran | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |