2013-01-15 4 views
2

У меня есть код C. Мне нужна помощь, чтобы перевести его на код Delphi.C header to delphi

1)

/* 
* Color is packed into 16-bit word as follows: 
* 
* 15  8 7  0 
* XXggbbbb XXrrrrgg 
* 
* Note that green bits 12 and 13 are the lower bits of green component 
* and bits 0 and 1 are the higher ones. 
* 
*/ 
#define CLR_RED(spec)  (((spec) >> 2) & 0x0F) 
#define CLR_GREEN(spec) ((((spec) & 0x03) << 2) | ((spec & 0x3000) >> 12)) 
#define CLR_BLUE(spec)  (((spec) >> 8) & 0x0F) 

2)

#define CDG_GET_SCROLL_COMMAND(scroll) (((scroll) & 0x30) >> 4) 
#define CDG_GET_SCROLL_HOFFSET(scroll)  ((scroll) & 0x07) 
#define CDG_GET_SCROLL_VOFFSET(scroll)  ((scroll) & 0x0F) 
+2

В качестве побочного примечания: заголовок c как ошибка: '(spec & 0x3000)' должен быть '((spec) & 0x3000)' – CodesInChaos

+2

Для жизни я не могу представить, почему кто-то выбирал для использования макроса для этого. Когда вы исправляете ошибку, которую заметили CodeInChaos, которые так легко сделать с помощью макросов, вы получаете тот факт, что '(spec)' дважды оценивается в 'CLR_GREEN'. Если вы хотите определить функцию, определите функцию! –

+1

@DavidHeffernan Но это быстрее! 11 Компиляторы, которые могут встроить функции, неслыханны. – CodesInChaos

ответ

11

Это параметризованные макросы. Поскольку Delphi не поддерживает их, вам нужно будет использовать вместо них функции, которые в любом случае являются более чистыми.

  • >> является сдвиг вправо, shr в Delphi
  • << является левым сдвигом, shl в Delphi
  • & является "побитовое и", and в Delphi
    Delphi использует операторы побитового при работе на целые числа и логические операторы при работе с булевыми элементами, поэтому есть только один оператор and для замены как &&, так и &.
  • | является "побитовое или", or в Delphi
  • 0x является префиксом для шестнадцатеричных литералов, $ в Delphi

Так #define CLR_GREEN(spec) ((((spec) & 0x03) << 2) | ((spec & 0x3000) >> 12)) становится чем-то вроде:

function CLR_GREEN(spec: word):byte; 
begin 
    result := byte(((spec and $03) shl 2) or ((spec and $3000) shr 12)); 
end; 

(я не» t имеют delphi под рукой, поэтому могут быть небольшие ошибки)

Преобразование o Эти же макросы аналогичным образом.

+0

mark function inline –

+0

@ Arioch'The - это необходимо для этих небольших целых функций манипуляции? Разве компилятор не сделает это автоматически для вас? –

+0

@ Leonardo Нет, не будет. И ни в коем случае мы не можем сказать, является ли встраивание хорошей идеей. Об этом может знать только автор. –