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

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

Move


ququ ©   (2006-09-21 15:26:00) 

Есть некая структура:
temp = recored
: Longword;
: Word:
: Byte;
: LongWord;
end;

и есть переменная a: array [0..1024] of Byte;

Как переместить данные из a в структуру? Я боюсь, что не правильно сделаю.


Сергей М.   (2006-09-21 16:45:00) [1]

Думаю даже, что и перемещение для обозначенных целей тебе вряд ли требуется ..

type
 PTemp = ^Temp;
..

 PTemp(@a[10]).SomeField := ...;


Наиль   (2006-09-21 16:45:00) [2]


> например я с верхужки снимаю байт, потом дворд, потом дохожу
> например до позиции 10 с верхушки  и запихиваю с этой позиции
> данные в рекорд.

Move(a[0], MyRecord.AByte, sizeof(MyRecord.AByte));
Move(a[1], MyRecord.ADWord, sizeof(MyRecord.ADWord));
Move(a[10], MyRecord.AWord, sizeof(MyRecord.AWord));


Сергей М.   (2006-09-21 16:41:00) [3]


> например я с верхужки снимаю байт, потом дворд, потом дохожу
> например до позиции 10 с верхушки  и запихиваю с этой позиции
> данные в рекорд.


Да на здоровье, "запихивай" ..

Move(a[10], MyRecord, sizeof(MyRecord));


Наиль   (2006-09-21 16:35:00) [4]


> Зачем упакованную?

Нажми Ctrl+Shift+F11, закладка Compiler. Посмотри чему равен Record Field Alignment. У меня 8.
Значит твоя запись распределиться в памяти так:
temp = record
: Longword; // 8 байт = 4 + 4 байта мусора
: Word:       // 8 байт = 2 + 6 байта мусора
: Byte;        // 8 байт = 1 + 7 байта мусора
: LongWord; // 8 байт = 4 + 4 байта мусора
end;

Адрес каждой переменой в записи будет кратен 8.
При попытке перенести данные из массива, часть данных будет попадать в участки памяти недоступные при обращении к записи. Если же у тебя число отличное от 8, то ты получишь совсем другие записи из того же массива.

> 1025 - это вообще максимальный объем

Не верю. 1025Б=1КБ + 1Б
С чего это, вместо круглого 1КБ используется рубь с копейкой.


ququ   (2006-09-21 16:20:00) [5]

Нет, данные в массиве - это не совокупнтость нескольких моих рекордов.
Т.е. например я с верхужки снимаю байт, потом дворд, потом дохожу например до позиции 10 с верхушки  и запихиваю с этой позиции данные в рекорд.


Германн   (2006-09-21 16:19:00) [6]

Тогда учитывай, что
By default, the values in a structured type are aligned on word or double-word boundaries for faster access.


Сергей М.   (2006-09-21 16:18:00) [7]


> Мне например надо с какой-то позиции в массиве, запихнуть
> в структуру данные


Ну так наверно все же с позиции, кратной размеру структуры ?
Т.е. массив содержит целое число таких структур ?
Значит и размер массива д.б. кратен размеру структуры.
Ну и с каких пор число 1025 кратно числу 32 или 11 ?


han_malign   (2006-09-21 16:17:00) [8]


> Зачем упакованную?

- а чтобы потом не пришлось делать
{$IFOPT A1}
........
{$ENDIF}
{$IFOPT A2}
........
{$ENDIF}
{$IFOPT A4}
........
{$ENDIF}
{$IFOPT A8}
........
{$ENDIF}


ququ   (2006-09-21 16:14:00) [9]

Ну объем данных большой, 1025 - это вообще максимальный объем. Мне например надо с какой-то позиции в массиве, запихнуть в структуру данные, а все остальные данные будут в другом месте обрабатываться. Грубо говоря, в массив содержится пакет данных, парсингом которых я занимаюсь.


Германн   (2006-09-21 16:09:00) [10]


> ququ   (21.09.06 16:05) [4]
>
> Зачем упакованную?

Тогда объясни задачу подробнее. Что у тебя в a: array [0..1024] of Byte;
лежит? И зачем эти данные перемещать в рекорд?


Сергей М.   (2006-09-21 16:08:00) [11]


> Зачем упакованную?


А зачем в массиве аж целых 1025 байт, если размер твоей структуры не превышает 32 байта ?


ququ   (2006-09-21 16:05:00) [12]

Зачем упакованную?


Desdechado   (2006-09-21 16:04:00) [13]

> Правильно боишся.
Не факт :)
Может, в 1024 байтах и мусор распределен так, чтоб на выравнивающие байты структуры записи попасть :))


Германн   (2006-09-21 15:55:00) [14]


> Я боюсь, что не правильно сделаю.

Правильно боишся. Используй packed record.


Elen   (2006-09-21 15:28:00) [15]

move (temp,a,sizeof(temp) );
Чего бояться? надо пробовать...


Наверх

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