Конференция "Прочее" » Из C в Pascal. Помогите с переводом.
 
  • DVM © (14.11.08 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 © (14.11.08 22:55) [1]
    Четыре байта объединяют в один LogWord. Можно делать сдвигами байтов, а можно записывая байты в нужное место при помощи вариантной записи.
  • DVM © (14.11.08 23:26) [2]

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

    Ааа. Точно! Спасибо.
  • @!!ex © (15.11.08 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 © (15.11.08 10:00) [4]
    Кстати, могу поделится кодом загрузки dds. поддерживает dtx1/3/5 и RGBA
  • DVM © (15.11.08 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 © (15.11.08 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 © (15.11.08 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 © (15.11.08 12:55) [8]
    > Тогда лишние телодвижения будут при вызовах, т.к. ее там везде вызывают так:
    какие?
    MAKEFOURCC(['G','R','A','Y'])
    MAKEFOURCC(['U','Y','V','Y'])
    MAKEFOURCC(['R','G','B',' '])

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

    ????
  • sniknik © (15.11.08 13:00) [9]
    в оригинале [0] приводится к BYTE, вот я byte и поставил, а так это все одно, в С так вообще различия byte/char нету, delphi просто более "затипизированный" язык. что чисто для проверок компилятором, а явные преобразования это уже на совесть программиста, должен знать что делает.
  • sniknik © (15.11.08 13:08) [10]
    кстати можно тогда еще немного упростить...
    типа
    function MAKEFOURCC(charr: pchar): DWORD;
    var ch: ^DWORD absolute charr;
    begin
     result:= ch^;
    end;


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

  • DVM © (15.11.08 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 © (15.11.08 13:34) [12]
    это макрос, в си это вычисляется компилятором и на место в программе уже вставляется константа, программа при работе не делает уже никаких вычислений...
    а функция это вызов процедуры, передача параметров, возврат параметров, т.е. накладные расходы там где их можно избежать.
  • DVM © (15.11.08 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);
    Так нормально, ведь тоже правильно будет?
  • Игорь Шевченко © (15.11.08 14:07) [14]

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


    procedure IDGetPicture(Hdv: HDEVICE; ImgTegg: pUINT; var Images: Pointer);
  • DevilDevil (15.11.08 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 © (15.11.08 14:19) [16]

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


    > var Images: Pointer);

    Спасибо.
  • sniknik © (15.11.08 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 © (15.11.08 16:09) [18]
    > sniknik ©   (15.11.08 16:02)

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

    вот это лично для тебя, запиши и заучи, т.к. судя то [18] для тебя это "откровение" которым ты со всеми делишься.
    - универсального кода, под абсолютно все версии чего либо не бывает (как и вообще универсального), с этим придётся мирится и если уж есть желание таскать код из версии в версию то пусть будет и желание переделывать под них.
  • Eraser © (15.11.08 18:35) [20]
    > [19] sniknik ©   (15.11.08 17:11)


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

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

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

    обойдусь без твоих указаний как-нибудь.
  • jack128_ (15.11.08 20:09) [21]

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

    AnsiChar в любой дельфе - однобайтовый.
  • jack128_ (15.11.08 20:09) [22]
    ну и AnsiString для строк...
  • DVM © (15.11.08 21:13) [23]

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

    Да я собственно AnsiChar написал в конечном результате.
 
Конференция "Прочее" » Из C в Pascal. Помогите с переводом.
Есть новые Нет новых   [134446   +31][b:0][p:0.002]