Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.12.2013, 17:14
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию Не получается отправить динамический массив

Здравствуйте! Что то не получается отправить динамический массив следующим способом:

type
TPacket = packed record
head: array [0 .. 5] of Char;
pack: array of Byte;
end;

готовлю к отправке и заполняю массив
var
Packet: TPacket;

SetLength(Packet.pack, 12);

Packet.head[0]:=XX;
Packet.head[1]:=XX;
Packet.pack[0]:=XX;
Packet.pack[1]:=XX;

Отправляю
idpsrvr1.SendBuffer(IP,Port,Packet,Sizeof(Packet)) ;

но почему то не получается.

P.S. до этого работал со статическими массивами по этой схеме и все получалось.

Подскажите пожалуйста как отправить динамический массив!
Ответить с цитированием
  #2  
Старый 11.12.2013, 17:30
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Shaft
Здравствуйте! Что то не получается отправить динамический массив следующим способом:

type
TPacket = packed record
head: array [0 .. 5] of Char;
pack: array of Byte;
end;

готовлю к отправке и заполняю массив
var
Packet: TPacket;

SetLength(Packet.pack, 12);

Packet.head[0]:=XX;
Packet.head[1]:=XX;
Packet.pack[0]:=XX;
Packet.pack[1]:=XX;

Отправляю
idpsrvr1.SendBuffer(IP,Port,Packet,Sizeof(Packet)) ;

но почему то не получается.

P.S. до этого работал со статическими массивами по этой схеме и все получалось.

Подскажите пожалуйста как отправить динамический массив!
Нет. С динамическим массивом таким образом не отправить. Здесь pack это просто указатель на массив байт, т.е. просто адрес в памяти где этот массив хранится. При получении на другом компьютере (или даже в другом процессе на этом же компьютере) по этому адресу естественно не будет никакого массива. Возможно даже вообще эта память не будет зарезервирована - тогда схлопочем Access Violation.
Ответить с цитированием
  #3  
Старый 11.12.2013, 17:36
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Вот вот, я пробовал вывести в memo Sizeof(Packet.pack) почему то выдает всегда 4 чтобы я не записал в массив всегда 4.
Значит динамический массив никак не отправить?
Ответить с цитированием
  #4  
Старый 11.12.2013, 17:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Shaft
Вот вот, я пробовал вывести в memo Sizeof(Packet.pack) почему то выдает всегда 4 чтобы я не записал в массив всегда 4.
Размер 4 будет на в 32-битном приложении. В 64-битном приложении будет 8, так как размер указателей у 64-битных приложений занимают 8 байт.
Цитата:
Сообщение от Shaft
Значит динамический массив никак не отправить?
Можно конечно, просто чуть сложнее - получаем у динамического массива адрес где расположены данные и отправляем с этого адреса соответствующее количество байт.
Ответить с цитированием
  #5  
Старый 11.12.2013, 17:51
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

А подскажи пожалуйста примерчик?
Ответить с цитированием
  #6  
Старый 11.12.2013, 18:02
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Shaft
А подскажи пожалуйста примерчик?
Примерно так:
Код:
idpsrvr1.SendBuffer(IP, Port, Pointer(Packet.pack)^, Length(Packet.pack)) ;
Но в этом примере отправится естественно только динамический массив, т.е. только часть "pack", но не часть "head".
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Shaft (11.12.2013)
  #7  
Старый 11.12.2013, 19:26
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Ок, спасибо большое!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:35.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter