Форум: "Прочее";
Текущий архив: 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.5 MB
Время: 0.006 c