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.
谁能帮我?
谢谢
你不是在告诉如何声明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)
首先创建两个参数函数.(你知道它应该是两个参数,因为宏有两个参数,宏的主体除了参数之外不引用任何其他标识符.
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可能是一个整数,因为宏使用模运算就可以了,所以更换Y用Integer在你的函数声明.mb应该是什么,但是你有其余的代码,所以你可以看一下使用宏的地方.找到第一个实际参数的类型,然后替换X为该类型.它可能是指向某种结构类型的指针,如记录或类.第一个函数的返回类型是表达式的类型.这可能是一个整数,但根据函数的名称,它实际上是一个布尔类型.任何非零整数都被认为是真的.替换Z为Boolean.
第二个宏的结果可能也是一个整数,但它的名称和语法表明它的结果总是被忽略,所以你可以摆脱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)