1

私は Python4Delphi を使用しており、デモの WrapDelphiDemo を実行しようとしています。

すべきことは、1000000 までの値の素数の量を計算することです。

期待値は 78498 ですが、デモ コードを実行すると 575843 になります。

関数のパラメーター値「MaxN」は、予想される 1000000 ではなく、常に 8574564 の固定値であることがわかりました。

class function TDelphiFunctions.count_primes(MaxN: integer): integer;
var
  Count : integer;
begin
  Count := 0;
  ShowMessage(format('function parameter MaxN=%d is WRONG!!!! Should be 1000000!!!',[MaxN]));
  //MaxN := 1000000;
  TParallel.&For(2, MaxN, procedure(i: integer)
    begin
      if IsPrime(i) then
        AtomicIncrement(Count);
    end);
  Result := Count;
end;

Win7でDelphi Seattleを使用しています。

Python4Delphi は GitHub の最新版です。

オリジナルのデモコードを使用しています。

適応する必要があるのは、シアトル バージョンではインライン変数定義を使用できないことです。

私に何ができるか考えている人はいますか?

MainForm の完全なコードは次のとおりです。

unit MainForm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, SynEdit, Vcl.StdCtrls,
  PythonEngine, PythonGUIInputOutput, SynEditPythonBehaviour,
  SynEditHighlighter, SynEditCodeFolding, SynHighlighterPython, Vcl.ExtCtrls,
  WrapDelphi;

type
  TForm1 = class(TForm)
    sePythonCode: TSynEdit;
    HeaderControl1: THeaderControl;
    Panel1: TPanel;
    Splitter1: TSplitter;
    Panel2: TPanel;
    HeaderControl2: THeaderControl;
    mePythonOutput: TMemo;
    SynPythonSyn: TSynPythonSyn;
    SynEditPythonBehaviour: TSynEditPythonBehaviour;
    PythonEngine: TPythonEngine;
    PythonGUIInputOutput: TPythonGUIInputOutput;
    btnRun: TButton;
    PyDelphiWrapper: TPyDelphiWrapper;
    PythonModule: TPythonModule;
    procedure FormCreate(Sender: TObject);
    procedure btnRunClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  System.Rtti,
  System.Threading,
  System.Math;

type
  TDelphiFunctions = record
    class function count_primes(MaxN: integer): integer; static;
  end;

var
  DelphiFunctions: TDelphiFunctions;


procedure TForm1.FormCreate(Sender: TObject);
var
  Py : PPyObject;
begin
  Py := PyDelphiWrapper.WrapRecord(@DelphiFunctions, TRttiContext.Create.GetType(TypeInfo(TDelphiFunctions)) as TRttiStructuredType);
  PythonModule.SetVar('delphi_functions', Py);
  PythonEngine.Py_DecRef(Py);
end;

procedure TForm1.btnRunClick(Sender: TObject);
begin
  GetPythonEngine.ExecString(UTF8Encode(sePythonCode.Text));
end;

function IsPrime(x: Integer): Boolean;
var
  q, i : integer;
begin
  if (x <= 1) then Exit(False);

  q := Floor(Sqrt(x));
  for i := 2 to q do
    if (x mod i = 0) then
      Exit(False);
  Exit(True);
end;

class function TDelphiFunctions.count_primes(MaxN: integer): integer;
var
  Count : integer;
begin
  Count := 0;
  ShowMessage(format('function parameter MaxN=%d is WRONG!!!! Should be 1000000!!!',[MaxN]));
  //MaxN := 1000000;
  TParallel.&For(2, MaxN, procedure(i: integer)
    begin
      if IsPrime(i) then
        AtomicIncrement(Count);
    end);
  Result := Count;
end;

end.
4

0 に答える 0