1

我正在使用 Python4Delphi 并尝试让演示 WrapDelphiDemo 运行。

它应该做的是计算高达 1000000 的值的素数数量。

预期值为 78498,但当我让演示代码运行时,我得到 575843。

我发现函数的参数值“MaxN”始终是固定值 8574564,而不是预期的 1000000。

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