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

 
 
> Поместить константу float на место int32, Чистый си.
SasaVitebsk
сообщение Jun 24 2013, 07:07
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Есть структура. Вся структура константная (размещается во флэши). В ней есть 2 поля int.
Дописывал функционал. Ввёл ещё одно поле, которое определяет тип констант. И работаю с ними поразному - или как с int32 или как с float.
А вот при заполнении такой структуры вываливается ошибка.
Как правильно записать, чтобы компилятор понял, что я от него хочу?
Код
typedef const struct
{
  const int32_t            *Index;                // Указатель на редактируемый параметр/ смещение для каналов
  const uint16_t        Ch;                    // 0/ Указатель на канал
  const uint8_t            fSignEn;            // Отображение знака числа
  const uint8_t            LenDig;                // Число цифр в числе (0 - гашение незначащих нулей)
  const uint8_t            DigAfterDot;        // Число цифр после точки (0 - точки нет)
  const uint8_t            DigType;            // Тип результирующего числа (0 - int8, 1 - int16, 2 - int32, 3 - float)
  const int32_t            min,max;            // минимальное и максимальное значение (если <min, то min, если >max, то max)
  const uint16_t        typeEditing;        // возможножность редактирования
  void                    (*savefunc)(void);    // Указатель на функцию записи редактируемых параметров
  const char* const*    NameUnits;            // наименование единиц измерения
} DigEditing_t;


Код
//***************************************************************
// @@ 23155. Диаметр трубопровода 1
DigEditing_t dgeD12_1 =                // Меню "Диаметр трубопровода"
{
  0,                                        // непрямое
  offsetof(PipelineChanal_t,QConfChanal[0])+offsetof(QConfChanal_t,dia_D12),    //
  0,                                        // неотображать знак
  7, 3,                                        // 3 знака, нет запятой
  (int32_t)1.0,(int32_t)5.0e3,                // min,max
  3,                                        // float
  PRGEDIT, 0,                                // Редактировать по паролю, не сохранять (сохранять по выходу из PRG)
  &strMm                                    // "мм"
};
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Jun 24 2013, 08:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Спасибо. Подумал про union, но немноого не в том ключе. Переклинило чего-то. Как-то я вообще очень редко union применяю.

Непроходит.
У меня IAR.
Объявил тип:
Код
typedef union
{
    float    f;
    int32_t    i;
} variant_t;

теперь изменил строчку структуры на
const variant_t min,max; // минимальное и максимальное значение (если <min, то min, если >max, то max)
Работаю соответственно с min.i и min.f. Всё прекрасно (собственно как и было).
При заполнении структуры IAR не даёт указать имя поля (как у Вас). И присваивает все значения как float. хотя я и ставлю L для константы например 200L

Как ему указать что из union заполнять?
Go to the top of the page
 
+Quote Post
_pv
сообщение Jun 24 2013, 08:43
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



есть еще дурацкий вариант сконвертировать float в int руками:
http://www.h-schmidt.net/FloatConverter/
5e3 == 0x459c4000
и еще более дурацкий - сделать такой ковертер на препроцессоре sm.gif.

по поводу инициализации uniona в IARе: приведение руками к нужному типу вроде должно работать
(int) 0x4444,
(float) 5e-3

постфикс L после константы вроде только на длину указывает, а не на тип.
ну то есть
5000L - long int,
5000.0L - double
Go to the top of the page
 
+Quote Post
XVR
сообщение Jun 24 2013, 09:33
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(_pv @ Jun 24 2013, 12:43) *
по поводу инициализации uniona в IARе: приведение руками к нужному типу вроде должно работать
(int) 0x4444,
(float) 5e-3
Не поможет. int и float легко преобразуются друг в друга С приведением типа. Причем преобразуются правильно - т.е. из целого он сделает плавающее, и наоборот. Т.е. побитовое представление изменится.

Что бы оно не менялось, нужно преобразовывать через указатели: как то так - *(int32_t*)(float*)&<ваша константа>. Но для констант это пройти не должно sad.gif

Если у вас есть C++ то вас спасет reinterpret_cast<int32_t>(5e-3f) (не забудьте про суффикс f в константе - без него это будет double, и reinterpret_cast не сработает)

Go to the top of the page
 
+Quote Post
_pv
сообщение Jun 24 2013, 09:39
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(XVR @ Jun 24 2013, 16:33) *
Не поможет. int и float легко преобразуются друг в друга С приведением типа. Причем преобразуются правильно - т.е. из целого он сделает плавающее, и наоборот. Т.е. побитовое представление изменится.

это понятно, вопрос был про инициализацию uniona и там вроде как именно по типу должно определяться какое именно поле инициализируется.
Go to the top of the page
 
+Quote Post



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

 


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


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