Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.188.148.71] |
|
Сообщ.
#1
,
|
|
|
ПОмогите кто сталкивался!!!
Проблема заключается в том что в ДЛЛ нужно передать масив (двухмерный) не определенного размера. А из ДЛЛ нужно получить масив (одномерный) тоже не определенного размера. Размер по ходу меньше 100 поетому я в проге и в ДЛЛ создал два типа mas=array[0..100,0..100] of real; arra=array[0..100] of real ; ДЛЛ вызываю динамически но оно чет не хочет пахать там где должна вызыватся функция из ДЛЛ произходит ошыбка. Вот фрагменты кода: ПРограммы: procedure TfMain.btnVidClick(Sender: TObject); var i: integer; vid:arra; begin @vidhul:= nil; hLib:= LoadLibrary('5_DLL'); if hLib < 32 then begin ShowMessage('Dll не загружено!'); Exit; end; if chbAutoClear.Checked then mmRes.Lines.Clear; mmRes.Lines.Add('отклоннения среднего столбца : '); vid:=vidhul(ar,sgres.ColCount,sgres.rowcount); for i:=1 to sgres.ColCount-2 do mmRes.Lines.Add(floattostr(vid[i])); FreeLibrary(hLib); end; ДЛЛ: function Vidhul(ar:mas;Cl,Rw: integer):arra; export; stdcall; var count,i,j:integer; ser:real; begin count:=0; ser:=0; for i := 0 to CL-2 do for j := 0 to Rw-2 do begin ser:=ser+ar[i,j]; inc(count); end; ser:=ser/count; for i := 0 to Cl-2 do result[i]:=(ser-abs(ar[i,trunc((Cl)/2)])); end; я уже 10 раз проверял все кажись правильно но выкидает ошыбку пишет: Project 5.exe raised exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'. Process stopped. Use step to Run continiue Пишу на Делфи 6 |
Сообщ.
#2
,
|
|
|
library Project1; {$R *.res} uses Types; type PSingleDynArray = ^TSingleDynArray; TSingleDynArray = array of Real; TDoubleDynArray = array of array of Real; function Test(const InValue: TDoubleDynArray; const ArrayLength: TSize; var OutValue: TSingleDynArray): Boolean; stdcall; var Count, X, Y: Integer; Ser: Real; AOutValue: TSingleDynArray; begin Result := True; try Count := 0; Ser := 0; for X := 0 to ArrayLength.cx - 2 do for Y := 0 to ArrayLength.cy - 2 do begin Ser := Ser + InValue[X, Y]; Inc(Count); end; Ser := Ser / Count; for X := 0 to ArrayLength.cx - 2 do OutValue[X]:=(Ser - Abs(InValue[X, Trunc(ArrayLength.cx / 2)])); except Result := False; end; end; exports Test; begin end. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation type PSingleDynArray = ^TSingleDynArray; TSingleDynArray = array of Real; TDoubleDynArray = array of array of Real; function Test(const InValue: TDoubleDynArray; const ArrayLength: TSize; var OutValue: TSingleDynArray): Boolean; stdcall; external 'project1.dll'; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var X, Y: Integer; InArray: TDoubleDynArray; InSize: TSize; OutArray: TSingleDynArray; begin Randomize; InSize.cx := 20; InSize.cy := 20; SetLength(InArray, InSize.cx, InSize.cy); for X := 0 to InSize.cx - 1 do for Y := 0 to InSize.cy - 1 do InArray[X, Y] := Random(100); SetLength(OutArray, InSize.cx); if Test(InArray, InSize, OutArray) then // тут работаем с массивом end; end. |
Сообщ.
#3
,
|
|
|
Спасибо так рабтоет.
Но есть еще вопрос: а можно зделать так как я делал, чтобы ДЛЛ загружалось динамически по надобности. |
Сообщ.
#4
,
|
|
|
Угу, LoadLibrary + GetProcAddress
|