Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.15;
Скачать: CL | DM;

Вниз

Как поженить фортрановскую 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
1-46330
Arhangel
2002-04-03 19:53
2002.04.15
Как поменять системную дату?


6-46464
zh
2001-12-21 15:27
2002.04.15
Передача данных


1-46307
Glonia Zbanov
2002-04-03 15:22
2002.04.15
WM_GETMINMAXINFO сразу для всех форм


3-46235
Rammst
2002-03-25 07:59
2002.04.15
Определение ... (HELP!!!)


1-46300
Martyn
2002-04-02 11:27
2002.04.15
Вопрос по печати Bitmap в Delphi