Начните с создания функций с двумя аргументами.(Вы знаете, что должно быть два аргумента, потому что у макросов есть два аргумента, и тела макросов не ссылаются ни на какие другие идентификаторы, кроме аргументов.
function Is_In_Search(mb: X; offset: Y): Z;
function Remove_From_Search(mb: X; offset: Y): W;
Кроме того, если вы хотите встроитькод, то есть, заставить компилятор размещать сгенерированный код, объявленный в двух вышеупомянутых функциях, на каждом call-сайте, вы можете добавить встроенную директиву к объявлениям, например так:
function Is_In_Search(mb: X; offset: Y): Z; *inline;*
function Remove_From_Search(mb: X; offset: Y): W; *inline;*
Далее, выяснитекакими должны быть эти типы. Чтобы сделать это, посмотрите, как используются аргументы и макросы.
- Мы можем догадаться, что
offset
, вероятно, является целым числом, потому что макросы используют в нем оператор по модулю.поэтому в объявлениях функций замените Y
на Integer
. - Мы не можем просто определить из определения, каким должен быть
mb
, но у вас есть остальная часть кода, так что вы можете посмотретьв местах, где используются макросы. Найдите тип первого фактического параметра, а затем замените X
на этот тип. Это, вероятно, указатель на некоторую структуру type, как запись или класс. Тип возвращаемого значения первой функции независимо от типа выражения.Вероятно, это целое число, но в зависимости от имени функции это действительно логический тип.Любое ненулевое целое число считается истинным.Заменить 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;