jenya7 0 27 декабря, 2022 Опубликовано 27 декабря, 2022 (изменено) · Жалоба С инициализацией проблем нет 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; есть какой то метод или всё пропало? Изменено 27 декабря, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 6 27 декабря, 2022 Опубликовано 27 декабря, 2022 · Жалоба Так в любом раскладе не пойдет, т.к. sizeof(generic) вернет размер указателя. Нужен sizeof(*generic). Но, сдается, так не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 декабря, 2022 Опубликовано 27 декабря, 2022 (изменено) · Жалоба 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) )); требует каст к определённому типу :(( Изменено 27 декабря, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 27 декабря, 2022 Опубликовано 27 декабря, 2022 · Жалоба 22 minutes ago, jenya7 said: ругается - Error[Pe070]: incomplete type is not allowed компилятор для sizeof должен знать тип данных заранее, еще на этапе компиляции, не в рантайме в рантайме можно просто передавать значение размера типа данных как доп. параметр, но его нужно выяснять на этапе компиляции тогда, когда известен тип данных (где то в другом модуле программы ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 декабря, 2022 Опубликовано 27 декабря, 2022 · Жалоба On 12/27/2022 at 12:05 PM, Forger said: компилятор для sizeof должен знать тип данных заранее, еще на этапе компиляции, не в рантайме в рантайме можно просто передавать значение размера типа данных как доп. параметр, но его нужно выяснять на этапе компиляции тогда, когда известен тип данных (где то в другом модуле программы ) как доп. параметр это прекрасно когда он один. а если 10 генериков? 10 доп. параметров? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 27 декабря, 2022 Опубликовано 27 декабря, 2022 · Жалоба 9 minutes ago, jenya7 said: а если 10 генериков? 10 доп. параметров? Параметр ОДИН и подразумевает РАЗНЫЕ значения, в данном случае параметр - это размер неких типов данных (по вашей терминологии некий "дженерик"). Это будет число типа uint8_t, вряд ли больше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 декабря, 2022 Опубликовано 27 декабря, 2022 (изменено) · Жалоба 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; Изменено 27 декабря, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 27 декабря, 2022 Опубликовано 27 декабря, 2022 · Жалоба 21 minutes ago, jenya7 said: как мне одним параметром сообщить что в одном случае один параметр - адрес объекта, второй - его размер, выясненный ЗАРАНЕЕ на этапе компиляции, когда еще известен его тип. или не размер, а некий typeid, как это реализовано в плюсах в рантайме увы, из вашего описания нельзя понять, что и как тут будет работает, чтобы предложить что-то более конкретное ( поэтому пока так Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 декабря, 2022 Опубликовано 27 декабря, 2022 (изменено) · Жалоба On 12/27/2022 at 12:47 PM, Forger said: один параметр - адрес объекта, второй - его размер, выясненный ЗАРАНЕЕ на этапе компиляции, когда еще известен его тип. или не размер, а некий typeid, как это реализовано в плюсах в рантайме так это отожрёт память которой и так осталось мало. typeid это минимум байт а мне таких нужно...много. Изменено 27 декабря, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 27 декабря, 2022 Опубликовано 27 декабря, 2022 · Жалоба 2 minutes ago, jenya7 said: typeid это минимум байт а мне таких нужно...много. тут либо я не пойму что вы хотите сделать, либо вы не поняли что я пытаюсь донести: тип данных вам хватит в ОДИН байт (256 типов) 4 minutes ago, jenya7 said: так это отожрёт память память бывает разная, о чем вообще речь? опишите задачу более конкретно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 декабря, 2022 Опубликовано 27 декабря, 2022 · Жалоба 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? для каждого? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 27 декабря, 2022 Опубликовано 27 декабря, 2022 · Жалоба 17 minutes ago, jenya7 said: но если у меня три generic - generic1, generic2, generic3 и каждый указывает на свой тип - мне нужно три typeid? для каждого? делайте столько, сколько нужно если больше двух, то лучше разбирать по switch/case Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 декабря, 2022 Опубликовано 27 декабря, 2022 · Жалоба On 12/27/2022 at 1:28 PM, Forger said: делайте столько, сколько нужно если больше двух, то лучше разбирать по switch/case так в этом то и проблема - дополнительный расход памяти на typeid. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gridinp 3 27 декабря, 2022 Опубликовано 27 декабря, 2022 · Жалоба если есть такая возможность, может быть раскидать разные типы по разным сегментам и определять тип по диапазону адресов... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 27 декабря, 2022 Опубликовано 27 декабря, 2022 · Жалоба 21 minutes ago, jenya7 said: дополнительный расход памяти на typeid -1 байт озу делает погоду? складывается ощущение, что вся эта затея больше похоже на некий мегакостыль чего-то очень простого, что переделав сразу съэкономит и память и упростит код Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться