Преобразование определений из C в Delphi - PullRequest
0 голосов
/ 03 апреля 2012

Я конвертирую приложение с открытым исходным кодом из 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));

Единственное, что я предполагаю сделать, это создать функцию, но остальное не знаю ..

Понятия не имею, как преобразовать его в Delphi.

Кто-нибудь может мне помочь?

Спасибо

Ответы [ 2 ]

5 голосов
/ 03 апреля 2012

Начните с создания функций с двумя аргументами.(Вы знаете, что должно быть два аргумента, потому что у макросов есть два аргумента, и тела макросов не ссылаются ни на какие другие идентификаторы, кроме аргументов.

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;
5 голосов
/ 03 апреля 2012

Вы не говорите, как объявляется переменная 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;
...