|
Вопрос # 5 288/ вопрос решён / |
|
Салют! Что есть: Есть свой тип и тип из массива, пусть это будет
Tinfo = record
Num: integer;
name: string[100];
end;
TinfoBox = array of Tinfo;
Задача: Положить динам. массив в TMemoryStream, затем вынуть. TMS я перекидываю через сокеты, но это не важно.
var
m: TMemoryStream;
ib: TinfoBox;
begin
m := TMemoryStream.Create;
SetLenght(ib, 2);
ib[0].Num := 0;
ib[0].name:= '0';
ib[1].Num := 1;
ib[1].name:= '1'; // пусть все будет просто для наглядности
m.writebuffer(ib[0], 104);
// Вопрос№1: не ясно, почему не пашет Length(ib[0]). 104 пишу, потому
//что integer = 4 байта.
m.writebuffer(ib[1], 104);
Здесь все ясно. Пересылаем, получаем. Вопрос №2: Как из TMemoryStream снова все засунуть в массив типа TinfoBox.
 |
Вопрос задал: Эхо Унитазного Бачка (статус: 1-ый класс)
Вопрос отправлен: 16 мая 2011, 10:01
Состояние вопроса: решён, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, GangrenaGastrit!
Цитата:
// Вопрос№1: не ясно, почему не пашет Length(ib[0]). 104 пишу, потому// Вопрос№1: не ясно, почему не пашет Length(ib[0]). 104 пишу, потому
а потому что не обязан:) Он тут не будет работать - он только для строки и массивов. А тут работает sizeof.
Цитата:
//что integer = 4 байта.//что integer = 4 байта.
я бы на это не полагался. в 1 делфи (да, я знаю, это "старье", но...) integer был 2 байта, а вот появится 64битная делфи - там может быть 8 байт. А может и 4...
Цитата:
Вопрос №2: Как из TMemoryStream снова все засунуть в массив типа TinfoBox.
Да очень просто.
var
m: TMemoryStream;
ib: TinfoBox;
begin
m := TMemoryStream.Create;
SetLenght(ib, 2);
m.readbuffer(ib[0], sizeof(ib[0]));
m.readbuffer(ib[1], sizeof(ib[1]));
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 16 мая 2011, 10:57
|
Ответ #2. Отвечает эксперт: min@y™
А может, всё-таки, лучше вот так?
// запись массива в поток:
m.WriteBuffer(ib[0], Length(ib) * SizeOf(Tinfo));
// чтение массива из потока
m.Position:= 0;
SetLength(ib, m.Size div SizeOf(Tinfo));
if Length(ib) <> 0
then m.ReadBuffer(ib[0], Length(ib) * SizeOf(Tinfo));
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 16 мая 2011, 11:06
|
Мини-форум вопроса
Всего сообщений: 0.
17 мая 2011, 11:14: Статус вопроса изменён на решённый (изменил автор вопроса — Эхо Унитазного Бачка)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|