我在C ++中有下一个代码:
for (long i=0; i < num_iter ; i++)
{
bp->bpgt(data[i%8], &data[i%8][3]);
if( bp->mse(&data[i%8][3]) < thresh)
break;
}
其中bpgt是一个过程,mse是一个函数,thresh是一个Double类型,data是一个Double类型的二维矩阵。
void bpgt(double *in,double *tgt);
double mse(double *tgt);
double data[][4]={
0,0,0,0,
0,0,1,1,
1,1,1,1 };
我试图将它传递给Delphi代码:
for i := 0 to FNum_Iter - 1 do begin
FBPN.bpgt(FData[i mod 8], ^FData[i mod 8,3]);
if FBPN.mse(@FData[i mod 8, 3]) < FThresh then
Break;
end;
但我失败了,因为我是C ++的新手,我不知道翻译“&amp;”运营商。愿有人帮助我吗?
提前致谢。
答案 0 :(得分:2)
我会翻译
void bpgt(double *in,double *tgt);
as
procedure bpgt(var in:double; var tgt: double)
嗯,就像那样,我的德尔福有点生疏......
这样,在bpgt中,你可以改变tgt(和in)的值。
你的bpgt电话将是
FBPN.bpgt(FData[i mod 8], FData[i mod 8,3]);
事实上,Delphi的var(通过引用调用)经常可以用作C / C ++指针传递的精确功能等价物。
答案 1 :(得分:2)
这是基于你对Fvu答案的回复。如果它们是阵列,那可能会使事情变得复杂,因为C没有真正的数组,只是指针上撒上一层粉末状的合成糖。解决方案取决于您是将其完全转换为Delphi,还是尝试编写可与C代码一起使用的Delphi例程。
如果您正在使用纯Delphi,请声明一个数组类型,如此
type
TDoubleArray = array[0..length] of double; //or "array of double" for a dynamic array
然后将函数的参数声明为var Data: TDoubleArray
。如果这是动态数组,请将 for 循环从0 to high(Data);
如果需要使用C:
因为C没有真正的数组,所以你需要做一些额外的工作。声明你的类型:
type
TCDoubleArray = array[0..65535] of double;
PCDoubleArray = ^TCDoubleArray;
任何足够大的值都适用于数组的上限。无论如何,我们不打算全部使用它。它必须比你用过的更大。使参数类型为PCDoubleArray,对应double *
。您需要传递一个额外的参数,该参数告诉您数组的终点在哪里。让你的for循环从0到结束点,并通过说FData^[i mod 8]
之类的东西来访问它。
答案 2 :(得分:0)
&amp;允许您将变量的地址发送到函数中,而不是它的值。此引用调用允许函数更改变量的值。我不知道等效的Delphi机制,但你想在那里传递变量的引用,或者将过程改为函数,返回值并将其存储在原始变量中。
答案 3 :(得分:0)
你很亲密,试试这个:
for i := 0 to FNum_Iter - 1 do begin
FBPN.bpgt(FData[i mod 8], FData[i mod 8,3]);
if FBPN.mse(FData[i mod 8, 3]) < FThresh then
Break;
end;
很抱歉,我在这里没有delphi来编译并亲自试用。
答案 4 :(得分:0)
在Rudy's Delphi Corner,他有一个excellent article about the pitfalls of converting C/C++ to Delphi。在我看来,这是尝试此任务时的基本信息。这是描述:
本文适用于所有人 需要将C / C ++标头转换为 德尔福。我想分享一些 你可以遇到的陷阱 从C或C ++转换。本文 不是教程,只是讨论 经常遇到的问题 案例。它适合初学者 以及更有经验的人 C和C ++的翻译。
他还写了一个“Conversion Helper Package”,安装到Delphi IDE中,有助于将C / C ++代码转换为Delphi:
(来源:rvelthuis.de)
他关于这个主题的其他相关文章包括: