Главная страница
    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.48 MB
Время: 0.042 c
9-1137021348
Buffer
2006-01-12 02:15
2006.10.08
GLScene Buffer Как узнать видна ли такая то точка или нет?


2-1158444935
Not
2006-09-17 02:15
2006.10.08
Как сделать систему dll-плагинов работающих на Си и Дельфи ?


15-1158484497
PHPDeveloper
2006-09-17 13:14
2006.10.08
Вопрос по БД


2-1158745919
id
2006-09-20 13:51
2006.10.08
Добавление строки в ListView


2-1158604031
urel
2006-09-18 22:27
2006.10.08
Выборка данных в связанных БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский