Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.033 c
15-1158389244
cyborg
2006-09-16 10:47
2006.10.08
старые программы тесты


15-1158514450
ArtemESC
2006-09-17 21:34
2006.10.08
Запутался с дискетами...


15-1158310115
Cyrax
2006-09-15 12:48
2006.10.08
Case-средства в серьёзных проектах


2-1158739362
KyRo
2006-09-20 12:02
2006.10.08
Время конекта


2-1158580517
Id
2006-09-18 15:55
2006.10.08
Картинка в BLOB-e