Answer the question
In order to leave comments, you need to log in
Why is a function not working properly in Delphi WinApi?
Good day. There is a task in Delphi "Find on the interval [a,b] the number that has the largest number of divisors". All this needs to be done with dynamic and static loading from DLL libraries.
The DLL page contains a function that calculates divisors. On the unit page, this function is called.
Now the result is displayed incorrectly:
On the segment 1..10 it should be displayed: Number of divisors = 3 have numbers: 6 8 10.
I can’t understand what the reason is. The function code seems to be correct, I checked it separately.
I'm new to Delphi, so I need help.
DLL page:
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 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.
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question