Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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: Статус вопроса изменён на решённый (изменил автор вопроса — Эхо Унитазного Бачка)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 30 мая 2023, 07:12
Выполнено за 0.03 сек.
Рейтинг@Mail.ru