Текущий архив: 2006.10.08;
Скачать: CL | DM;
ВнизMove Найти похожие ветки
← →
ququ (2006-09-21 15:26) [0]Есть некая структура:
temp = recored
: Longword;
: Word:
: Byte;
: LongWord;
end;
и есть переменная a: array [0..1024] of Byte;
Как переместить данные из a в структуру? Я боюсь, что не правильно сделаю.
← →
Elen © (2006-09-21 15:28) [1]move (temp,a,sizeof(temp) );
Чего бояться? надо пробовать...
← →
Германн © (2006-09-21 15:55) [2]
> Я боюсь, что не правильно сделаю.
Правильно боишся. Используй packed record.
← →
Desdechado © (2006-09-21 16:04) [3]> Правильно боишся.
Не факт :)
Может, в 1024 байтах и мусор распределен так, чтоб на выравнивающие байты структуры записи попасть :))
← →
ququ (2006-09-21 16:05) [4]Зачем упакованную?
← →
Сергей М. © (2006-09-21 16:08) [5]
> Зачем упакованную?
А зачем в массиве аж целых 1025 байт, если размер твоей структуры не превышает 32 байта ?
← →
Германн © (2006-09-21 16:09) [6]
> ququ (21.09.06 16:05) [4]
>
> Зачем упакованную?
Тогда объясни задачу подробнее. Что у тебя в a: array [0..1024] of Byte;
лежит? И зачем эти данные перемещать в рекорд?
← →
ququ (2006-09-21 16:14) [7]Ну объем данных большой, 1025 - это вообще максимальный объем. Мне например надо с какой-то позиции в массиве, запихнуть в структуру данные, а все остальные данные будут в другом месте обрабатываться. Грубо говоря, в массив содержится пакет данных, парсингом которых я занимаюсь.
← →
han_malign © (2006-09-21 16:17) [8]
> Зачем упакованную?
- а чтобы потом не пришлось делать
{$IFOPT A1}
........
{$ENDIF}
{$IFOPT A2}
........
{$ENDIF}
{$IFOPT A4}
........
{$ENDIF}
{$IFOPT A8}
........
{$ENDIF}
← →
Сергей М. © (2006-09-21 16:18) [9]
> Мне например надо с какой-то позиции в массиве, запихнуть
> в структуру данные
Ну так наверно все же с позиции, кратной размеру структуры ?
Т.е. массив содержит целое число таких структур ?
Значит и размер массива д.б. кратен размеру структуры.
Ну и с каких пор число 1025 кратно числу 32 или 11 ?
← →
Германн © (2006-09-21 16:19) [10]Тогда учитывай, что
By default, the values in a structured type are aligned on word or double-word boundaries for faster access.
← →
ququ (2006-09-21 16:20) [11]Нет, данные в массиве - это не совокупнтость нескольких моих рекордов.
Т.е. например я с верхужки снимаю байт, потом дворд, потом дохожу например до позиции 10 с верхушки и запихиваю с этой позиции данные в рекорд.
← →
Наиль © (2006-09-21 16:35) [12]
> Зачем упакованную?
Нажми 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КБ используется рубь с копейкой.
← →
Сергей М. © (2006-09-21 16:41) [13]
> например я с верхужки снимаю байт, потом дворд, потом дохожу
> например до позиции 10 с верхушки и запихиваю с этой позиции
> данные в рекорд.
Да на здоровье, "запихивай" ..
Move(a[10], MyRecord, sizeof(MyRecord));
← →
Сергей М. © (2006-09-21 16:45) [14]Думаю даже, что и перемещение для обозначенных целей тебе вряд ли требуется ..
type
PTemp = ^Temp;
..
PTemp(@a[10]).SomeField := ...;
← →
Наиль © (2006-09-21 16:45) [15]
> например я с верхужки снимаю байт, потом дворд, потом дохожу
> например до позиции 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));
Страницы: 1 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.054 c