![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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) );
Чего бояться? надо пробовать...