C++ 来自C+的翻译检查+;去帕斯卡哪一个更好
我将一些C++代码翻译成ObjectPascal(第一次),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++头文件的样子如下:
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);