Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Вниз

Прочитать из "массива" в "массив"   Найти похожие ветки 

 
ZipFolder   (2006-08-26 16:42) [0]

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

var
  z1, z2: PZPkt;



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

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

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


 
Джо ©   (2006-08-26 16:58) [1]

Move


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

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


 
Джо ©   (2006-08-26 17:41) [3]

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


 
ZipFolder   (2006-08-26 17:59) [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 18:08) [5]

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


 
default ©   (2006-08-26 18:24) [6]

может так?
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) [7]

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

Мне нужно считать из в 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);



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.037 c
1-1154430550
Redline
2006-08-01 15:09
2006.09.17
игнорирование ошибок


1-1154958562
webpauk
2006-08-07 17:49
2006.09.17
Расположение кнопок в ToolBar


2-1156570052
BTR
2006-08-26 09:27
2006.09.17
combobox


2-1156406173
ceval
2006-08-24 11:56
2006.09.17
Подскажите как написать процедуру


2-1156838861
Postalll
2006-08-29 12:07
2006.09.17
Вызов приложения из командной строки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский