На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> static_cast для получения значения адреса в числовом представлении
    Цитата Qraizer @
    ЫукпШ, это работает ровно до тех пор, пока репрезентация указателей разных типов одинакова. Никто не гарантирует, что так оно и будет везде и всегда. И даже больше: кое-где это не так.

    Qraizer, да.
    У микроконтроллеров бывают самые неожиданные варианты адресации.
    Общего решения нет.
    Значит, подобные мероприятия в каждом конкретном случае решаются индивидуально.
    Можно добавить, что подобная операция мало чем отличается от де-сериализации.
    Есть некая память с содержимым, разбор данных которой целиком выполняется "вручную".
    Выполняя её мы всю ответственность берём на себя.
    ---
    Кроме того, мероприятия с чтением указателя можно сделать более "безопасными".
    Сначала узнаем размер указателя. sizeof. Сравним его с размером
    переменной, в которую собираемся его считывать. и.т.д.
    Или выделим достаточную память для чтения содержимого указателя.
    В данном случае нам заранее известно, что 64-битной переменной достаточно
    для приёма любого адреса.
      Цитата ЫукпШ @
      Сначала узнаем размер указателя. sizeof. Сравним его с размером переменной, в которую собираемся его считывать.
      делаем #include <stdint.h>. Используем uintptr_t. Все уже придумано до нас.
        Цитата Dushevny @
        делаем #include <stdint.h>. Используем uintptr_t. Все уже придумано до нас.

        Угу. Но это уже другая тема.
        Я написал нечто вроде:
        typedef uintptr_t address_type;

        Цитата ЫукпШ @
        Сначала узнаем размер указателя. sizeof. Сравним его с размером
        переменной, в которую собираемся его считывать.

        Я там прописал unsigned long long int... Но на самом деле использовался адаптивный тип address_type, зависящий от размера указателя на платформе.
        Ну и дополнительно, чтобы проверить совпадает ли размерность, вставил static_assert.
        Сообщение отредактировано: Eric-S -
          Цитата Eric-S @
          Ну и дополнительно, чтобы проверить совпадает ли размерность, вставил static_assert.

          Ничего проверять не надо. Как писал Qraizer выше, делаем "union_cast", в котором два поля uintptr_t и uintmax_t. И можем считать указатели)
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0215 ]   [ 17 queries used ]   [ Generated: 19.04.24, 04:23 GMT ]