C++ 来自C+的翻译检查+;去帕斯卡哪一个更好

C++ 来自C+的翻译检查+;去帕斯卡哪一个更好,c++,pointers,translate,delphi,C++,Pointers,Translate,Delphi,我将一些C++代码翻译成ObjectPascal(第一次),C++对我来说还是相当新的。 C++头文件的样子如下: class RenumFd { public: RenumFd(int length); ~RenumFd(); void CompFd(double *buff); //...other public functions cut for space private: void rmfd(int n, int isgn, double *a,

我将一些C++代码翻译成ObjectPascal(第一次),C++对我来说还是相当新的。

C++头文件的样子如下:

class RenumFd {
public:
    RenumFd(int length);
    ~RenumFd();
    void CompFd(double *buff);

//...other public functions cut for space

private:
    void rmfd(int n, int isgn, double *a, int *ap, double *kw);

//...other private functions cut for space

    int _length;
    int *_ap;
    double *_kw;
}
我这样翻译:

Type
 TRenumFD = class
 private
   _length: integer;
   _ap: Pinteger;
   _kw: Pdouble;
   procedure rmfd(n:integer; isgn:integer; var a:double; var ap:integer; var kw:double);

//... other procedures cut for space   

public
  constructor Create(const length:integer);
  destructor  Destroy(); override;
  procedure CompFd(var buff:double);
end;

我读到,C++中的参数作为指针,应该设置为对象Pascal中的var参数。这是对的,还是我应该坚持直译(担心以后被咬)

<>也在C++构造函数中有以下代码,我在一行中不确定。

RenumFd::RenumFd(int length) {
    _length = length;
    _ap = new int[2 + (1 << ((int)(log(2.0 + length) + 0.5) / 2))];
    _ap[0] = 0;  <-- is this setting the pointer to nil, or assigning 0?

    //...

}

也许我太难猜测其意图了?

使用
var
或指针的决定实际上取决于如何使用它,以及是否可以将其设置为
nil
。通常,
var
更好,但指针有它的用途。您没有提供足够的代码来显示哪个决策是最好的

至于数组分配,动态数组将是比
AllocMem()
更好的选择:

构造函数RenumFd.Create(长度:整数);
开始
设定长度(_ap,2+(1shl(Trunc(log(2.0)+0.5)div 2));

_ap[0]:=0;// 总的来说,你的译文质量很好

我读过,C++中使用的指针应该设置为var 对象Pascal中的参数。这是正确的,还是我应该坚持 更直译(担心以后被咬)

我认为这部分是正确的。使用类型化指针作为参数是较低级别的实现方法。它增加了传递空指针(
nil
)而不是实变量引用的灵活性,有效地使参数成为可选的。您应该检查代码以进行此类检查(
if(kw){*kw=…;}/*仅在请求时写入kw*/
)。如果无意使指针参数成为可选的,则应坚持使用更高级别的引用声明(
var
out

也许我太努力了,想猜出我的意图

显然,在有问题的行中得到了隐式解引用,因此它将0写入
\u ap
的第一个元素。覆盖指向最近内存分配的指针是不合逻辑的,不是吗?你的帕斯卡直译应该是:
\u ap^:=0

但是请注意,
new
运算符分配了超过1个
int
,因此您的
PInteger
类型不够,您需要
pintegeray
。即:

type TIntegerArray = array[0..MaxInt div SizeOf(Integer)] of Integer;
type PIntegerArray = ^TIntegerArray;
声明<代码>“ApAs/COD>”到这种类型将节省大量的类型转换,并且仍然尽可能接近C++原件。我不同意你需要的动态数组是绝对好的选择

最后一句话(小调):


< >我没有看到通过常数引用传递这个整数的目的,它与原来的C++代码不匹配。不会有任何影响,但我会删除
const

您应该关心析构函数和异常(与之相比,其余的都是微不足道的)!另外,你应该在Pascal中使用
Ln
表示自然对数。考虑到你已经删除了所有有趣和相关的代码,几乎不可能给出合理的建议。类型声明几乎没有泄露任何信息。用法将显示意图和语义。不管是什么代码,C++代码看起来都有点跛脚。这是80年代的密码吗?我不会翻译它。我会用我所用语言的正确习惯用法来编写新代码。我的坏习惯。我担心代码太多(你能相信吗?)。但说到你的观点。我认为这是C语言翻译成C++的。这是一些DSP工作的工程代码。我更喜欢删除旧风格的文字,让它更像OP。我们需要将它翻译成更灵活的所有操作代码,但除了使其功能化之外,如果我们能够理解每个部分就更好了。这就是我遇到的问题。我认为在OP中比C或C++更多。在我提出更多问题之前,我将尝试使用Dyn数组。我明白。@Michelle,事实上,你不需要动态数组。查看导致
new
将要分配的元素数的表达式。这是一个常数。如果您愿意牺牲那个漂亮的表达式(因为Borland编译器讨厌常量表达式中的实数),那么正则数组是适用的。我肯定没有提供足够的代码。然而,现在,回顾代码的其余部分,我实际上认为,如果我只是将变量声明为普通数组(这是将它们视为数组的关键),并通过var传递它们,结果会很好。我被困在试图把所有东西都当作指针。谢谢。这些都是很好的观点,现在看得这么清楚有点尴尬。我需要更好地破译实际内存使用情况。为了记录在案,我的第一个_ap:=?尝试是_ap^:=0,但随后是ap^[0]:=,然后。。。恐怖!再次感谢!
type
  RenumFd = class
  public
    constructor Create(length: Integer);
    //...    
  private
    _ap: array of Integer;
    //...
  end;
constructor RenumFd.Create(length: Integer);
begin
  SetLength(_ap, 2 + (1 shl (Trunc(log(2.0) + 0.5) div 2)));
  _ap[0] := 0; // <-- assigns 0 to the first integer in the array
  //...
end;
_ap[0] = 0;  <-- is this setting the pointer to nil, or assigning 0?
_ap := AllocMem(2 + (1 shl (trunc(log(2.0) + 0.5) / 2))) * sizeOf(integer));
_ap := nil;
type TIntegerArray = array[0..MaxInt div SizeOf(Integer)] of Integer;
type PIntegerArray = ^TIntegerArray;
constructor Create(const length:integer);