2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Обратиться к "длинным типам", как к массиву байт (в C)
Сообщение11.12.2018, 20:43 
Заслуженный участник


20/08/14
11153
Россия, Москва
realeugene в сообщении #1360521 писал(а):
Если хочется завести дополнительные типизированные функции - переходники, нужно заводить типизированные функции, а не макросы. inline функции есть уже давно даже в сях, не говоря про плюсы, в которых они были изначально.
Да, типизированные inline функции приятны и полезны, вот только компиляторы не под все архитектуры достаточно умны чтобы ими правильно пользоваться! Пример, недавно боролся (так и не победил): в высокоскоростном прерывании если не вызывать функции, то сохраняются только реально используемые регистры, если же вызвать хоть одну любую функцию, даже практически пустую и inline - при входе в прерывание сохраняются все регистры, которые могут измениться функцией хотя бы в принципе (по соглашению об использовании регистров), даже если конкретно эта функция их и не изменяет. А это часто намного больше и дольше! Так что иногда #define выгоднее функции. Программы на C/C++ не ограничиваются компьютерами, где компиляторы действительно довольно хороши.

 Профиль  
                  
 
 Re: Обратиться к "длинным типам", как к массиву байт (в C)
Сообщение11.12.2018, 20:55 


28/07/17

317
realeugene в сообщении #1360529 писал(а):
Изучайте обычное распределение памяти под переменные и преобразования типов указателей. Которое, вообще говоря, работать не обязано на всех архитектурах, но обычно работает. Преобразование переменной к массиву байт, вообще говоря, непереносимая низкоуровневая конструкция.

На всякий случай преобразовал переменную именно к массиву байт. Это то, о чём спрашивал автор темы? Этот код может не работать?

Код:
    float xf = 0.2;
    uchar *xb = (uchar *) &xf;
    uchar abc[sizeof(xb)];

    for(int i = 0; i < sizeof(xb); i++)
    {
        abc[i] = xb[i];
    }

 Профиль  
                  
 
 Re: Обратиться к "длинным типам", как к массиву байт (в C)
Сообщение11.12.2018, 20:55 


27/08/16
9426
Dmitriy40 в сообщении #1360527 писал(а):
Я повторю, void* допускает слишком широкие неявные преобразования, что практически аннулирует для него контроль типов и соответственно опечаток и ошибок. Да, механизм стандартный, но отсутствие контроля мне не нравится.

И я повторю: void* - это стандартный тип указателя для нетипизированных буферов. Посмотрите, например, на прототип библиотечной функции memcpy. И правильно, что вам надоедает писать везде sizeof, когда у вас одинаковых вызовов много. Напишите набор функций-обёрток для своих типов, но не макросы. И никогда, подчеркну, никогда не кодируйте размер переменной явной константой, если вы, конечно, не любитель искать себе приключений.

Ну а использование ключевого слова inline вам всегда поможет успокоить нервы, если для вас критична скорость работы подобных функций-обёрток. Но и без ключевого слова inline в большинстве случаев подобный дополнительный вызов незначительно влияет на скорость. И замечу, что для сокращения размера исполняемого кода нормальная (не inline) функция-обёртка при многократном использовании выгоднее, чем макросы.

Что касается древних компиляторов для мелочи - да, извращения могут требоваться разные, конечно. Вплоть до использования ассемблера. Это всё уже несколько выходит за границы обсуждаемой темы. И всё равно не думаю, что если у вас в прерывании не было вызова ни одной функции, то код этого прерывания был достаточно сложным, чтобы писать под это дело макросы.

-- 11.12.2018, 20:59 --

FomaNeverov в сообщении #1360534 писал(а):
Этот код может не работать?
Возможных причин неработы кода всегда существует гораздо больше, чем причин его работы.

 Профиль  
                  
 
 Re: Обратиться к "длинным типам", как к массиву байт (в C)
Сообщение11.12.2018, 21:19 


28/07/17

317
EUgeneUS в сообщении #1360470 писал(а):
А задача такая - сохранить в EEPROM (а потом прочитать) переменную, размер которой несколько (больше одного) байт.

Ну а вопрос, как из 4-х байт сделать float - будет?

 Профиль  
                  
 
 Re: Обратиться к "длинным типам", как к массиву байт (в C)
Сообщение12.12.2018, 08:11 
Аватара пользователя


11/12/16
13284
уездный город Н
FomaNeverov в сообщении #1360534 писал(а):
Это то, о чём спрашивал автор темы?

Код, который Вы привели в первом своем сообщении в этой теме, конечно, не "// т.е. помещает байты флоата в массив".
Но это то, что было нужно ТС.
Вот только про этот фокус с указателем было сказано в пером же ответе.

FomaNeverov в сообщении #1360541 писал(а):
Ну а вопрос, как из 4-х байт сделать float - будет?

А зачем? К моменту Вашего сообщения у меня уже все разбиралось, сохранялось, читалось и собиралось обратно.
Но всё равно, спасибо!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group