Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Tools] Передача управления и переменных (как?), из одной программы в другую 
:(
    Опции темы
FCM
Дата 23.9.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



Выше я не точно выразился (точнее в голове сработала "С++ компонента ") - при перегрузке в Фортране на самом деле тоже понадобится переименование библиотечных процедур в самих библиотеках
(Это в С++ перегрузка осуществляется при определениях одноименных процедур, различающихся либо кол-вом параметров, либо типом параметра/параметров )

В Фортране перегрузка процедур S1 и S2 (отличающихся либо кол-вом параметров, либо типом параметра/параметров  ) реализуется заданием к ним именованного интерфейса в использующей их программной единице
Код

INTERFACE NAME
   
  SUBROUTINE S1(пар-ры)
  ...Описание параметров
  END SUBROUTINE S1
  SUBROUTINE S2(пар-ры)
  ...описание параметров
  END SUBROUTINE S2
   

END INTERFACE SUB


После чего к S1 и S2 можно обращаться по имени NAME.

Добавлено через 7 минут и 49 секунд
Поэтому, если не наводить порядок в библиотеках, может стоит попробовать с помощью модулей.

Это сообщение отредактировал(а) FCM - 23.9.2009, 14:01
PM MAIL   Вверх
MetalHeart
Дата 25.9.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 15.5.2009

Репутация: нет
Всего: нет



Все получилось, заработало! smile

Объединил в библиотеки, в каждой было по 1000 с лишним подпрограмм  smile , лишь малая часть отличалась. Зато теперь никогда путаницы с ними не будет, рано или поздно это пришлось бы делать.

На будущее, наверняка еще столкнусь, а как объявить и вызвать модуль? Т.е., например, у меня есть подпрограмма (или несколько), я ее заключаю в модуль с именем и когда необходимо, просто вызываю этот модуль, которому принадлежать это подпрограммы?


FCM, спасибо за помощь!  smile Даже не знаю как благодарить. В этой жизни все возможно, поэтому, если что, с меня пиво smile

PM MAIL   Вверх
FCM
Дата 25.9.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



Цитата(MetalHeart @  25.9.2009,  14:23 Найти цитируемый пост)
а как объявить и вызвать модуль?

Первоначальная информация такова:
Код

MODULE SMTH
  <определения данных>
  CONTAINS
    
     определения процедур

END MODULE SMTH

причем данные и процедуры, вспомогательные для других компонентов модуля и не предполагаемые для внешнего использования можно локализовать аттрибутом PRIVATE.

Использование
Код

PROGRAM TEST
USE SMTH ! после чего доступны определения модульных данных и процедур, если только
                 !  они не были определены с аттрибутом PRIVATE
...
END

причем возможно подключение только некоторых модульных данных/процедур, а также подключение с переименованием. 

Если модуль локального значения, то можно просто его исходник включить в текущий проект.
Если он содержит  данных/процедур, которые будут многократно  использованы, то можно его скомпилировать отдельно, но возможно лучше скомпилировать и построить по нему библиотеку.
В таком случае для его использования в нек. прогр.ед-це следует обеспечить доступность .mod-файла на этапе компиляции прогр.ед-цы и .lib-файла - на этапе компоновки.
Совсем дело упрощает использование в модуле директивы !DEC$ ATTRIBUTES OBJCOMMENT: *** компоновки библиотеки ну и т.д. и т.п.
PM MAIL   Вверх
MetalHeart
Дата 14.10.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 15.5.2009

Репутация: нет
Всего: нет




Код

MODULE SMTH
  <определения данных>
  CONTAINS
    
     определения процедур

END MODULE SMTH


А "определения процедур" это полностью подпрограмма с ее содержимым или можно только через указание имени их определить. У меня только первый вариант  получается.
PM MAIL   Вверх
FCM
Дата 14.10.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



Полностью подпрограмма или функция.

Модули также используют для хранения интерфейсов (прототипов) к функциям, определенным в других местах (подобно заголовочным файлам в С/C++)
PM MAIL   Вверх
MetalHeart
Дата 19.10.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 15.5.2009

Репутация: нет
Всего: нет



Блин, пытался сам разобраться, но не получается никак..
При компиляции моего модуля с программой пишет вот такие ошибки:
Error: The attributes of this name conflict with those made accessible by a USE statement.   [RCPAR]
Что именно ему не нравится в атрибутах никак не пойму.

Вот эта функция в модуле:

Код

!DEC$ FREEFORM
      Integer*2 function rcpar (num,string)
      Implicit Integer*2 (a-z)
      character(len=*) string
      character*256 text
        integer*2 length

      call GETARG(num, text, length )
        if (length.gt.0) then
            string = text
        else
            length = 0
        endif
        rcpar = length
      return
      end function


Вот фрагмент подпрограммы, которая к ней обращается:

 
Код

     i = rcpar (1,opt)
     i = rcpar (2,opt)
     i = rcpar (3,str)


Из-за чего возникает проблема?

P.S. Если функцию вызывать из библиотеки все компилируется и работает.

PM MAIL   Вверх
FCM
Дата 19.10.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



Где у тебя инструкция USE?

Какова структура модуля?
Должно быть

Код

MODULE M1
 CONTAINS
   INTEGER(2) FUNCTION RCPAR(...)
   ...
   END FUNCTION RCPAR
END MODULE M1


Это сообщение отредактировал(а) FCM - 19.10.2009, 15:25
PM MAIL   Вверх
MetalHeart
Дата 20.10.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 15.5.2009

Репутация: нет
Всего: нет



Сам модуль уже проверен, нормально вызывается в одной подпрограмме, а когда попробовал включить его в этой функции уже не хочет компилироваться.

Вот какая структура. 
1. (Главная программа вызывает подпрограмму  ELEPRD)
2.
    
Код

     subroutine ELEPRD

           use ELEPRDLIB
…

call myname ('eleprd','1.0 apr 2001')
if ( .not.ini_env (ihds,imod,nsys) ) then
...


(myname запускается из модуля, выполняется; по условию вызывается функция INI_ENV)

3.

Код

!DEC$ FREEFORM
 
      logical*4 function INI_ENV (ihds,imod,nsys)

            use ELEPRDLIB

      implicit none
      logical*4 put_ele
      integer*2 rcpar, ddbenv, strint, i, j, izer, ione, iuse, ihds, imod, nsys, nfil(10,2)
      integer*4 iios
      character str*256, opt*2
      parameter ( izer=0, ione=1, iuse=8 )

      include 'nxvlsm-n.inc'
      include 'nxvslz-n.inc'
      include 'nxvpar-n.inc'
      include 'ddbfil-c.inc'
      include 'elefil-c.inc'
      include 'ddbpth-c.inc'
      include 'eledat-c.inc'
      include 'elecom-c.inc'
      include 'elelle-c.inc'
      include 'eleopt-c.inc'

      data nfil /2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0/

      call runstr

      i = rcpar (1,opt)
      imod = strint (i,opt,'(i2)')
      i = rcpar (2,opt)
      ihds = strint (i,opt,'(i2)')
      i = rcpar (3,str)


Из модуля нормально вызывается подпрограмма runstr, но как только пытаюсь включить в модуль функцию rcpar появляется описанный выше конфликт.


Структура самого модуля вроде верная.


Это сообщение отредактировал(а) MetalHeart - 20.10.2009, 16:22
PM MAIL   Вверх
FCM
Дата 20.10.2009, 17:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



В INI_ENV
Цитата(MetalHeart @  20.10.2009,  16:12 Найти цитируемый пост)

Код

use ELEPRDLIB  ! Здесь есть определение rcpar
...
! Ниже повторное  "определение" rcpar
integer*2 rcpar, ddbenv, strint, i, j, izer, ione, iuse, ihds, imod, nsys, nfil(10,2)



Убери повторное "определение" rcpar . Если она описывается в модуле, то программная единица, использующая модуль знает о ней все. Ознакомься с понятиями явного и неявного интерфейса (прототипа) процедур.

В одной и той же области видимости не может быть более одного определения идентификатора.

Это сообщение отредактировал(а) FCM - 20.10.2009, 17:38
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.