busidoway
@busidoway

Почему неправильно работает функция в Delphi WinApi?

Доброго дня. Стоит задача на делфи "Найти на интервале [a,b] число, имеющее наибольшее количество делителей". Нужно все это выполнить с динамической и статической загрузкой из DLL библиотек.
На странице библиотеки DLL находится функция, которая рассчитывает делители. На странице unit-а эта функция вызывается.
Сейчас результат выводится неверный:
2becc193cf674147998e57c37c5780ed.jpg

На отрезке 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.
  • Вопрос задан
  • 283 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы