Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прочитать из "массива" в "массив" [D7, XP]


ZipFolder ©   (2006-08-26 16:42:00) 

Есть такой код:
 PZPkt = ^TZPkt;
 TZPkt = record
   Data: array[0..1024] of Byte;
   Len: Word;
 end;

var
  z1, z2: PZPkt;



z1 -- заполнен заранее, z1.Len - это показатель на сколько прочитан пакет (т.е когда мы читаем из него где-то, и увеличиваем Len на столько-же на сколько прочитали).

z2 -- пока пустой пакет.

Необходимо прочитать из z1, в z2 необходимое количество. Вопрос: покажите, как это корректно и хорошо сделать. А то я сделаю, как всегда через одно известное место...
Спасибо!


default   (2006-08-26 18:24:00) [1]

может так?
function MovePkt2Pkt(Pkt: PZPkt; Size: Word): TZPkt;
begin
Move (Pkt^.Data[Pkt^.Len], Result.Data, Size);
Inc(Pkt^.Len, Size);
Result.Len := 0;
end;

а если серьёзно, то ЯВНО надо не так делать...скорее всего лучше сделать всё stream-о подобными классами, быть может взяв за базовый TStream или как-то ещё, но через классы


ZipFolder   (2006-08-26 18:24:00) [2]

Я наверное запутал не слишком нужными фактами. Поэтому, переформирую вопрос в немного другое русло, может быть понятнее получиться.

Мне нужно считать из в z2.Data, из z1.Data, с началом в z1.Len, нужное количество Size.

т.е. например задано
Size = 6;
z1.Data = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
z1.Len = 4;
Move(z1,... z2...)
В z2, должно получиться: (5, 6, 7, 8, 9, 10)

Сделал так, работает, но может быть есть вариант лучше?
Move (Pkt^.Data[Pkt^.Len], Result.Data, Size);


Джо   (2006-08-26 18:08:00) [3]

Честно скажу, мало что понял в вопросе. Точнее, почему поле Len ( сокр.длина) хранит " это показатель на сколько прочитан пакет". В общем, скажу, раз ветка в "Начинающих", что Move копирует указанное кол-во байт из одной области памяти в другую. Приспосабливайте ее, как знаете :)


ZipFolder   (2006-08-26 17:59:00) [4]

Я напишу все же свой ход мыслей.

Допустим У нас в z1, находится 50 байт. z1.Len -- изначально установлен в 0.
Мы читаем где-то из z1, например 10 байт, и увеличиваем z1.Len на прочитанное (т.е.) 10 байт.

Потом нам приспичило с текущей позиции (z1.Len) отправить 20 байт в z2.
Так будет нормально? Не хочет что-то. Сейчас изучаю отладчиком...

function MovePkt2Pkt(Pkt: PZPkt; Size: Word): TZPkt;
begin
 Move (Pkt^.Data, Result.Data, Size);
 Inc(Pkt^.Len, Size);
 Result.Len := 0;
end;


Джо   (2006-08-26 17:41:00) [5]

Move (z1^.Data,z2^.Data,z1^.Len);
z2^.Len := z1^.Len;


ZipFolder   (2006-08-26 17:31:00) [6]

А можно ближе к мой ситуации? Я сам пробовал различные манипуляции с Move, но видимо дурак от природы, маловато знаю. Даже если чего и добьюсь - то это будет заведомо не оптимально, поэтому и прошу помощи. Спасибо!


Джо   (2006-08-26 16:58:00) [7]

Move


Наверх

Титульная страница Поиск, карта сайта Написать письмо