我正在尝试将这段代码从this wikipedia article从C转换为Delphi。
//convert (x,y) to d
int xy2d (int n, int x, int y) {
int rx, ry, s, d=0;
for (s=n/2; s>0; s/=2) {
rx = (x & s) > 0;
ry = (y & s) > 0;
d += s * s * ((3 * rx) ^ ry);
rot(s, &x, &y, rx, ry);
}
return d;
}
我找不到与那里使用的腐烂函数相当的
答案 0 :(得分:2)
您可以使用 Var 关键字在Delphi中通过引用传递函数,这与在链接的C代码中将指针传递给int实现相同的结果:
procedure Rot(N : Integer; RX, RY : Boolean; Var X, Y : Integer);
var
T : Integer;
begin
If Not RY then
begin
If RX then
begin
X := N - 1 - X;
Y := N - 1 - Y;
end;
T := X;
X := Y;
Y := T;
end;
end;
请注意,参数顺序已更改。我将通过引用传递的参数和通过值传递的参数组合在一起。对于RX和RY,您可以使用布尔值而不是整数(请确保您正确调整调用代码)。
答案 1 :(得分:0)
此rot
不是标准功能。相反,它是您正在翻译的代码的一部分。您只需要继续阅读您链接的文章。您可以在以下几行找到:
//rotate/flip a quadrant appropriately
void rot(int n, int *x, int *y, int rx, int ry) {
if (ry == 0) {
if (rx == 1) {
*x = n-1 - *x;
*y = n-1 - *y;
}
//Swap x and y
int t = *x;
*x = *y;
*y = t;
}
}
您需要将此功能与问题中的代码一起翻译。我相信你不需要我翻译这么简单的功能。
我会说rx
和ry
真的是布尔值,你可能会用这种方式更好地编码。本文中的代码是用C语言编写的,它早于C类布尔类型。也就是说,问题中的函数对这些“布尔值”执行算术运算,因此编写一个干净的字面翻译有点棘手。
作为指针传递的参数可能更好作为var
参数,因此通过引用传递。再一个C缺乏的功能。