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

Вниз

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

 
DVM ©   (2009-05-11 22:01) [0]

Имеется вот такое объявление структуры в C++

struct RtpDataHeader
{
   U8 cc:4;         // CSRC count
   U8 x:1;          // header extension flag
   U8 p:1;          // padding flag
   U8 version:2;    // protocol version
   U8 pt:7;         // payload type
   U8 m:1;          // marker bit
   U16 seqN;        // sequence number, network order
   U32 timestampN;  // timestamp, network order
   U32 ssrcN;       // synchronization source, network order
   U32 csrc[];      // optional CSRC list
};

Некоторые поля записи сразу получают нужные значения.

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


 
AndreyV ©   (2009-05-11 22:08) [1]

...
U8 cc:4;
U8 x:1;
...

Ты наверно о 4,1 и т.д., так это размер в битах.


 
Игорь Шевченко ©   (2009-05-11 22:12) [2]


> Как думаете, как такое наиболее красиво провернуть в Delphi


а ты посмотри, как в Jedi битовые поля переводят
http://www.delphi-jedi.org


 
DVM ©   (2009-05-11 22:20) [3]


> AndreyV ©


> Ты наверно о 4,1 и т.д., так это размер в битах.

Ааа, вон оно что. Никогда не сталкивался с такой записью, подумал, что это иннициализация полей что ли.


> Игорь Шевченко ©   (11.05.09 22:12) [2]


> а ты посмотри, как в Jedi битовые поля переводят

Спасибо, посмотрю.

Вопрос снят, я неправильно понял запись. В С++ мои знания поверхностны.


 
Юрий Зотов ©   (2009-05-11 22:35) [4]

Кстати, инициализация полей записей при их объявлении в Delphi есть. Вот слегка измененный пример из справки:

type
 TMonth = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
 TDate = record
   D: 1..31;
   M: TMonth;
   Y: 1900..1999;
 end;

var
 SomeDay: TDate = (D: 2; M: Dec; Y: 1960);


 
DVM ©   (2009-05-11 22:43) [5]


> Юрий Зотов ©   (11.05.09 22:35) [4]

Об этом я само собой разумеется знаю.

Но я то из-за незнания Си++, подумал, что в нем при объявлении типа структуры сразу задаются начальные значения полей. Не при объявлении каждой переменной типа запись, а для самого типа запись, что потом бы применялось ко всем переменным такого типа автоматом.

Оказалось это бинарные поля, которых в Delphi вообще нет, но выкрутиться можно конечно. Будет просто не так наглядно объявление.


 
DVM ©   (2009-05-12 23:42) [6]

Насколько я понял, единственный вариант использовать битовые поля, это объединить их в байты. Работать правда будет не так удобно, но все же.
Все ли правильно я перевел, знатоки СИ посмотрите, также интересует правильность перевода поля U32 csrc[].


(*
 struct RtpDataHeader
 {
   // Version
   U8 cc:4;         // CSRC count
   U8 x:1;          // header extension flag
   U8 p:1;          // padding flag
   U8 version:2;    // protocol version

   // Payload
   U8 pt:7;         // payload type
   U8 m:1;          // marker bit

   U16 seqN;        // sequence number, network order
   U32 timestampN;  // timestamp, network order
   U32 ssrcN;       // synchronization source, network order
   U32 csrc[];      // optional CSRC list
 };

*)

 TRtpDataHeader = record
   Version: byte;
   Payload: byte;
   Sequence: word;
   Timestamp: cardinal;
   SSRC: cardinal;
   CSRC: array[0..0] of cardinal;    
 end;
 PRtpDataHeader = ^TRtpDataHeader;


 
Юрий Зотов ©   (2009-05-12 23:52) [7]

packed ?


 
DVM ©   (2009-05-12 23:55) [8]


> Юрий Зотов ©   (12.05.09 23:52) [7]

Хотите сказать что надо TRtpDataHeader = packed record ?


 
Юрий Зотов ©   (2009-05-13 10:37) [9]

> DVM ©   (12.05.09 23:55) [8]

Не уверен, но возможно. Поэтому и знак вопроса.


 
Palladin ©   (2009-05-13 11:00) [10]

В этом случае не обязательно. Компилятор создаст "упакованную" структуру. Ибо byte,byte,word попадут в один 4байтовы "бокс". Было бы byte, word, byte вот тогда packed необходим.


 
DVM ©   (2009-05-13 11:05) [11]

И все таки U32 csrc[]; и CSRC: array[0..0] of cardinal;  это одно и то же? Что-то у меня сомнения.

U32 csrc[] - это что вообще? Массив без элементов?


 
KSergey ©   (2009-05-13 11:23) [12]

> DVM ©   (13.05.09 11:05) [11]
> U32 csrc[] - это что вообще? Массив без элементов?

указатель на U32. по котрому в си можно обращаться интексированно как к массиву.


 
Anatoly Podgoretsky ©   (2009-05-13 11:25) [13]

> DVM  (13.05.2009 11:05:11)  [11]

В Си нет массивов. И это конечно не одно и тоже


 
DVM ©   (2009-05-13 11:30) [14]


> Anatoly Podgoretsky ©   (13.05.09 11:25) [13]


> В Си нет массивов.

??? Это как понимать? В СИ массивы есть конечно же. В любой книге по СИ есть раздел именно с таким названием.


> И это конечно не одно и тоже

Да я догадываюсь, но вот как это заменить лучше всего. Просто указателем на Cardinal. Вроде по идее тоже самое.


 
Anatoly Podgoretsky ©   (2009-05-13 11:44) [15]

> DVM  (13.05.2009 11:30:14)  [14]

Это видимость, это не массив, а указатель, поэтому и возможно []


 
DVM ©   (2009-05-13 11:48) [16]


> Anatoly Podgoretsky ©   (13.05.09 11:44) [15]


> Это видимость, это не массив

Ну это понятно, что указатели и массивы в СИ это почти одно и то же. Но все же термин массив используют. Но это неважно.

Получается, что аналог U32 csrc[] это что то типа SRC: PDWORD;  ?


 
Anatoly Podgoretsky ©   (2009-05-13 11:58) [17]

Может так и правильнее. Все зависит от использования структуры


 
wl ©   (2009-05-13 12:17) [18]

ну да, объявления типа U32* csrc и U32 csrc[] эквивалентны в составе структур, формальных параметров функций...
sizeof() будет равен размеру указателя (4 байта на 32-х битных системах)


 
wl ©   (2009-05-13 12:25) [19]

и кстати говоря, нужно проверить, чтобы все типы были безнаковые (U - unsigned), делфи под рукой нет, но насколько помню, cardinal - знаковый тип?


 
Palladin ©   (2009-05-13 12:26) [20]

нет


 
Игорь Шевченко ©   (2009-05-13 12:27) [21]

В С есть массивы


 
Anatoly Podgoretsky ©   (2009-05-13 12:28) [22]

> wl  (13.05.2009 12:25:19)  [19]

Никогда не был.


 
DVM ©   (2009-05-13 12:50) [23]

В продолжение предыдущего возник еще один вопрос:
В си обявлена структура:

   // RTCP packet
   struct RtcpPacket
   {
       RtcpCommonHeader header; // common header
       union
       {
           // Sender Report (SR)
           struct Sr
           {
              ......
           } sr;

           // Reception Report (RR)
           struct Rr
           {
              ....
           } rr;

           // source description (SDES)
           struct Sdes
           {
               ......
           } sdes;

           // BYE
           struct Bye
           {
              .....
           } bye;
        } body;
   };


Как это в Delphi записать? Подозреваю, что через Case, но как?


 
Игорь Шевченко ©   (2009-05-13 12:52) [24]


> Как это в Delphi записать?


в Windows.pas и в Message.pas полно примеров вариантных записей


 
DVM ©   (2009-05-13 13:34) [25]


> Игорь Шевченко ©   (13.05.09 12:52) [24]

Спасибо. посмотрел Messages.pas как пример.

Сделал так, вроде правильно, прошу если что не так указать на ошибки:

------------- Было:

   // RTCP packet
   struct RtcpPacket
   {
       RtcpCommonHeader header; // common header
       union
       {
           // Sender Report (SR)
           struct Sr
           {
               U32    ssrcN;    // sender generating this report, network order
               U32    ntpSecN;  // NTP timestamp, network order
               U32    ntpFracN;
               U32    rtpTsN;   // RTP timestamp, network order
               U32    pSentN;   // packets sent, network order
               U32    oSentN;   // octets sent, network order
               RtcpRr rr[];     // variable-length list
           } sr;

           // Reception Report (RR)
           struct Rr
           {
               U32 ssrcN;        // receiver generating this report
               RtcpRr rr[];     // variable-length list
           } rr;

           // source description (SDES)
           struct Sdes
           {
               U32 srcN;        // first SSRC/CSRC
               RtcpSdesItem item[]; // list of SDES items
           } sdes;

           // BYE
           struct Bye
           {
               U32 srcN[];     // list of sources
               // can"t express trailing text for reason (what does this mean? it"s not even english!)
           } bye;
        } body;
   };


------------- Стало:

 TRtcpPacket = record
   Header: TRtcpCommonHeader ; // common header
   case integer of
     0:  // Sender Report (SR)
       (
          Sr: record
            ssrcN: DWORD;        // sender generating this report, network order
            ntpSecN: DWORD;      // NTP timestamp, network order
            ntpFracN: DWORD;
            rtpTsN: DWORD;       // RTP timestamp, network order
            pSentN: DWORD;       // packets sent, network order
            oSentN: DWORD;       // octets sent, network order
            rr: PRtcpRr;         // variable-length list
          end;
       );
     1:  // Reception Report (RR)
       (
          Rr: record
            ssrcN: DWORD;        // receiver generating this report
            rr: PRtcpRr;         // variable-length list
          end;
       );
     2:  // source description (SDES)
       (
          Sdes: record
            srcN: DWORD;         // first SSRC/CSRC
            item: PRtcpSdesItem; // list of SDES items
          end;
       );
     3:  // BYE
       (
          Bye: record
            srcN: PDWORD;        // list of sources
          end;  
       );
 end;



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

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

Наверх




Память: 0.55 MB
Время: 0.009 c
2-1242924098
Чипырик
2009-05-21 20:41
2009.07.12
Как получить год


2-1242899868
Int23
2009-05-21 13:57
2009.07.12
Как скопировать содержимая TBitmap в Pointer


15-1242293947
TUser
2009-05-14 13:39
2009.07.12
25 мая - благотворительный концерт


15-1242244143
T&F
2009-05-13 23:49
2009.07.12
Intel оштрафовали на миллиард евро o_O


2-1242877845
NaRuTo
2009-05-21 07:50
2009.07.12
Как узнать продолжительность звукового файла?