|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Indy SendBuffer старый и новый
В delphi7 при отправки буфера по UDP требовалось указать размер буфера. А в новом - не требуется.
было: procedure TIdUDPBase.SendBuffer(AHost: string; const APort: Integer; var ABuffer; const AByteCount: integer); стало: procedure TIdUDPBase.SendBuffer(const AHost: string; const APort: TIdPort; const ABuffer: TIdBytes); // TIdBytes = array of Byte; Вопросы возникли: Это они зачем так сделали? Как определяется длина массива, если мы передаем только указатель? Что делать, если у меня количество отправляемых данных все время разное? Каждый раз заново выделять память под буфер? Последний раз редактировалось ikasjan, 07.07.2022 в 17:32. |
#2
|
|||
|
|||
1. Видимо, упростили, т.к. в случае массива его длинна всегда известна.
2. Массив сам хранит в себе свою длинну (если правильно помню, то в -4х байтах) 3. Ну, видимо, да. Тебе все-равно надо конвертировать твои данные в TIdBytes. Или ты их пишешь в массив по указателю на начало? Ну тогда используй SetLength просто... |
#3
|
|||
|
|||
Раньше просто передавал указатель на абсолютно любой тип данных и его длину. (Или на любой элемент массива.)
А теперь получается перед отправкой надо обязательно создать динамический массив и копировать туда данные. Как-то это накладно с точки зрения производительности. |
#4
|
|||
|
|||
На первый взгляд, да, шляпа.
Ну тут может имеет смыск подумать над тем, что бы переработать основной код, что бы хранить данные сразу в совместимом типе, тогда и копировать не придется. ЗЫ. В некоторых случаях даже в "старом" виде у тебя в коде копирования вроде как и нет, но оно все-равно есть, просто компилятор делает это за тебя. |