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