Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2011, 18:57   #21
Davlet M
Пользователь
 
Регистрация: 27.08.2009
Сообщений: 34
По умолчанию

в с++ пишу:
Код:
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

  float C = 5.2;
  float A = 2.08;
  float D1 = 0.26;
  float E1 = 9.2;
  float B1 = 2.6;
  float FU1 = 30.0;
  float FU2 = 57.0;
  float KU = 100;
  float JI = 1;
  float J1 = 3;
  float VH = 1.5;
  float ST1 = 0.66;
  float ZA = 0.173;
  float ZB = 0.173;
  float K1 = 20;


int maino() {

   HMODULE  hDll ;
   int rCode = 0;


   hDll = LoadLibrary( "ACHH1.dll" ) ; // handler to the loaded DLL
   if ( hDll == NULL ) 
     {  
       Application->MessageBox("1",MB_OK);
       return -1 ;
     }

   typedef float __stdcall ACHH( float*, float*, float*, float*, float*,
                                 float*, float*, float*, float*, float*,
                                 float*, float*, float*, float*, float*) ;     
   ACHH* pACHH = (ACHH*) GetProcAddress( hDll, "ACHH" );
   if ( pACHH == NULL )
     {   
       Application->MessageBox("2",MB_OK);
       return -1 ;
     }

   rCode = (long) (*pACHH)(&C,&A,&D1,&E1,&B1,&FU1,&FU2,
                           &KU,&JI,&J1,&VH,&ST1,&ZA,&ZB,&K1);
   if ( rCode == 0 ) 
    {
     Application->MessageBox("!!!",MB_OK);
    }
   return rCode ;

   FreeLibrary(hDll);

}
в фортране пишу:

Код:
 FUNCTION ACHH(C,A,D1,E1,B1,FU1,FU2,KU,JI,J1,VH,ST1,ZA,ZB,K1)
	!DEC$ ATTRIBUTES DLLEXPORT::ACHH 
            .............................................................
может я неправильно создаю длл, или может имеет значение, что у меня в головном модуле фортрана вызываются сабрутины??
Davlet M вне форума Ответить с цитированием
Старый 03.03.2011, 19:35   #22
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

О, так она ещё и гуёвая будет Это Вы фортрановские отладочные PRINT-ы долго будете вспоминать "незлим тихим"...

Замените здесь
Код:
!DEC$ ATTRIBUTES DLLEXPORT::ACHH
DEC на MS:
Код:
!MS$ ATTRIBUTES DLLEXPORT::ACHH
Постройте DLL. Просмотрите её любым вьювером (не обязательно 16-ричным; <F3> в Total Commander достаточно). Попытайтесь найти имя _ACHH@64 Есть такое?
Vago вне форума Ответить с цитированием
Старый 03.03.2011, 19:40   #23
Davlet M
Пользователь
 
Регистрация: 27.08.2009
Сообщений: 34
По умолчанию

есть такое вот: ACHH1.dll _ACHH@60
Davlet M вне форума Ответить с цитированием
Старый 03.03.2011, 19:45   #24
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Вот чёрт, уже до пятнадцати сосчитать не могу! :D
Ну теперь в C++ в параметрах GetProcAddress() меняйте ACHH на это самое _ACHH@60 . Думаю, что по крайней мере войти теперь она в Фортран войдёт...
Vago вне форума Ответить с цитированием
Старый 03.03.2011, 20:23   #25
Davlet M
Пользователь
 
Регистрация: 27.08.2009
Сообщений: 34
По умолчанию

Огромное спасибо))

Последний раз редактировалось Davlet M; 03.03.2011 в 20:27.
Davlet M вне форума Ответить с цитированием
Старый 03.03.2011, 22:36   #26
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Пожалуйста Теперь Вам, как Вы уже поняли, пока межпрограммный интерфейс не устаканится, придётся следить за списком параметров Добавили параметр - увеличилось на 4 число после собаки в имени точки входа. Удалили - уменьшилось. 4*количество_параметров там обычно стоит.

Ну и ещё. Совершенно не зная, что у Вас за задача и что за методы, подумал бы, тем не менее, о переходе на восьмибайтовую плавающую арифметику. Сейчас уже не ЕСовские времена, когда каждый байт и каждая минута машинного времени были на вес золота.
Vago вне форума Ответить с цитированием
Старый 05.03.2011, 21:05   #27
Davlet M
Пользователь
 
Регистрация: 27.08.2009
Сообщений: 34
По умолчанию

еще такой вопрос, можно ли как-то ожидать завершения этой длл?
Davlet M вне форума Ответить с цитированием
Старый 05.03.2011, 22:06   #28
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Не совсем понял вопрос. Что значит "завершение dll"? Есть понятие "выход из подпрограммы" или "возврат в вызывающую программу". В фортрановской подпрограмме происходит по оператору RETURN и по своей идеологии ничем не отличается от возврата по return в C / C++.
Vago вне форума Ответить с цитированием
Старый 06.03.2011, 00:11   #29
Davlet M
Пользователь
 
Регистрация: 27.08.2009
Сообщений: 34
По умолчанию

дело в том, что в длл происходит расчет, результат которого - массив, я в цикле в с++ много раз анализирую массив и заново запускаю длл, так вот у меня выбивает ошибку, скорее всего из-за того, что длл не успевает выполнится. так вот мне нужно как-то осуществить прерывание кода с, пока длл не закончит расчет.
Davlet M вне форума Ответить с цитированием
Старый 06.03.2011, 00:28   #30
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Откуда там "не успевает"? Откуда там взяться распараллеливанию? Обычный CALL, только из C++. Ну поставьте, для отладки, в Фортране ввод какого-нибудь фиктивного значения, чтобы притормозить выполнение, непосредственно перед возвратом, а в C++ - контрольную печать сразу после вызова. Неужели возникнет случай, когда печать появится раньше запроса на ввод?
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание dll на с++ для 1с8 zladej Общие вопросы C/C++ 0 05.07.2010 13:11
Создание dll John_chek Общие вопросы Delphi 3 24.09.2007 14:26
Создание dll файла для работы с БД Nadya БД в Delphi 2 15.02.2007 12:54