Главная страница
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.047 c
2-1158321253
Xmen
2006-09-15 15:54
2006.10.08
Проблемы при организации базу данных по компьютерной технике


3-1154678271
jiny
2006-08-04 11:57
2006.10.08
Права пользователей в программе


2-1158912057
Дениска
2006-09-22 12:00
2006.10.08
Вставка JavaScript


3-1155124960
RitD
2006-08-09 16:02
2006.10.08
mySQL ,mysql dac2.2.4 и "cannot modify a read-only dataset"


15-1157967030
ANB
2006-09-11 13:30
2006.10.08
Нефть падает в цене.