Форум: "Основная";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];
ВнизКак поженить фортрановскую dll( с параметрами) и Delphi? ...... Найти похожие ветки
← →
MIg (2002-03-29 15:33) [0]Раньше мне писаль на фортране ДЛЛ-ки с процедурой без параметров. Я их подключал без проблем.
Допустим:
-----
procedure mapr;stdcall;
...
...
...
procedure mapr;external "c:\Kommod\DLL\Mapdll" name "mapr";
-----
Вот...
А сейчас дали процедурку:
Subr midplan(Tb,npl,ep,r);
Где
Tb(6) - real*8
npl,Ep - integer
на выходе
z(3) - real*8;
Попытался я ее так вызвать:
-----
type TDigits = array[1..8] of Real;//это я из Хелпа взял, иначе массив не получается описать
TDigits1 = array[1..3] of Real;
procedure midplan(tb: TDigits;npl:integer;ep:integer;var r:TDigits1);stdcall;
-------
Проект компиллируется, но при запуске выдает такое окошко:
"Точка входа в процедуру _FIIfexp_не найдена в библиотеке DLL DFORRT.dll"
И все. Ничего не работает.
Подскажите, пожалуйста.
-----
← →
PVOzerski (2002-03-29 16:00) [1]Из общих соображений:
1) в Fortran передача параметров по крайней мере раньше была только по ссылке (аналог Паскального (var Param...));
2) А почему Stdcall? Может, лучше Pascal (в Delphi по умолчанию
не Pascal, а Register, так что Pascal надо указать явно);
3) А что же всё-таки такое _FIIfexp_? Кто эту процедуру пытается
вызывать из этой DFORRT.dll?
← →
MIg (2002-03-29 16:30) [2]///2) А почему Stdcall?
Честно говоря, я другого способа не знаю(этот в книжке нашел и начал пользоваться).
//Может, лучше Pascal
А как?
//3) А что же всё-таки такое _FIIfexp_? Кто эту процедуру пытается вызывать из этой DFORRT.dll?
Если бы я знал.......Явно никто к ней не обращается.
Может в описании параметров я из Real*8 неправильно в Делфи перевел?...Или еще чего нибудь
← →
PVOzerski (2002-03-29 16:43) [3]>//Может, лучше Pascal
>А как?
А прямо вместо слова Stdcall написать слово Pascal.
>А сделайте дамп Вашей Fortran-овской dll и посмотрите, что
и откуда она импортирует. Хотя, конечно, может быть и динамическая загрузка. Окошко-то с сообщением кто делает - система или dll (сорри, у меня английсая NT4, так что как выглядят подобные сообщения на русских Виндах, мне не посмотреть.
← →
Ник (2002-03-29 19:27) [4]Вот пример работающего кода.
DLL фортрановская.
Используются указатели.
unit truddllpas;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
md1 = array[1..1000]of double;
int1d=array[1..50]of longint;
md2 = array[1..1000,1..20]of double;
int2d=array[1..1000,1..20]of longint;
Procedure Clir(m,n:longint;Pv,PNpi,Pjc,Pfc,Psw,Pdmin,Phc:Pointer);
stdcall;external"truddll.dll"index 1;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
var
fc:md1;
Npi:int1d;
v : md2;
sw : int2d;
m,n,jc : longint;
Dmin,Hc :double;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i,j :integer; Fs:TextFile;st:string;
begin
try
AssignFile(Fs,"updat");Reset(Fs);
readln(Fs,m,n);
for j:=1 to n do
for i:=1 to m do read(Fs,v[j,i]);
CloseFile(Fs);
Npi[1]:=12; Npi[2]:=34567;
Clir(m,n,@v,@Npi,@jc,@fc,@sw,@Dmin,@Hc);
AssignFile(Fs,"fbs");Rewrite(Fs);
writeln(Fs,jc);
for i:=1 to jc do writeln(Fs,fc[i]);
CloseFile(Fs);
str(jc,st);Edit1.Text:=st;
str(Dmin:10:3,st);Edit2.Text:=st;
str(Hc:10:3,st);Edit3.Text:=st;
except
exit;end;
end;
end.
← →
MIg (2002-04-01 14:59) [5]Получилось, большое спасибо!!!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c