Сергей Борщ 136 10 августа, 2006 Опубликовано 10 августа, 2006 · Жалоба Ну допустим. Тогда как проще (и желательно красивее) всего прочитать число допустим float с байтового адреса?На ум пришло такое: float val; #pragma pack (push,1) typedef struct { float data; }packed_float_t; #pragma pack(pop) float = ((packed_float_t *)getAddr())->data; float = (*(packed_float_t *)getAddr()).data; но не проверял. Если попробуешь, сообщи результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 11 августа, 2006 Опубликовано 11 августа, 2006 · Жалоба Сергей Борщ Именно так я извратился ещё вчера. (в смысле float = ((packed_float_t *)getAddr())->data;) Но скомпиленный код получился ужасный. Хотя корректный. Через memcpy тоже вобщем нормально. Точнее не хуже этого. Странно ещё то, что компилятор даже warning не выдал когда скомпилил мой приведённый отрывок. Мало того, неправильно его скомпилил, так ещё я подумал что он достаточно умный чтоб не ошибиться. На мой взгляд это какая-то недоработка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 11 августа, 2006 Опубликовано 11 августа, 2006 (изменено) · Жалоба Ну есть еще злой способ: float getfloat(char *p) { #pragma pack(1) union { float x; struct { char c1; char c2; char c3; char c4; }; }; #pragma pack() c1=*p++; c2=*p++; c3=*p++; c4=*p; return(x); } В иаре точно стрельнет, в остальных - скорее всего надо именовать юнион и структуру, что не меняет идеи ;) Изменено 11 августа, 2006 пользователем Rst7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 136 11 августа, 2006 Опубликовано 11 августа, 2006 · Жалоба Сергей Борщ Именно так я извратился ещё вчера. (в смысле float = ((packed_float_t *)getAddr())->data;) Говорят, "у дураков мысли сходятся" :-) Однако продолжение почему-то забывают: "но у умных - чаще!" Странно ещё то, что компилятор даже warning не выдал когда скомпилил мой приведённый отрывок. Мало того, неправильно его скомпилил, так ещё я подумал что он достаточно умный чтоб не ошибиться. На мой взгляд это какая-то недоработка.Вроде у Страуструпа читал, что если уж используешь явное преобразование указателей - сам смотри. Ведь в зависимости от контекста этот код может быть как абсолютно правильным (если этот char * в прошлой жизни был float *) и тогда предупреждения компилятора будут мешать или неправильным как в твоем случае. Видимо, придется просто запомнить, что в подобных случаях могут быть грабли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться