我正在尝试将一些C ++代码翻译成Delphi。
C ++代码处理一些Single的数组:
const float* const inp
const float* const prWeight
我已经定义了以下类型来处理它们:
type
TSingleArray = array of Single;
PSingleArray = ^TSingleArray;
当C代码添加到变量时,如下所示:
inp += 5
我假设变量用第5次出现的偏移量更新 我可以将索引设置为5并访问5出现的值,如下所示:
i := 5;
PSingleArray(inp)^[i] := 0.5;
和c代码:
for (int j = 5; j; --j) {
*inp++ += *prWeight++*ari;
可以翻译为
x := 0;
for j := 5 downto 0 do
begin
Inc(i);
PSingleArray(inp)^[i] := PSingleArray(inp)^[i] +
PSingleArray(prWeight)^[x] * ari;
end;
这是正确的吗?
我也在想。应:
inp[k++] = nc == 1;
inp[k++] = nc == 2;
inp[k++] = nc >= 3;
是:
Inc(k);
PSingleArray(inp)^[k] := Ord(nc = 1);
Inc(k);
PSingleArray(inp)^[k] := Ord(nc = 2);
Inc(k);
PSingleArray(inp)^[k] := Ord(nc = 3);
或:
Inc(k);
PSingleArray(inp)^[k] := Ord(nc = 1);
PSingleArray(inp)^[k] := Ord(nc = 2);
PSingleArray(inp)^[k] := Ord(nc = 3);
我只是不确定这是否正确。有人有线索吗?
答案 0 :(得分:0)
你不应该尝试直接翻译,特别是使用混合指针/数组算法。
一些注意事项:
删除PSingleArray
。 Delphi没有C指针和数组之间的隐式转换。指针上的所有算术都需要成为数组索引的算术运算。指针的副本是数组索引的副本。增量指针上的数组索引成为多个索引部分的总和。
这些代码中的一部分是单一的C代码,你不必制作更加单一的Delphi
for (int j = 5; j; --j) {
*inp++ += *prWeight++*ari;
}
// previous incrementing of inp went into i
for j := 0 to 4 do
begin
inp[i + j] := inp[i + j] + prWeight[j] * ari;
end;
i = i + 5;
请注意,C中的范围是半开的,不使用结束索引。
inp[k++] = ...
使用后增量运算符。使用的索引是k的未修改值,因此变为inp[k] := ...; Inc(k);
。另请注意>=
的使用。我不建议仅将Boolean => Single
转换为1.0
和0.0
,但我缺乏建议更好设计的背景。