Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.049 c
2-1159109758
Серый
2006-09-24 18:55
2006.10.08
Поля Edit


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


1-1156694491
Still Swamp
2006-08-27 20:01
2006.10.08
Баг с TMainMenu


2-1159078361
ds
2006-09-24 10:12
2006.10.08
Динамика


15-1158176108
Ne-Lud
2006-09-13 23:35
2006.10.08
ACM олимпиады. Какова от них польза?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский