Алгоритмы
Программа:
Рисунок 4.3
Рисунок 4.4
Модуль:
Рисунок 4.5
Рисунок 4.6
Рисунок 4.7
Рисунок 4.8
Лабораторная работа №8
Использование динамически подключаемой библиотеки (DLL)
Задание: Создать программу, согласно варианту задания предыдущей лабораторной. Необходимые подпрограммы разместить в библиотеке DLL.
Интерфейс программы
Интерфейс программы идентичен предыдущей работе.
Код программы
Исходный код библиотеки DLL:
library Project1;
uses SysUtils,Classes,UnitType in 'UnitType.pas';
function MidArray ( Masr : TExt) : extended; // среднее арифметическое положительных элементов массива
var mid,sym: extended;
col,n: integer;
begin
n:=0;
sym:=0;
for col:=0 to length(masr)-1 do
if masr[col]>0 then
begin
sym:= sym + masr[col];
n:=n+1;
end;
if sym=0 then mid:=0 else
mid:= sym/n;
midarray:= mid;
end;
Function DiagSum (A:TMas):extended;//вход: 2мерный массив extended'ов выход: extended
var
Sum: extended;
i,j: integer;
begin
Result:=0;
if Length (A[0])>Length (A) then
for j := 0 to Length (A)-1 do
result:=result+A[j,j]
else
for i := 0 to Length(A[0])-1 do
result:=result+A[i,i];
DiagSum:=result;
End;
procedure GenMas(Ncol,Nrow:word; var Zap:TMas);
var col,row:integer;
begin
SetLength(Zap,Nrow,Ncol);
for col:=0 to Ncol-1 do
for row := 0 to Nrow - 1 do
Zap[row,col]:=(random(100)-random(50));
end;
procedure GenMasO(Nocol:integer; var Zapo:TExt);
var col:integer;
begin
randomize;
SetLength(Zapo,Nocol);
for col:=0 to Nocol-1 do
Zapo[col]:=(random(100)-random(50));
end;
{$R *.res}
exports
MidArray name 'Mid',
DiagSum name 'D1',
GenMasO name 'Gen1',
GenMas name 'Gen2';
begin
end.
Исходный код программы:
procedure TForm2.Button1Click(Sender: TObject);
begin
H:=LoadLibrary('Project1.dll');
if H=0 then
showmessage('ошибка dll');
@Mid:=GetProcAddress(H,'Mid');
if @Mid<>nil then
begin
ShowMessage('Ср. арифметическое положит элементов:'+FloatToStr(Mid(Mas2)));
end
else
showmessage('ошибка адреса');
exit;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
H:=LoadLibrary('Project1.dll');
if H=0 then
showmessage('ошибка dll');
@D1:=GetProcAddress(H,'D1');
if @D1<>nil then
begin
ShowMessage('Сумма элементов главной диагонали: '+FloatToStr(D1(Mas1)));
end
else
showmessage('ошибка адреса');
exit;
end;
procedure TForm2.Button3Click(Sender: TObject);
var col:integer;
begin
H:=LoadLibrary('Project1.dll');
if H=0 then
showmessage('ошибка dll');
@Gen1:=GetProcAddress(H,'Gen1');
if @Gen1<>nil then
begin
SG2.ColCount:=SE3.Value;
Gen1(SE3.Value,Mas2);
for col := 0 to SE3.Value - 1 do
SG2.Cells[col,0]:=FloatToSTR(Mas2[col]);
Button1.Enabled:= true;
end
else
showmessage('ошибка адреса');
exit;
end;
procedure TForm2.Button4Click(Sender: TObject);
var col,row:integer;
begin
H:=LoadLibrary('Project1.dll');
if H=0 then
showmessage('ошибка dll');
@Gen2:=GetProcAddress(H,'Gen2');
if @Gen2<>nil then
begin
SG1.ColCount:=SE1.Value;
SG1.RowCount:=SE2.Value;
Gen2(SE1.Value,SE2.Value,Mas1);
for col := 0 to SE1.Value - 1 do
for row := 0 to SE2.Value - 1 do
SG1.Cells[col,row]:=FloatToSTR(Mas1[row,col]);
Button2.Enabled:= true;
end
else
showmessage('ошибка адреса');
Exit;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeLibrary(H);
end;