![]() |
|
|
![]()
|
|
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Добрый день!
Форумчане, прошу вашей помощи.. Задача следующая: Есть Workspace в Fortran, в этой рабочей области есть два проекта. Это две самостоятельно работающих программы с их подпрограммами. Каждая имеет свои библиотеки, но одну рабоучю директорию. Нужно что бы первая программа в процессе выполнения вызвала (запустила) другу программу, которая бы вычислила то что ей пологается и передала вычесленные переменные в одном массиве. Потом бы вторая программа передала управление обратно первой. Все. Как это организовать? Т.е. передачу управления и передачу значений переменного массива (наверное это называется глобальной переменной?). |
|||
|
||||
| FCM |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Какого типа каждый проект?
Если бы речь шла об Intel Visual Fortran я бы сказал, что надо сделать, чтобы один проект был с главной программой, а другой не должен содержать главной программы. Например, один проект типа Console (с главной программой), а другой типа Static Library (с вызваемыми процедурами). При этом надо указать зависимость проектов (проект с главной программой должен зависеть от проекта с вызываемыми процедурами). Думаю, что и в Compaq Visual Fortran то же самое. С точки зрения синтаксиса вызова будет "по барабану", находятся главная программа и вызываемая процедура в одном проекте или в разных. Добавлено через 2 минуты и 4 секунды
Массив можно "передавать" как параметры процедуры, можно и через модульный данные или COMMON-блоки. |
||||
|
|||||
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Спасибо за ответ.
То есть во второй программе нужно из управляющей программы сделать sobroutine? А в первой просто сделать ее вызов через call XXX? И не зависимо где она будет находиться? P.S. У меня Compaq |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Именно это и нужно сделать! Построение приложения состоит из трех этапов 0) препроцессорной обработки - в Фортране используется редко 1) компиляции исходников - результатом будет создание объектных файлов, некоторые из которых содержат внешние связи (например вызов процедуры) 2) компоновки(линковки) объектных файлов "из предыдущего пункта", а также возможно других объектных файлов (в которых содержатся процедуры и др. скомпилированные вне данного проекта) и библиотечных файлов (в которых содержатся процедуры и др., скомпилированные и скомпонованные вне данного проекта). При компоновки внешние связи разных объектников/библиотек "стыкуются". Твой второй проект с вызываемыми процедурами будет давать объектные или библиотечные единицы компоновки, компонуемые с единицами компоновки главного проекта. Добавлено @ 14:29 Зависимо! Но если у тебя все это в одном workspace нужные зависимости должны установиться автоматически (во всяком случае так в Intel Fortran). Если же ты построил статическую библиотеку в отдельном workspace, то можно явно включать ее в текущий проект. В Intel Fortran (возможно и в Compaq) можно использовать директиву линковки стат библиотеки в исходнике не включая ее явно в проект Это сообщение отредактировал(а) FCM - 11.9.2009, 10:40 |
|||
|
||||
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Хм... А тогда какого типа нужно сделать проект со второй (вызываемой) программой?
Ведь если сделать просто как "Fortran Windows Aplication", то это обязывает что бы в проекте находился файл PROGRAM, а у меня, получается, что все subroutine. Пробовал делать из этого второго проекта библиотеку, но тогда пропадает возможность использования им своих собственных библиотек. Т.е. в статическом проекте пропадает в настройках вкладка "Link" Это сообщение отредактировал(а) MetalHeart - 10.9.2009, 17:06 |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
1) Делай стат библиотеку
2) Насчет библиотек, от которых зависит данная стат библиотека a)Попробуй просто в раздел Sources добавить соотв. lib-файлы. b) Можно также использовать в исходниках директиву (уточни по help) !DEC$ OBJCOMMENT LIB: "NAME" где NAME либо полный путь к библоитеке, либо ее имя, если она помещена в директорию, которая просматривается фортран-окружением в поисках lib-файлов. Это сообщение отредактировал(а) FCM - 11.9.2009, 10:40 |
|||
|
||||
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Вроде бы сделал, управление передается. Вторую программу сделал стат. библиотекой, в source добавил необходимый для нее .lib, а в ссылках первой программы прописал путь ко второй...
Но возникает ошибка при открытии файлов, обозначенных как программные аргументы, второй программой. Пробовал уже и в описании аргрументов первой программы ее обозначить, но не помогло. В чем может быть проблема? |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Что подразумевается под программными аргументами и что такое "в ссылках первой программы прописал путь ко второй"?
Это сообщение отредактировал(а) FCM - 14.9.2009, 18:12 |
|||
|
||||
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Программные аргументы - в свойствах проекта (ALT+F7) во вкладке DEBUG есть строка Program arguments, там у меня указаны файлы жизненно важные для этой программы.
А "в ссылках первой программы прописал путь ко второй" - это там же в свойствах, только вкладка LINK, строка object/library modules - там указаны пути к библиотекам, там вставил путь и к библиотеки моей второй программы. |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
||||
|
||||
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Да, конечно, обе в отдельности компилируются без ошибок.
Я похоже нашел проблему, но не знаю, как ее решить... Вобщем сделал теперь все в одной рабочей области, а в ней эти проекты, один из которых является стат. библиотекой. Все работет, управление передается. Кстати, я не стал делать зависимость проектов. Это зачем? А проблема следующая.. и возникает она в коде. Дело в том, что те библиотеки, которые используют эти программы очень похожи и многие подпрограммы, функции, переменные в них одинаковы, лишь принимают разные значения. Так вот получается так, что моя вторая программа (которая теперь стат. библиотека), передает управление подпрограммам, которые принадлежат первой программе и значения переменных в ней, конечно, не верные для второй. Надеюсь понятно объяснил Как-то можно сделать так, что бы запретить второй программе обращаться в те подпрограммы и обращаться именно в директорию, где лежит ее библиотека? Переименовывать имена очень-очень много... Не выход. P.S. В Source files я ее библиотеку .lib включил. |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Не понимаю. 1) Подпрограммы и функции идентичны или нет? У тебя в одной программе одна и та же подпрограмма/функция может вызываться сколько угодно раз 2) Переменные локализованы в тех программных единицах, где они объявлены. Переменные, могут быть доступны в нескольких программных единицах не через параметры, только с помощью COMMON-блоков и модулей. Глобальными являются имена программных единиц (процедур, COMMON-блоков, модулей и редко используемых BLOCK DATA). |
|||
|
||||
| MetalHeart |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Да, но некоторые отличаются (иначе не было бы смысла во второй библиотеке)
Это понятно. Вот, теперь вроде разобрался! Вторая программа вызывала некоторые подпрограммы из своей библиотеки, а из файлов первой (главной программы). Несколько таких файлов я удалил из главной программы и теперь вторая обращается туда, куда ей и нужно. Сейчас вторая программа выполняется полностью. Теперь при переходе обратно к первой наверняка возникнут проблемы с отсутствием файлов (те что я удалил), попробую из этих файлов создать отдельную библиотеку или же вставить в уже имеющуюся. И второй вопрос с программными аргументами так и не ясен. Сделаю скрины. Только один получилось прикрепить. Для второй программы просто имя этого аргумента другое. И не знаю как их объеденить. Пробовал друг за другом через пробел ставить, считывается только первый. Пробовал указывать свой для каждого проекта, но считывается только тот, что в главной программе.. Это сообщение отредактировал(а) MetalHeart - 21.9.2009, 17:41 Присоединённый файл ( Кол-во скачиваний: 3 )
1.JPG 43,35 Kb |
||||
|
|||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
1)А что реально должно следовать из VLE VLE.TXT ""VLE.PCP1 ?
2)Насчет библиотек - ты их сам компилишь/компонуешь или они готовые и без исходников? Если ты их компилишь/компонуешь сам, то можно a) либо попробовать сделать их модульными. Далее попробуй подключать модули в тех программных единицах, где они используются. Может оказаться полезным, что при подключении модулей, модульные процедуры можно переименовывать в той программной единице, где они подключаются. b) либо попробовать собрать все-таки все в одну библиотеку, а идентичные по названию, но не по содержанию процедуры оформить как перегруженные (правда для этого такие процедуры должны отличаться по типу какого-либо параметра или их количеству - что можно сделать искуственно). Далее в зависимости от формы вызова будет вызываться та или иная процедура. Это сообщение отредактировал(а) FCM - 23.9.2009, 13:58 |
|||
|
||||
| MetalHeart |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 15.5.2009 Репутация: нет Всего: нет |
Библиотеки компилю сам, исходники есть.
С первым пунктом я разобрался - аргументы подрограммы считываются в виде текста самой программой. Пробел служит разделителем, а каждый элемент нумерован. Т.е мне нужно было просто поменять порядковые номера считываемых единиц (в отрибутах оператора). По библиотекам - второй вариант будет предпочтительней. Оформить процедедуры как перегруженные, это как? И как организовать такой "избирательный" вызов процедур? |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Fortran | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |