Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.01.11;
Скачать: [xml.tar.bz2];

Вниз

Из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.007 c
8-1188381068
hahol
2007-08-29 13:51
2009.01.11
Эквалайзер


2-1227819867
demon
2008-11-28 00:04
2009.01.11
Как сохранить в ini-файл значение HBRUSH ?


6-1196845207
Lamer666
2007-12-05 12:00
2009.01.11
Как после события TWebBrowser DownloadComplete вернуться в цикл!


2-1227707840
ekto
2008-11-26 16:57
2009.01.11
cxDBGrid


15-1226277137
Abcdef123
2008-11-10 03:32
2009.01.11
Верно ли это?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский