Перейти к содержанию
    

С инициализацией проблем нет

void *generic;
uint8_t flag[8];

generic = &flag[4];

Вопрос как передать значение по типу данных. без дополнительных индикаторов (переменных) типа данных.

если бы работал каст

(uint8_t *) generic = &flag[4];

можно было сделать так

int size = sizeof(generic);
    
if (size == 1)
    (*((uint8_t *)generic)) = val;
else
    (*((int *)generic)) = val;

есть какой то метод или всё пропало?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так в любом раскладе не пойдет, т.к. sizeof(generic) вернет размер указателя. Нужен sizeof(*generic). Но, сдается, так не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/27/2022 at 11:17 AM, Alex11 said:

Так в любом раскладе не пойдет, т.к. sizeof(generic) вернет размер указателя. Нужен sizeof(*generic). Но, сдается, так не получится.

ругается - Error[Pe070]: incomplete type is not allowed 

так тоже

int size = sizeof(( *(void *)(generic) ));

требует каст к определённому типу :((

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 minutes ago, jenya7 said:

ругается - Error[Pe070]: incomplete type is not allowed 

компилятор для sizeof должен знать тип данных заранее, еще на этапе компиляции, не в рантайме

в рантайме можно просто передавать значение размера типа данных как доп. параметр, но его нужно выяснять на этапе компиляции тогда, когда известен тип данных (где то в другом модуле программы )

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/27/2022 at 12:05 PM, Forger said:

компилятор для sizeof должен знать тип данных заранее, еще на этапе компиляции, не в рантайме

в рантайме можно просто передавать значение размера типа данных как доп. параметр, но его нужно выяснять на этапе компиляции тогда, когда известен тип данных (где то в другом модуле программы )

 

как доп. параметр это прекрасно когда он один. а если 10 генериков? 10 доп. параметров?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, jenya7 said:

а если 10 генериков? 10 доп. параметров?

Параметр ОДИН и подразумевает РАЗНЫЕ значения, в данном случае параметр - это размер неких типов данных (по вашей терминологии некий "дженерик"). Это будет число типа uint8_t, вряд ли больше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/27/2022 at 12:17 PM, Forger said:

Параметр ОДИН и подразумевает РАЗНЫЕ значения, в данном случае параметр - это размер неких типов данных (по вашей терминологии некий "дженерик"). Это будет число типа uint8_t, вряд ли больше.

void *generic_1;

uint8_t var1;
int var2;

generic_1 = &var1;

//later at some point
generic_1 = &var2;

как мне одним параметром сообщить что в одном случае

 (*((uint8_t *)generic_1)) = val;

а вдругом

 (*((int *)generic_1)) = val;

 

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, jenya7 said:

как мне одним параметром сообщить что в одном случае

один параметр - адрес объекта, второй - его размер, выясненный ЗАРАНЕЕ на этапе компиляции, когда еще известен его тип.

или не размер, а некий typeid, как это реализовано в плюсах в рантайме

 

увы, из вашего описания нельзя понять, что и как тут будет работает, чтобы предложить что-то более конкретное (

поэтому пока так

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/27/2022 at 12:47 PM, Forger said:

один параметр - адрес объекта, второй - его размер, выясненный ЗАРАНЕЕ на этапе компиляции, когда еще известен его тип.

или не размер, а некий typeid, как это реализовано в плюсах в рантайме

так это отожрёт память которой и так осталось мало. typeid это минимум байт а мне таких нужно...много.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, jenya7 said:

typeid это минимум байт а мне таких нужно...много.

тут либо я не пойму что вы хотите сделать, либо вы не поняли что я пытаюсь донести:

тип данных вам хватит в ОДИН байт (256 типов)

 

4 minutes ago, jenya7 said:

так это отожрёт память

память бывает разная, о чем вообще речь?

опишите задачу более конкретно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/27/2022 at 12:55 PM, Forger said:

тут либо я не пойму что вы хотите сделать, либо вы не поняли что я пытаюсь донести:

тип данных вам хватит в ОДИН байт (256 типов)

 

память бывает разная, о чем вообще речь?

опишите задачу более конкретно

один и тот же generic может указывать на разные типы данных. вы предлагаете typeid

void SetFirstIter(uint8_t type_id)
{ 
    if (type_id == TYPE_BYTE)
        (*((uint8_t *)generic)) = val;
    else
        (*((int *)generic)) = val;
}

но если у меня три generic - generic1, generic2, generic3 и каждый указывает на свой тип - мне нужно три typeid? для каждого?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 minutes ago, jenya7 said:

но если у меня три generic - generic1, generic2, generic3 и каждый указывает на свой тип - мне нужно три typeid? для каждого?

делайте столько, сколько нужно

если больше двух, то лучше разбирать по switch/case

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/27/2022 at 1:28 PM, Forger said:

делайте столько, сколько нужно

если больше двух, то лучше разбирать по switch/case

так в этом то и проблема - дополнительный расход памяти на typeid.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, jenya7 said:

дополнительный расход памяти на typeid

-1 байт озу делает погоду? 

складывается ощущение, что вся эта затея больше похоже на некий мегакостыль чего-то очень простого, что переделав сразу съэкономит и память и упростит код 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...