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

Вниз

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

Наверх




Память: 0.54 MB
Время: 0.004 c
15-1242287623
Jolik
2009-05-14 11:53
2009.07.12
Работа: настроить сервер SourceSafe и интегрировать с Delphi


2-1242619357
MonoLife
2009-05-18 08:02
2009.07.12
Ошибка запроса к dbf.


2-1242753465
AV_Kit
2009-05-19 21:17
2009.07.12
Эмуляция служебных клавиш


2-1242812018
Вася
2009-05-20 13:33
2009.07.12
TTreeView. Пиктограммы


15-1241607255
serg_new_
2009-05-06 14:54
2009.07.12
GSM modem





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский