将定义从C转换为Delphi

pau*_*ohr 0 c delphi function definition

我正在将一个开源应用程序从C转换为Delphi,但是我在转换这些行时遇到了问题:

#define IS_IN_SEARCH(mb, offset) (mb->searchmask[(offset)/8] & (1<<((offset)%8)))
#define REMOVE_FROM_SEARCH(mb, offset)  mb->searchmask[(offset)/8] &= ~(1<<((offset)%8));
Run Code Online (Sandbox Code Playgroud)

我唯一想做的就是创建一个函数,但不知道其余的..

我不知道如何将其转换为Delphi.

谁能帮我?

谢谢

RRU*_*RUZ 5

你不是在告诉如何声明mb变量,所以这只是一个伪代码.

//IS_IN_SEARCH(mb, offset) (mb->searchmask[(offset)/8] & (1<<((offset)%8)))
function IS_IN_SEARCH(mb:typegoeshere; offset: Integer) : Boolean;
begin
 Result:= (mb.searchmask[offset div 8] AND (1 shl (offset mod 8)))<>0;
end;


//REMOVE_FROM_SEARCH(mb, offset)  mb->searchmask[(offset)/8] &= ~(1<<((offset)%8))
procedure REMOVE_FROM_SEARCH(mb:typegoeshere; offset: Integer);
begin
 mb.searchmask[offset div 8] := mb.searchmask[offset div 8] AND not (1 shl (offset mod 8));
end;
Run Code Online (Sandbox Code Playgroud)


Rob*_*edy 5

首先创建两个参数函数.(你知道它应该是两个参数,因为宏有两个参数,宏的主体除了参数之外不引用任何其他标识符.

function Is_In_Search(mb: X; offset: Y): Z;
function Remove_From_Search(mb: X; offset: Y): W;
Run Code Online (Sandbox Code Playgroud)

此外,如果您希望内联代码,意思是,让编译器将生成的代码放在每个调用站点的上述2个函数中,您可以将内联指令添加到声明中,如下所示:

function Is_In_Search(mb: X; offset: Y): Z; *inline;*
function Remove_From_Search(mb: X; offset: Y): W; *inline;*
Run Code Online (Sandbox Code Playgroud)

接下来,弄清楚那些类型应该是什么.为此,请查看参数和宏的使用方式.

  • 我们可以猜测,offset可能是一个整数,因为宏使用模运算就可以了,所以更换YInteger在你的函数声明.
  • 我们无法从定义中分辨出mb应该是什么,但是你有其余的代码,所以你可以看一下使用宏的地方.找到第一个实际参数的类型,然后替换X为该类型.它可能是指向某种结构类型的指针,如记录或类.
  • 第一个函数的返回类型是表达式的类型.这可能是一个整数,但根据函数的名称,它实际上是一个布尔类型.任何非零整数都被认为是真的.替换ZBoolean.

    第二个宏的结果可能也是一个整数,但它的名称和语法表明它的结果总是被忽略,所以你可以摆脱W并将第二个函数改成一个过程.

最后,填写函数的主体.将C语法转换为Delphi,你得到这个:

function Is_In_Search(mb: X; offset: Integer): Boolean;
begin
  Result := 0 <> (mb.searchmask[offset div 8] and (1 shl (offset mod 8)));
end;

procedure Remove_From_Search(mb: X; offset: Integer);
begin
  mb.searchmask[offset div 8] := mb.searchmask[offset div 8] and not (1 shl (offset mod 8));
end;
Run Code Online (Sandbox Code Playgroud)