Доброго дня. Стоит задача на делфи "Найти на интервале [a,b] число, имеющее наибольшее количество делителей". Нужно все это выполнить с динамической и статической загрузкой из DLL библиотек.
На странице библиотеки DLL находится функция, которая рассчитывает делители. На странице unit-а эта функция вызывается.
Сейчас результат выводится неверный:
На отрезке 1..10 должно выводиться: Кол-во делителей = 3 имеют числа: 6 8 10.
В чем, причина, понять не могу. Код функции вроде как верный, проверял отдельно.
С делфи работаю недавно, так что требуется помощь.
Страница библиотеки DLL:
library PDLL;
uses
ShareMem, // Подключаем модуль ShareMem
myArray,
SysUtils,
Dialogs,
Classes,
Math;
{$R *.res}
// stdcall - используется при вызовах Winapi ф-ий (передача параметров справа на лево)
// Выходные данные:
// result - возвращает результат
function getDividers(n:integer):integer;stdcall;//функция для подсчета делителей
var i,k:integer;
begin
k:=1;//пока делитель 1, само число
for i:=1 to trunc(sqrt(n))do//от 1 до крня из числа(дальше нет смысла проверять)
if n mod i=0 then inc(k,1);//если данное число делится на очередное, прибавляем
if frac(sqrt(n))=0 then dec(k);
Result:=k;
end;
// Экспорт функции
exports getDividers;
begin
end.
Код со страницы unit-а:
unit Lab2Dynamic;
interface
uses
{myArray,} Windows, Messages, SysUtils,
Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Math;
type
TForm1 = class(TForm)
btnOpenDlgModal: TButton;
lblAverageValue: TLabel;
lblAverageValue2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure btnOpenDlgModalClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// stdcall - используется при вызовах Winapi ф-ий (передача параметров справа на лево)
function getDividers(var p:integer):integer; stdcall;
external '..\Lab3Dll\PDLL.dll';
procedure TForm1.btnOpenDlgModalClick(Sender: TObject);
var
getDividers: function(var p:integer):integer; stdcall;
// Дескриптор для dll файла
hPDLL, hPDlgModalDLL: THandle;
m,n,i:integer;
mx:integer;
begin
//try
hPDLL := LoadLibrary('..\Lab3Dll\PDLL.dll');
// Если библиотека загрузилась
if hPDLL <> 0 then begin
// Загружаем адрес функции
@getDividers := GetProcAddress(hPDLL, 'getDividers');
// Если функция ShowModaldialog присутствует в PDlgModalDLL.dll
if Addr(getDividers) <> nil then begin
m:= StrToInt(Form1.Edit1.Text);
n:= StrToInt(Form1.Edit2.Text);
mx:=1;//пока максимальное число делителей=1
for i:=m to n do//идем по интервалу
if getDividers(i)>mx then mx:=getDividers(i);//ищем сколько максимально есть делителей у этих чисел
lblAverageValue.Caption := 'Максимально кол-во делителей = ' + IntToStr(mx) + ' имеют числа:';
for i:=m to n do//снова идем по интервалу
if getDividers(i)=mx then
lblAverageValue2.Caption := lblAverageValue2.Caption + ' '+IntToStr(i);
end;
end;
{finally
FreeLibrary(hPDlgModalDLL); // Выгружаем dll
end;}
//finally
// end;
end;
end.