Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Размер на пойнтер
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=17229
Страница 1 от 1

Автор:  Н'бабане Гт'муан'га [ Сря Апр 08, 2020 1:59 pm ]
Заглавие:  Размер на пойнтер

Да запитам, ако има някой Ц-ар по-добър от мен да сподели :)
Опитвам се за измъдря как да взема размера на void* в препроцесора.

Трябва ми защото имам данни които съдържат други пойнтери, обаче техния размер зависи от системата, може да е 2,3,4 байта, дори 8. Та аз за да ги прочета тия данни конвертирам оригиналния void* в число, и после взимам новия void* от *(числото). Обаче тъй като не знам колко е голям един (void*), няма как да знам колко байта да прочета за конверсията на адреса. Бе не знам дали го обясних добре, ама...

Автор:  miro_atc [ Сря Апр 08, 2020 2:03 pm ]
Заглавие:  Re: Размер на пойнтер

sizeof(void*)?

Автор:  Н'бабане Гт'муан'га [ Сря Апр 08, 2020 2:04 pm ]
Заглавие:  Re: Размер на пойнтер

miro_atc написа:
sizeof(void*)?


В препроцесора??

Автор:  miro_atc [ Сря Апр 08, 2020 2:09 pm ]
Заглавие:  Re: Размер на пойнтер

sizeof() e оператор, т.е. няма нищо общо с препроцесора...

Автор:  Н'бабане Гт'муан'га [ Сря Апр 08, 2020 2:28 pm ]
Заглавие:  Re: Размер на пойнтер

miro_atc написа:
sizeof() e оператор, т.е. няма нищо общо с препроцесора...


Точно така, само че на мен както казах в първия пост, това не ми върши работа. Трябва ми в препроцесора.
Ето допълнително обяснение:
Имам данни които са от тип (void **). Обаче компилаторите не допускат *((void *) p) така че (p) трябва първо да го конвертирам в инт със съответната дължина и след това да прочета оттам. Примерно (void *) *((pointer_t *) p). Обаче за да дефинирам какво ми е pointer_t трябва да знам размера на void* в препроцесора за да мога да направя нещо от сорта
#if void_size == 4
typedef uint32_t pointer_t
#elif void_size == 8
typedef uint64_t pointer_t
#elif .....
....

Автор:  TheWizard [ Сря Апр 08, 2020 2:30 pm ]
Заглавие:  Re: Размер на пойнтер

мисля че "няма" начин ( освен косвен.... #if UINTPTR_MAX == 0xFFFF )
и аз търсих преди време ма намерих само "глупости"

Автор:  miro_atc [ Сря Апр 08, 2020 2:48 pm ]
Заглавие:  Re: Размер на пойнтер

Н'бабане Гт'муан'га написа:
Трябва ми в препроцесора.

Така си мислиш ;-)
указателите са нещо, които само компилатора разбира. Данните са нещо, което само ти разбираш.
Чисто логически, ако ти не знаеш какви са ти данните, нито препроцесора, нито компилатора не може да ти помогне.


Цитат:
Обаче компилаторите не допускат *((void *) p)


Не знам какво те кара да мислиш това. Да, void не е тип, който да адресираш и ползваш. Демек да кажеш, че имаш void означава, че не знаеш какви са ти данните и стигаме до момента, че нито препроцесор нито компилатор не могат да ти помогнат.
От друга страна указател към нещо си (включая void) си е съвсем реално нещо и с него може да си работиш както си искаш. Може да ги кастваш в каквото си искаш, макар че не разбирам защо ще го правиш, защото пак повтарям указателя си е указател...

Автор:  Реконструктор [ Сря Апр 08, 2020 2:52 pm ]
Заглавие:  Re: Размер на пойнтер

шокиращо, но sizeof(void*), sizeof(void**), sizeof(void*****) връща едно и също нещо

Автор:  miro_atc [ Сря Апр 08, 2020 2:57 pm ]
Заглавие:  Re: Размер на пойнтер

Има трикове с които могат да се правят проверки, без да се генерира код. Ето тук примерно има макросче в което може да проверяваш размери и т.н.
Тези трикове, обаче ползват компилатора... той генерира грешка ако проверката не е изпълнена. Ако е изпълнена няма грешка, няма код, няма нищо...

Ако не държиш на грешката може да си правиш обработки с код. Всеки уважаващ себе си компилатор ще оптимизира подобен код, т.е. ако имаш:
"if (sizeof(xx) == 4)
do_something;
else
do_something_else;"

проверката в случая няма да генерира код, освен ако не си в дебъг версия.

Автор:  syscop [ Сря Апр 08, 2020 2:58 pm ]
Заглавие:  Re: Размер на пойнтер

@Реконструктор
Напротив, съвсем нормално е - дава ти големината на указателя, а не къде сочи :)

Автор:  miro_atc [ Сря Апр 08, 2020 3:00 pm ]
Заглавие:  Re: Размер на пойнтер

Реконструктор написа:
шокиращо, но sizeof(void*), sizeof(void**), sizeof(void*****) връща едно и също нещо


кое пък те шокира?
Всички указатели имат един и същ размер, когато паметта е еднаква ;-)

Ако имаш 8 бит система и първите 256 байта могат да се адресират с един указател, а за останалата памет ти трябва друг тип, то е ясно че може да са с различна големина. Ама при съвременните компютри "всичкото" памет се адресира по един и същ начин.

Автор:  Н'бабане Гт'муан'га [ Сря Апр 08, 2020 3:35 pm ]
Заглавие:  Re: Размер на пойнтер

miro_atc написа:
...


Целия стил на предния ти пост ти е доста арогантен и не съм сигурен че заслужавам такова отношение при съвсем откровен въпрос който зададох в началото.

Void* наистина сочи към неизвестни данни, но размерът му си е съвсем известен на компилатора. И не е нещо необичайно да се ползва.
А ако не вярваш че компилаторът не допуска (void *) *((void *) p) пробвай си го сам.
Да правя в кода
if(sizeof(void *) == 2) ....
else if(sizeof(void *) == 3) ....
else if(sizeof(void *) == 4) ....
и т.н. е бавно индианско решение което не е невъзможно но ще прибягна до него само в краен случай

Автор:  Реконструктор [ Сря Апр 08, 2020 3:52 pm ]
Заглавие:  Re: Размер на пойнтер

syscop написа:
@Реконструктор
Напротив, съвсем нормално е - дава ти големината на указателя, а не къде сочи :)


Разбира се, че е нормално, ебавам се с горилата. :D Така и не разбрах точно ква му е мъката, обаче.

Автор:  miro_atc [ Сря Апр 08, 2020 4:01 pm ]
Заглавие:  Re: Размер на пойнтер

Н'бабане Гт'муан'га написа:
Целия стил на предния ти пост ти е доста арогантен и не съм сигурен че заслужавам такова отношение при съвсем откровен въпрос който зададох в началото.


Абстрахирай се от стила ми и виж дали в написаното намираш полезна информация. Ако не намираш, то какъвто и да беше стила ми е все тая ;-)

Може би ако разпишеш "индианското" решение аз или друг ще успее да го оптимизира и да ти отговори с С-код и без чувства ;-)

Автор:  Н'бабане Гт'муан'га [ Сря Апр 08, 2020 4:21 pm ]
Заглавие:  Re: Размер на пойнтер

Няма проблем, реших го по индианския начин :)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/