![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Преобразование массива байтов в вещественное число [D7, XP]
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]можно. делай.