Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
 Использование указателя в качестве переменной  [new]
jenya7
Member

Откуда:
Сообщений: 1159
Скажем есть указатель
void * var_ptr;

я ведь могу инициализировать его каким нибудь адресом
var_ptr= (int *) 100;

и потом использовать в арифметических выражениях
int val1, val2;
val1 = val2 +  (int)var_ptr;

это ведь не нарушит ничего в программе?
16 май 19, 11:24    [21886041]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
Dima T
Member

Откуда:
Сообщений: 13915
Какой изврат (((

Работать будет, но потом сам забудешь про него и будешь долго косяк в коде искать.

Используй union, его для того и придумали чтобы разные типы в одной и той же памяти хранить.
16 май 19, 12:17    [21886094]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
alex55555
Member

Откуда:
Сообщений: 2129
Dima T
Работать будет

А что будет при переходе с архитектуры 32 на 64 бита?
16 май 19, 12:34    [21886113]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
Dima T
Member

Откуда:
Сообщений: 13915
alex55555
Dima T
Работать будет

А что будет при переходе с архитектуры 32 на 64 бита?

Ничего. Он приводит к int, а это везде 32 бита.
16 май 19, 12:43    [21886123]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
qasta
Member

Откуда:
Сообщений: 74
Dima T
alex55555
пропущено...

А что будет при переходе с архитектуры 32 на 64 бита?

Ничего. Он приводит к int, а это везде 32 бита.


Вы ошиблись. Размер переменной типа int далеко не везде равен 32 битам.
И указатели разных размеров бывают...
16 май 19, 14:14    [21886262]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
jenya7
Member

Откуда:
Сообщений: 1159
Dima T
Какой изврат (((

Работать будет, но потом сам забудешь про него и будешь долго косяк в коде искать.

Используй union, его для того и придумали чтобы разные типы в одной и той же памяти хранить.

в смысле? так?
typedef union
{
    void *ptr;
    int val;
} int_or_ptr_t;
16 май 19, 14:24    [21886284]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
Dima T
Member

Откуда:
Сообщений: 13915
jenya7
в смысле? так?

Да
16 май 19, 14:26    [21886286]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
jenya7
Member

Откуда:
Сообщений: 1159
Dima T
jenya7
в смысле? так?

Да

спасибо. на этом варианте остановлюсь.
16 май 19, 14:40    [21886315]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
jenya7
Member

Откуда:
Сообщений: 1159
jenya7
Dima T
пропущено...

Да

спасибо. на этом варианте остановлюсь.

более того, я же могу сделать так
typedef union
{
    uint_8_t *ptr;
    int16_t *ptr;
    int32_t *ptr;
    int val;
} int_or_ptr_t;

и тогда мне не нужен войд. и не нужно создавать где то переменную о типе данных.
16 май 19, 15:01    [21886343]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
Dima T
Member

Откуда:
Сообщений: 13915
jenya7
и не нужно создавать где то переменную о типе данных.

Нужно. Проблема не исчезла. При чтении по указателю тебе неизвестно сколько байт читать.
16 май 19, 15:09    [21886358]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
jenya7
Member

Откуда:
Сообщений: 1159
Dima T
jenya7
и не нужно создавать где то переменную о типе данных.

Нужно. Проблема не исчезла. При чтении по указателю тебе неизвестно сколько байт читать.

и нет способа знать где в юнион был оверлей?
16 май 19, 15:13    [21886361]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
Dima T
Member

Откуда:
Сообщений: 13915
jenya7
Dima T
пропущено...

Нужно. Проблема не исчезла. При чтении по указателю тебе неизвестно сколько байт читать.

и нет способа знать где в юнион был оверлей?

Нет.
union это просто способ написать код по-человечески вместо явного приведения к нужному типу, как ты это сделал изначально.
16 май 19, 15:31    [21886383]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
У меня как-то была идея как сэкономить дочерних на узлах бинарного дерева.
Чтоб поля использовались либо как указатель на дочерний узел. Либо как value.

struct BinaryNode {
    union {
       value_type value; // Main use-case
       value_ptr_type *valuePtr; // Optional use-case when value is larger that 2x pointers
       struct {
          BinaryNode *left;
          BinaryNode *right;
       } // Optional structure if else
    }
}

Но еще ввести какой-то признак чтоб различать что лежит не узловая вершина а листовая. Только не булеву переменную
а что-то более компактное. Пока не придумал как. Может на диапазонах адресов завязаться.
16 май 19, 16:32    [21886443]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
Базируется на предположении что 90% данных в бинарном дереве (если это серия чисел или короткие строки)
не превышают параграфа (128 бит или 16 байт).
16 май 19, 16:38    [21886449]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58418
Блог
jenya7
я ведь могу инициализировать его каким нибудь адресом

Да.

jenya7
и потом использовать в арифметических выражениях

Да.

jenya7
это ведь не нарушит ничего в программе?

Это смотря как написать программу. Вероятность ошибки при таких манипуляциях довольно велика. Если опишешь задачу, которую хочешь решить таким образом - возможно, получишь толковый совет, как её стоит решать на самом деле.
16 май 19, 22:04    [21886661]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
kolobok0
Member

Откуда:
Сообщений: 1951
jenya7
...и тогда мне не нужен войд. и не нужно создавать где то переменную о типе данных.


Понимаете в чём дело... Язык это способ формализации для железки. Первичен не он. Первична логика.

ИМХО: Вы не правильно ставите вопрос и посему все вынуждены отвечать на механику языка, а не на логически стройные-красивые-избитые-устоявшиеся алгоритмы.

Не обязательно выкладывать весь Ваш гимор. Достаточно выкинуть воду из проекта выделить суть и сосредоточиться на логике. А механика она приложиться - поверьте.

ЗЫ
Я так понимаешь, что Вам строго си (типо под мк вояете)? Если так - то выделите асинхронные глаголы, синхронную обработку, какую периферию юзаете и т.д.. оно так быстрее пойдёт...

(круглый)
17 май 19, 10:16    [21886933]     Ответить | Цитировать Сообщить модератору
 Re: Использование указателя в качестве переменной  [new]
jenya7
Member

Откуда:
Сообщений: 1159
kolobok0, softwarer
да просто хочу съэкономить на члене в структуре. пишу под микроконтролер. ресурсы ограниченны.
17 май 19, 15:05    [21887362]     Ответить | Цитировать Сообщить модератору
Все форумы / Программирование Ответить