Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Преобразование массива байтов в вещественное число [D7, XP]


Страницы:   1 2

Zheksonz ©   (2012-06-25 12:27:00) 

Добрый день.
Имеется массив из 8 байтов, в котором хранится вещественное число. Как преобразовать этот массив в вещественное число?


Дмитрий Белькевич   (2012-06-26 20:15:00) [1]

Это не моё, цитата была, да. Нужно было в кавычки завернуть.


Дмитрий Белькевич   (2012-06-26 20:14:00) [2]


> Классно вам ребята, вот так вот смотреть на "бинарный код"
> и видеть "трёхмерное изображение", со всеми возможными "подводными
> камнями"...


Трехмерное - давно было :)

Однажды наш преподаватель математики пришел утром на лекцию в состоянии полнейшего восторга, чего с ним практически никогда не бывало. Он рассказал, что ему этой ночью приснилось двадцатишестимерное пространство. И это так классно и т. д. и т. п. Он раньше и представить себе даже такое не мог. До этого он мог представить лишь двадцатитрехмерное пространство...


sniknik   (2012-06-26 19:48:00) [3]

> что в Delphi, оказывается, массив пакуется всегда. Странно, но факт.
может посчитали и решили, что потери на "нечетном" доступе компенсируются упрощением расчета смещения... да и все.


Zheksonz   (2012-06-26 19:42:00) [4]

Классно вам ребята, вот так вот смотреть на "бинарный код" и видеть "трёхмерное изображение", со всеми возможными "подводными камнями"...

Это ж какой винт с оперативкой должны быть? Вопрос риторический, но от того не лишённый смысла...

Ещё раз всем спасибо!


Юрий Зотов   (2012-06-26 15:05:00) [5]


> Inovet ©   (26.06.12 03:02) [20]
> А идеологически такое допустимо ли?

Вполне, потому что именно такое поведение соответствует документации - если packed не указано, то массив паковаться не должен. В Паскале так и было и я немало удивился, узнав (из какого-то старого обсуждения здесь же), что в Delphi, оказывается, массив пакуется всегда. Странно, но факт.


Zheksonz   (2012-06-26 09:14:00) [6]

Юрий Зотов ©   (26.06.12 00:59) [18]

Спасибо, учту.


Anatoly Podgoretsky   (2012-06-26 08:30:00) [7]


> Но никто не может дать гарантию, что в
> какой-нибудь новой версии Delphi это не изменится - и тогда
> программа, которая раньше работала как часы, вдруг начнет
> глючить

Вот это


Германн   (2012-06-26 03:40:00) [8]


>  Юрий Зотов ©   (26.06.12 01:04) [19]
>
>
> > Zheksonz   (25.06.12 23:52) [16]
> > Что в худшем случае может произойти, если объявить массив
> > без слова packed?
>
> На сегодня, насколько я знаю, компилятор Delphi пакует массивы
> даже если слово packed не указано, поэтому не произойдет
> ничего страшного. Но никто не может дать гарантию, что в
> какой-нибудь новой версии Delphi это не изменится - и тогда
> программа, которая раньше работала как часы, вдруг начнет
> глючить (причем найти причину этот глюка может оказаться
> непросто). Поэтому лучше сразу подстраховаться и написать
> packed.
>

опять packed array?
Юр, ты хоть бы скажи подробнее - что у тебя вызывает сомнения?


Inovet   (2012-06-26 03:02:00) [9]

> [19] Юрий Зотов ©   (26.06.12 01:04)
> что в какой-нибудь новой версии Delphi это не изменится

А идеологически такое допустимо ли?


Юрий Зотов   (2012-06-26 01:04:00) [10]


> Zheksonz   (25.06.12 23:52) [16]
> Что в худшем случае может произойти, если объявить массив
> без слова packed?

На сегодня, насколько я знаю, компилятор Delphi пакует массивы даже если слово packed не указано, поэтому не произойдет ничего страшного. Но никто не может дать гарантию, что в какой-нибудь новой версии Delphi это не изменится - и тогда программа, которая раньше работала как часы, вдруг начнет глючить (причем найти причину этот глюка может оказаться непросто). Поэтому лучше сразу подстраховаться и написать packed.


Юрий Зотов   (2012-06-26 00:59:00) [11]


> Zheksonz   (25.06.12 23:42) [15]
> когда 100% известно количество используемых
> байтов, лучше массивы и записи "паковать"?

Паковать надо тогда, когда требуется, чтобы элементы массива шли в памяти непосредственно друг за другом, без пропусков. Если вы хотите преобразовать 8-байтовый массив в 8-байтовое число так, как сказано в [2], то Вам как раз это и нужно. Иначе массив займет не 8 байт, а больше. Например, при выравнивании на 4-байтовую границу каждый элемент массива будет дополнен неиспользуемыми тремя байтами "мусора" и преобразование по способу [2] даст неверное число.


Inovet   (2012-06-26 00:48:00) [12]

> [15] Zheksonz   (25.06.12 23:42)
> Т.е. для надёжности, когда 100% известно количество используемых
> байтов, лучше массивы и записи "паковать"?

Ты не понял для чего это. Паковка может замедлить скорость поскольку будет неудобно для процессора, но физическое расположение будет одинаково в разных версиях и с разными опциями.


Zheksonz   (2012-06-25 23:52:00) [13]

Что в худшем случае может произойти, если объявить массив без слова packed?


Zheksonz   (2012-06-25 23:42:00) [14]


> Юрий Зотов ©   (25.06.12 22:12) [14]


"Ключевое слово Packed говорит Delphi минимизировать память, взятую определенным объектом.

Обычно, сложные типы данных, такие как записи, имеют свои элементы по 2, 4 или 8 байта, соответствующие типам данных. Например, поле Word было бы 4-байтовое.

Записи также дополняются, для гарантии, что они закончены, 4-х байтовой границей.

Упаковка отменяет это, сжимая данные в наименьшую память, хотя с последующим уменьшенным доступом выполнения."

Т.е. для надёжности, когда 100% известно количество используемых байтов, лучше массивы и записи "паковать"?


Юрий Зотов   (2012-06-25 22:12:00) [15]

> Zheksonz   (25.06.12 19:51) [13]

Только массив тогда нужно объявлять со словом packed. Так надежнее.


Zheksonz   (2012-06-25 19:51:00) [16]


> MBo ©   (25.06.12 12:31) [2]
> DoubleVar := PDouble(@ByteArr[0])^(или с помощью absolute)


МВо, как в воду глядел, молодец. Спасибо.


Zheksonz   (2012-06-25 18:14:00) [17]


> sniknik ©   (25.06.12 14:07) [11]


Молодчина! Красиво преобразовал 8 байт.

Спасибо!


sniknik   (2012-06-25 14:07:00) [18]

> можно. делай.
хотя, честно говоря не понимаю желания запихивать в функцию простой вызов другой функции (+ передача ссылки объекта)... ну мало ли сколько строк это в C занимает/написано кем то, нафига тупо "переводить"?
но... -
function ReadFloat64(TCPClient: TIdTCPClient): Double;
var
 i: Int64 absolute result;
begin
 i:= TCPClient.Socket.ReadInt64(false);
end;


Inovet   (2012-06-25 13:51:00) [19]

> [6] icWasya ©   (25.06.12 13:19)
> то почему не так?

так ещё что-то здесь делается

> [5] Zheksonz   (25.06.12 12:40)
> BytesToRaw(buff, rawbuff, 8);


sniknik   (2012-06-25 13:51:00) [20]

можно. делай.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо