Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.11;
Скачать: CL | DM;

Вниз

Из C в Pascal. Помогите с переводом.   Найти похожие ветки 

 
DVM ©   (2008-11-14 22:43) [0]

Как вот такое перевести в паскаль:

#define MAKEFOURCC(ch0, ch1, ch2, ch3)                              \
               ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) |   \
               ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))


Понятно, что это будет какая то функция типа такой:

function MAKEFOURCC(ch0: ???; ch1: ???; ch2: ???; ch3: ???): ???;
begin
 ???
end;

Че то я не соображу никак :(


 
palva ©   (2008-11-14 22:55) [1]

Четыре байта объединяют в один LogWord. Можно делать сдвигами байтов, а можно записывая байты в нужное место при помощи вариантной записи.


 
DVM ©   (2008-11-14 23:26) [2]


> Четыре байта объединяют в один LogWord.

Ааа. Точно! Спасибо.


 
@!!ex ©   (2008-11-15 08:07) [3]

> [2] DVM ©   (14.11.08 23:26)

Я просто константами написал.
const
 FOURCC_DXT1 = $31545844;
 FOURCC_DXT2 = $32545844;
 FOURCC_DXT3 = $33545844;
 FOURCC_DXT4 = $34545844;
 FOURCC_DXT5 = $35545844;


 
@!!ex ©   (2008-11-15 10:00) [4]

Кстати, могу поделится кодом загрузки dds. поддерживает dtx1/3/5 и RGBA


 
DVM ©   (2008-11-15 12:04) [5]


> @!!ex ©   (15.11.08 10:00) [4]

Спасибо, но у меня это в совсем другом контексте используется. Точнее не у меня, а в SDK тут одном стороннем. Это не DirectDraw и даже близко к нему не стояло.

Собственно, я вчера под вечер уже плохо соображал, мог бы и сам додуматься (да и DirectDraw.PAS оно вроде есть)

function MAKEFOURCC(ch0, ch1, ch2, ch3: Char) : DWORD;
begin
 Result := DWORD(byte(ch0) shl 0) or
              DWORD(byte(ch1) shl 8) or
              DWORD(byte(ch2) shl 16) or
              DWORD(byte(ch3) shl 24);
end;


 
sniknik ©   (2008-11-15 12:14) [6]

> function MAKEFOURCC(ch0, ch1, ch2, ch3: Char) : DWORD;
> begin
>  Result := DWORD(byte(ch0) shl 0) or
>               DWORD(byte(ch1) shl 8) or
>               DWORD(byte(ch2) shl 16) or
>               DWORD(byte(ch3) shl 24);
> end;

только лишние "телодвижения"...
проще
function MAKEFOURCC(charr: array of byte): DWORD;
var ch: DWORD absolute charr;
begin
 result:= ch;
end;

но, чуть изменится вызов, добавятся скобки
MAKEFOURCC([1, 2, 3, 4])


 
DVM ©   (2008-11-15 12:48) [7]


> только лишние "телодвижения"...
> проще
> function MAKEFOURCC(charr: array of byte): DWORD;
> var ch: DWORD absolute charr;
> begin
>  result:= ch;
> end;
> но, чуть изменится вызов, добавятся скобки
> MAKEFOURCC([1, 2, 3, 4])

Тогда лишние телодвижения будут при вызовах, т.к. ее там везде вызывают так:

MAKEFOURCC("G","R","A","Y")
MAKEFOURCC("U","Y","V","Y")
MAKEFOURCC("R","G","B"," ")

и т.д


 
sniknik ©   (2008-11-15 12:55) [8]

> Тогда лишние телодвижения будут при вызовах, т.к. ее там везде вызывают так:
какие?
MAKEFOURCC(["G","R","A","Y"])
MAKEFOURCC(["U","Y","V","Y"])
MAKEFOURCC(["R","G","B"," "])

ну и array of byte заменить на array of char

????


 
sniknik ©   (2008-11-15 13:00) [9]

в оригинале [0] приводится к BYTE, вот я byte и поставил, а так это все одно, в С так вообще различия byte/char нету, delphi просто более "затипизированный" язык. что чисто для проверок компилятором, а явные преобразования это уже на совесть программиста, должен знать что делает.


 
sniknik ©   (2008-11-15 13:08) [10]

кстати можно тогда еще немного упростить...
типа
function MAKEFOURCC(charr: pchar): DWORD;
var ch: ^DWORD absolute charr;
begin
 result:= ch^;
end;

тогда вызов
MAKEFOURCC("GRAY");


 
DVM ©   (2008-11-15 13:28) [11]


> sniknik ©   (15.11.08 12:55) [8]


> какие?


> ну и array of byte заменить на array of char

Если заменить, то не будет. Если же не заменять, то приводить надо будет каждый символ к байту.


> sniknik ©   (15.11.08 13:08) [10]

Да, так конечно хорошо, но мне надо максимально сохранить совместимость с оригиналом, чтобы не было разночтений потом у других с документацией на SDK. Проблема конечно небольшая, но все же там написано, вызывать так: MAKEFOURCC("G","R","A","Y").

Раз уж пошел разговор, может кто-нибудь объяснит мне почему в си использовали вот эту странную конструкцию #define MAKEFOURCC вместо того, чтобы просто сделать функцию ?


 
sniknik ©   (2008-11-15 13:34) [12]

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


 
DVM ©   (2008-11-15 13:57) [13]


> sniknik ©   (15.11.08 13:34) [12]

Ясно, спасибо.

Еще есть один вопрос:

В си:
VOID      IDGetPicture(HDEVICE Hdv,UINT *ImgTegg,VOID **Images);
Где: Images - Указатель на массив указателей изображений.

Как лучше написать в паскале:
 procedure IDGetPicture(Hdv: HDEVICE; ImgTegg: pUINT; Images: Pointer);
Так нормально, ведь тоже правильно будет?


 
Игорь Шевченко ©   (2008-11-15 14:07) [14]


>  procedure IDGetPicture(Hdv: HDEVICE; ImgTegg: pUINT; Images:
>  Pointer);


procedure IDGetPicture(Hdv: HDEVICE; ImgTegg: pUINT; var Images: Pointer);


 
DevilDevil   (2008-11-15 14:09) [15]

я ввёл тип TChars = array[0..3] of char;

в хедере, где требуется "указывать" MAKEFOURCC (dword или integer), выставляю тип TChars. Поэтому вместо

MAKEFOURCC(["G","R","A","Y"])
MAKEFOURCC(["U","Y","V","Y"])
MAKEFOURCC(["R","G","B"," "])

вполне проходит
"GRAY"
"UYVY"
"RGB "


 
DVM ©   (2008-11-15 14:19) [16]


> Игорь Шевченко ©   (15.11.08 14:07) [14]


> var Images: Pointer);

Спасибо.


 
sniknik ©   (2008-11-15 16:02) [17]

> вполне проходит
> "GRAY"

> sniknik ©   (15.11.08 13:08) [10]
> тогда вызов
> MAKEFOURCC("GRAY");

> я ввёл тип TChars = array[0..3] of char;
лучше бы ввел тип
MAKEFOURCC = ^DWORD;

тогда
xxx:= MAKEFOURCC(PChar("GRAY"))^;

чуток "страшненькая" форма записи, но это тоже не вычисляется при работе программы, простое приведение типа, что есть то и запишется (т.е. по этому критерию это будет полным аналогом твоего макроса из C)


 
Eraser ©   (2008-11-15 16:09) [18]

> sniknik ©   (15.11.08 16:02)

все варианты с Char прийдется переделывать в Д2009.


 
sniknik ©   (2008-11-15 17:11) [19]

> все варианты с Char прийдется переделывать в Д2009.
т.е. с самого начала, с [0] где char (как оказалось) уже бессмысленно что-то делать, т.к. придётся переделывать, так? и что теперь делать то? жуть.
а там разве не оставили однобайтных строк, и все только в двухбайтном юникоде?
вериться с трудом... т.е. вообще не вериться.

вот это лично для тебя, запиши и заучи, т.к. судя то [18] для тебя это "откровение" которым ты со всеми делишься.
- универсального кода, под абсолютно все версии чего либо не бывает (как и вообще универсального), с этим придётся мирится и если уж есть желание таскать код из версии в версию то пусть будет и желание переделывать под них.


 
Eraser ©   (2008-11-15 18:35) [20]

> [19] sniknik ©   (15.11.08 17:11)


> а там разве не оставили однобайтных строк, и все только
> в двухбайтном юникоде?

оставили, но, повторюсь, прийдется править.

> вот это лично для тебя, запиши и заучи

обойдусь без твоих указаний как-нибудь.


 
jack128_   (2008-11-15 20:09) [21]


> а там разве не оставили однобайтных строк, и все только
> в двухбайтном юникоде?
> вериться с трудом... т.е. вообще не вериться.

AnsiChar в любой дельфе - однобайтовый.


 
jack128_   (2008-11-15 20:09) [22]

ну и AnsiString для строк...


 
DVM ©   (2008-11-15 21:13) [23]


> Eraser ©   (15.11.08 16:09) [18]

Да я собственно AnsiChar написал в конечном результате.



Страницы: 1 вся ветка

Текущий архив: 2009.01.11;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.01 c
2-1227536047
demon
2008-11-24 17:14
2009.01.11
Обрезание расширений


15-1226665897
lorin
2008-11-14 15:31
2009.01.11
ActiveIRC Component


2-1227685751
AIK
2008-11-26 10:49
2009.01.11
Случайное число без повторов


1-1205651887
Megatron
2008-03-16 10:18
2009.01.11
Hint в ComboBox


2-1227704235
ekto
2008-11-26 15:57
2009.01.11
не работают сплиттеры