-4

我正在尝试将这篇维基百科文章中的这段代码从 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;
}

我找不到与那里使用的 rot 函数等效的函数

4

2 回答 2

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 使用布尔值而不是整数(但请确保适当地调整调用代码)。

于 2015-08-13T06:12:40.830 回答
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 缺乏的一个特性。

于 2015-08-13T06:12:32.157 回答