![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
Помогите ) туплю сижу,собственно пример и output
http://codepad.org/3tR7DXiC В теории прибавляемое смещение 0х8, на практике получаем 0х20 сорри если вопрос глупый, сонный я ) -------------------- |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
500mhz, это же арифметика указателей. указатель + N ==> передвинуть указатель на N элементов. (не на N байт!!!) т.е. указатель + N ==> это значение указателя + N*(размер того, на что он указывает). в вашем случае pVar + 8; означает: передвинуть указатель на 8 элементов. а так, как pVar это указатель на int, sizeof (int) = 4, то к адресу указателя прибаляется 8*4=32 (0x20) Если бы pVar указывал на char, было бы 8 Добавлено @ 04:41 можно здесь почитать, например: http://www.cs.umd.edu/class/sum2003/cmsc31...Op/pointer.html Это сообщение отредактировал(а) volatile - 14.3.2012, 04:47 |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
это все понятно
вообщем мне нада сделать следующее есть адрес неких данных есть оффсеты нужно прибавит к адресу оффсет и из получившегося адреса взять значение пс на асме это выглядит так
как это красиво сделать на С ? -------------------- |
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Красиво не получится:
Или так:
Пусть не так красиво, как в асме, но зато можно short, long long и т.п. юзать))) Это сообщение отредактировал(а) feodorv - 14.3.2012, 20:25 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
взрыв мозга )))
feodorv +1 пс и эти люди говорят что асм трудно читаем и понимаем? ))) -------------------- |
|||
|
||||
| sergioK1 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
похожая ситуация , добаваил один чар
должен быть 13 , а он 16 , откуда и зачем ? P.S помню что где-то осуждалось, Это сообщение отредактировал(а) sergioK1 - 14.3.2012, 23:00 |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Всё правильно, выравнивание по 4-х байтной границе. Здесь точно обсуждалось ;) Это сообщение отредактировал(а) feodorv - 14.3.2012, 23:46 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
сделал так
TCC компилит а вот Pelles говорит error и все тут (addr = addr + *temp) интересно что говорит стандарт? -------------------- |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
А что такое addr? Если только это не void*, то строчка нормальная. Ошибок именно в ней быть не должно. А вот здесь что-то не то. 500mhz, покажите что такое addr, не хочется строить догадки. (Ну или почему не воспользоваться макросом от feodorv, вполне нормальное решение для С, имхо) |
|||
|
||||
| 500mhz |
|
||||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
volatile
интересно самому как бы сделать) по коду имеем int addr;
во тут как раз самое то ) при компиляции получаем addr + 0 (если shit1 первый мембер) -------------------- |
||||
|
|||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Почему addr именно int? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
а почему нет? -------------------- |
|||
|
||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Ну это всё-таки адрес или нет? Если адрес, то такое значение в Си может принимать только указатель:
Поэтому-то такой код и даёт ошибку: Напрямую присвоить указателю интегер значение в С запрещено (и правильно ;) Если очень хочется (а это мало когда нужно) из интегера сделать адрес, то это можно сделать так:
то есть напрямую задав преобразование типов. И наоборот:
Однако в 64-битном окружении (а интегер там остаётся 32-битным) такое преобразование будет некорректным. В любом случае, не стоит увлекаться такими преобразованиями. Пусть указатель остаётся указателем (то есть по значению - адресом), а интегер - интегером))) Это сообщение отредактировал(а) feodorv - 15.3.2012, 22:56 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
feodorv
в моем случае addr это адрес начала заголовка данных в памяти имеется struct который описывает заголовок, сам заголовок состоит из различных значений и смещений в результате берем адрес начала данных 0xf0000000 прибавляем смещение 0xf0000000 + 0xa0 из полученого адреса 0xf000000a0 берем число которое интерпретируется а) как значение б) или как новое смещение пс просто меня ломает переписывать с 32 на 64 все это на асме ))) -------------------- |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
А не проще создать свой struct (можно без преферанса и балерин), описывающий требуемые данные, затем указателю на этот struct присвоить значение начального адреса, а затем обращаться к полям через этот указатель и через стрелку
Это сообщение отредактировал(а) borisbn - 16.3.2012, 06:57 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
volatile
инты вполне подходят, так как исполняемый код может быть 32 или 64, а размерность данных все время та же самая остается. borisbn да можно и как , вполне рабочий вариант, я так пробовал. единственное но, после компиляции получается следующее 1) данная структура определяется в памяти как не инициализированые данные 2) *ptr = (MyStruct*)addr; - приводит к копированию части данных (memcpy) на область определенную в пункте 1 что меня не вполне устраивает -------------------- |
|||
|
||||
| borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
объект типа MyStruct нигде не создаётся. создаётся указатель на такую структуру
нет. данные не копируются. делается простое приведение типов (из указателя на char, т.е. из addr, в указатель на MyStruct, т.е. ptr). а звёздочка перед ptr в моём примере это не разыменовывание указателя, а создание указателя. Лучше переписать так, чтобы было понятней
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
Правильно, в файловой секции он места не занимает, размер который занимает обьект выделяется при загрузке файла. И туда потом копируется ptr = (MyStruct*)addr; кусок данных размером с MyStruct (проверено дизасемблером) )) -------------------- |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
не размером MyStruct, а размером MyStruct*, т.е. просто указатель. 4 байта на 32х или 8 байт на 64х. проверено веками) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
попробуй откомпили, нет шас под рукой компилера но есть дизасм )
а я посмотрю -------------------- |
|||
|
||||
| xvr |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Инты в качестве адреса не подходят, т.к. 'размерность данных все время та же самая остается', а размер указателя меняется Добавлено через 10 минут и 35 секунд Вот, gcc 64 бита:
Асм слегка подрезал
Как видим никаких MyStruct нигде не заводится, только указатель ptr Добавлено через 13 минут и 54 секунды Кстати, оно же с оптимизацией
|
||||||||
|
|||||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |