Автор |
Съобщение |
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 8:14 am Мнения: 4616 Местоположение: Новата земя на племето Мутум'ба
|
Размер на пойнтер
Да запитам, ако има някой Ц-ар по-добър от мен да сподели Опитвам се за измъдря как да взема размера на void* в препроцесора. Трябва ми защото имам данни които съдържат други пойнтери, обаче техния размер зависи от системата, може да е 2,3,4 байта, дори 8. Та аз за да ги прочета тия данни конвертирам оригиналния void* в число, и после взимам новия void* от *(числото). Обаче тъй като не знам колко е голям един (void*), няма как да знам колко байта да прочета за конверсията на адреса. Бе не знам дали го обясних добре, ама...
_________________ 'просто' е технически синоним на 'красиво'
|
Сря Апр 08, 2020 12:59 pm |
|
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 5:52 pm Мнения: 10368 Местоположение: Добрич
|
Re: Размер на пойнтер
sizeof(void*)?
|
Сря Апр 08, 2020 1:03 pm |
|
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 8:14 am Мнения: 4616 Местоположение: Новата земя на племето Мутум'ба
|
Re: Размер на пойнтер
_________________ 'просто' е технически синоним на 'красиво'
|
Сря Апр 08, 2020 1:04 pm |
|
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 5:52 pm Мнения: 10368 Местоположение: Добрич
|
Re: Размер на пойнтер
sizeof() e оператор, т.е. няма нищо общо с препроцесора...
|
Сря Апр 08, 2020 1:09 pm |
|
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 8:14 am Мнения: 4616 Местоположение: Новата земя на племето Мутум'ба
|
Re: Размер на пойнтер
Точно така, само че на мен както казах в първия пост, това не ми върши работа. Трябва ми в препроцесора. Ето допълнително обяснение: Имам данни които са от тип (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 |
|
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 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 |
|
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 5:52 pm Мнения: 10368 Местоположение: Добрич
|
Re: Размер на пойнтер
Така си мислиш указателите са нещо, които само компилатора разбира. Данните са нещо, което само ти разбираш. Чисто логически, ако ти не знаеш какви са ти данните, нито препроцесора, нито компилатора не може да ти помогне. Не знам какво те кара да мислиш това. Да, 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 |
|
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 5:52 pm Мнения: 10368 Местоположение: Добрич
|
Re: Размер на пойнтер
Има трикове с които могат да се правят проверки, без да се генерира код. Ето тук примерно има макросче в което може да проверяваш размери и т.н. Тези трикове, обаче ползват компилатора... той генерира грешка ако проверката не е изпълнена. Ако е изпълнена няма грешка, няма код, няма нищо... Ако не държиш на грешката може да си правиш обработки с код. Всеки уважаващ себе си компилатор ще оптимизира подобен код, т.е. ако имаш: "if (sizeof(xx) == 4) do_something; else do_something_else;" проверката в случая няма да генерира код, освен ако не си в дебъг версия.
|
Сря Апр 08, 2020 1:57 pm |
|
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 8:39 pm Мнения: 1968
|
Re: Размер на пойнтер
@ РеконструкторНапротив, съвсем нормално е - дава ти големината на указателя, а не къде сочи
_________________ Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!
|
Сря Апр 08, 2020 1:58 pm |
|
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 5:52 pm Мнения: 10368 Местоположение: Добрич
|
Re: Размер на пойнтер
кое пък те шокира? Всички указатели имат един и същ размер, когато паметта е еднаква Ако имаш 8 бит система и първите 256 байта могат да се адресират с един указател, а за останалата памет ти трябва друг тип, то е ясно че може да са с различна големина. Ама при съвременните компютри "всичкото" памет се адресира по един и същ начин.
|
Сря Апр 08, 2020 2:00 pm |
|
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 8:14 am Мнения: 4616 Местоположение: Новата земя на племето Мутум'ба
|
Re: Размер на пойнтер
Целия стил на предния ти пост ти е доста арогантен и не съм сигурен че заслужавам такова отношение при съвсем откровен въпрос който зададох в началото. 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: Размер на пойнтер
Разбира се, че е нормално, ебавам се с горилата. Така и не разбрах точно ква му е мъката, обаче.
|
Сря Апр 08, 2020 2:52 pm |
|
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 5:52 pm Мнения: 10368 Местоположение: Добрич
|
Re: Размер на пойнтер
Абстрахирай се от стила ми и виж дали в написаното намираш полезна информация. Ако не намираш, то какъвто и да беше стила ми е все тая Може би ако разпишеш "индианското" решение аз или друг ще успее да го оптимизира и да ти отговори с С-код и без чувства
|
Сря Апр 08, 2020 3:01 pm |
|
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 8:14 am Мнения: 4616 Местоположение: Новата земя на племето Мутум'ба
|
Re: Размер на пойнтер
Няма проблем, реших го по индианския начин
_________________ 'просто' е технически синоним на 'красиво'
|
Сря Апр 08, 2020 3:21 pm |
|
|