Отговори на тема  [ 15 мнения ] 
Размер на пойнтер 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4616
Местоположение: Новата земя на племето Мутум'ба
Мнение Размер на пойнтер
Да запитам, ако има някой Ц-ар по-добър от мен да сподели :)
Опитвам се за измъдря как да взема размера на void* в препроцесора.

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

_________________
'просто' е технически синоним на 'красиво'


Сря Апр 08, 2020 12:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10368
Местоположение: Добрич
Мнение Re: Размер на пойнтер
sizeof(void*)?


Сря Апр 08, 2020 1:03 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4616
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: Размер на пойнтер
miro_atc написа:
sizeof(void*)?


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

_________________
'просто' е технически синоним на 'красиво'


Сря Апр 08, 2020 1:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10368
Местоположение: Добрич
Мнение Re: Размер на пойнтер
sizeof() e оператор, т.е. няма нищо общо с препроцесора...


Сря Апр 08, 2020 1:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4616
Местоположение: Новата земя на племето Мутум'ба
Мнение 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 .....
....

_________________
'просто' е технически синоним на 'красиво'


Сря Апр 08, 2020 1:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4714
Мнение Re: Размер на пойнтер
мисля че "няма" начин ( освен косвен.... #if UINTPTR_MAX == 0xFFFF )
и аз търсих преди време ма намерих само "глупости"

_________________
main[-1u]={1};


Последна промяна TheWizard на Сря Апр 08, 2020 2:00 pm, променена общо 1 път



Сря Апр 08, 2020 1:30 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10368
Местоположение: Добрич
Мнение Re: Размер на пойнтер
Н'бабане Гт'муан'га написа:
Трябва ми в препроцесора.

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


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


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


Сря Апр 08, 2020 1:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 11:32 am
Мнения: 7884
Местоположение: София
Мнение Re: Размер на пойнтер
шокиращо, но sizeof(void*), sizeof(void**), sizeof(void*****) връща едно и също нещо


Сря Апр 08, 2020 1:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10368
Местоположение: Добрич
Мнение Re: Размер на пойнтер
Има трикове с които могат да се правят проверки, без да се генерира код. Ето тук примерно има макросче в което може да проверяваш размери и т.н.
Тези трикове, обаче ползват компилатора... той генерира грешка ако проверката не е изпълнена. Ако е изпълнена няма грешка, няма код, няма нищо...

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

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


Сря Апр 08, 2020 1:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1968
Мнение Re: Размер на пойнтер
@Реконструктор
Напротив, съвсем нормално е - дава ти големината на указателя, а не къде сочи :)

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Сря Апр 08, 2020 1:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10368
Местоположение: Добрич
Мнение Re: Размер на пойнтер
Реконструктор написа:
шокиращо, но sizeof(void*), sizeof(void**), sizeof(void*****) връща едно и също нещо


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

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


Сря Апр 08, 2020 2:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4616
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: Размер на пойнтер
miro_atc написа:
...


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

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

_________________
'просто' е технически синоним на 'красиво'


Сря Апр 08, 2020 2:35 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 11:32 am
Мнения: 7884
Местоположение: София
Мнение Re: Размер на пойнтер
syscop написа:
@Реконструктор
Напротив, съвсем нормално е - дава ти големината на указателя, а не къде сочи :)


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


Сря Апр 08, 2020 2:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10368
Местоположение: Добрич
Мнение Re: Размер на пойнтер
Н'бабане Гт'муан'га написа:
Целия стил на предния ти пост ти е доста арогантен и не съм сигурен че заслужавам такова отношение при съвсем откровен въпрос който зададох в началото.


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

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


Сря Апр 08, 2020 3:01 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4616
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: Размер на пойнтер
Няма проблем, реших го по индианския начин :)

_________________
'просто' е технически синоним на 'красиво'


Сря Апр 08, 2020 3:21 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 15 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни