реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Q: знатокам arm-вского ассемблера
Сергей Борщ
сообщение Aug 10 2006, 15:14
Сообщение #31


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GetSmart @ Aug 10 2006, 16:30) *
Ну допустим. Тогда как проще (и желательно красивее) всего прочитать число допустим 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;

но не проверял. Если попробуешь, сообщи результат.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 11 2006, 02:03
Сообщение #32


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Сергей Борщ
Именно так я извратился ещё вчера. (в смысле float = ((packed_float_t *)getAddr())->data;)
Но скомпиленный код получился ужасный. Хотя корректный.

Через memcpy тоже вобщем нормально. Точнее не хуже этого.

Странно ещё то, что компилятор даже warning не выдал когда скомпилил мой приведённый отрывок. Мало того, неправильно его скомпилил, так ещё я подумал что он достаточно умный чтоб не ошибиться. На мой взгляд это какая-то недоработка.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Rst7
сообщение Aug 11 2006, 05:14
Сообщение #33


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Ну есть еще злой способ:
Код
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);
}

В иаре точно стрельнет, в остальных - скорее всего надо именовать юнион и структуру, что не меняет идеи wink.gif

Сообщение отредактировал Rst7 - Aug 11 2006, 05:15


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 11 2006, 08:16
Сообщение #34


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GetSmart @ Aug 11 2006, 05:03) *
Сергей Борщ
Именно так я извратился ещё вчера. (в смысле float = ((packed_float_t *)getAddr())->data;)
Говорят, "у дураков мысли сходятся" :-) Однако продолжение почему-то забывают: "но у умных - чаще!"
Цитата
Странно ещё то, что компилятор даже warning не выдал когда скомпилил мой приведённый отрывок. Мало того, неправильно его скомпилил, так ещё я подумал что он достаточно умный чтоб не ошибиться. На мой взгляд это какая-то недоработка.
Вроде у Страуструпа читал, что если уж используешь явное преобразование указателей - сам смотри. Ведь в зависимости от контекста этот код может быть как абсолютно правильным (если этот char * в прошлой жизни был float *) и тогда предупреждения компилятора будут мешать или неправильным как в твоем случае. Видимо, придется просто запомнить, что в подобных случаях могут быть грабли.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th August 2025 - 03:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.0157 секунд с 7
ELECTRONIX ©2004-2016