B
B
busidoway2016-11-27 23:51:18
Delphi
busidoway, 2016-11-27 23:51:18

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:
2becc193cf674147998e57c37c5780ed.jpg
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.

Code from the unit page:
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 question

Ask a Question

731 491 924 answers to any question