Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Положение поля в классе 
:(
    Опции темы
Ivan.
  Дата 8.10.2008, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Как получить Offset поля в классе?
При применении ассемблерных вставок в C++ для работы со структурами появляется необходимость взятия переменной относительно какого-то объекта (указателя), например:
Код

LD R0, [this, OFFSET(T::i)]

Я конечно утрированно написал для понятия смысла задачи, да и ассемблер немного спицифичнее ежели в примере.
Написал define:
Код

#define OFFSETT(Type, Item) (((int)((char *)(&((Type *)0)->Item))))

Что впринципе и возврящает необходимую константу. В С++ такой прикол проканывает, в асме старого компилятора тоже, а в новом начинает через один ворчать, мол не константа это.
Подскажите, может есть какие нибудь иные способы решения?


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
SaDFromSpb
Дата 9.10.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



В С++ для этого есть команда offsetof

Код

struct A {
   float x;
   int y;
};

cout<< "Offset of A::y is "<<offsetof(A, y)<<endl;


Это сообщение отредактировал(а) SaDFromSpb - 9.10.2008, 18:50


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
Ivan.
Дата 15.10.2008, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Да действительно такой дефайн уже есть, правдо в WinAVR-е его забыли. Но это не суть, впринцыпе я написал его-же.
Все хорошо, все правильно, но компилятор ругается, притом через раз. Вот пример:
Код

.....
    LDD(StatusO, Bus, offsetof(TMultiBus, StatusO));           //StatusO = Bus->StatusO;
    CPI(StatusO, soNone);                                      //if (StatusO != soNone)
    BREQ(TMultiBusRECV_NoColise);                              //{
        LDD(Echo, Bus, offsetof(TMultiBus, Echo));             //    Echo = Bus->Echo;
        CPSE(Echo, Byte);                                      //    if (Echo != Byte)
        LDI(StatusO, soNone);                                  //        StatusO = soNone;
        LDD(Echo, Bus, offsetof(TMultiBus, NextEcho));         //    Echo = Bus->NextEcho;
        STD(Bus, Echo, offsetof(TMultiBus, Echo));             //    Bus->Echo = Echo;
LABEL(TMultiBusRECV_NoColise);                                 //}
.....

Функции LDD, CPI, ... - это есть дефайны ассемблерных вставок, например:
Код

#define      LDD(Rd, Rb, K6) volatile asm("LDD    %0,  %a1+%2\n":"=r"(Rd)          :"e"(Rb), "I"(K6)) //Description: Load Indirect with displacement         |Operation: Rd = (Y+K6)                         |Flags: --------         |Cycles: 2

Компилятор выдает ошибки на строки 4 и 8 (именно те две строки, где используются два одинаковых offsetof(TMultiBus, Echo)), остальные строки проходят нормально.
error: impossible constraint in 'asm'

Вот я и хочу спросить, есть ли какие нибудь другие варианты?


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
bsa
Дата 15.10.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Попробуй так:
Код
#define ITEM_OFFSET(Type, Item) (\
    static_cast<unsigned long>(\
        reinterpret_cast<const char *>( &static_cast<const Type*>(0)->Item ) \
        - reinterpret_cast<const char *>( static_cast<const Type*>(0) )))


Это сообщение отредактировал(а) bsa - 15.10.2008, 11:41
PM   Вверх
Ivan.
Дата 20.10.2008, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Нифига, таже ошибка, причем если одну из ошибочных строк закоментарить, то вторая компилируется нормально.


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
J0ker
Дата 20.10.2008, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



я что-то не понимаю или Rb и K6 из макроса должны быть строками?


--------------------
user posted image
PM MAIL   Вверх
Ivan.
Дата 23.10.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Цитата(J0ker @  20.10.2008,  19:11 Найти цитируемый пост)
я что-то не понимаю или Rb и K6 из макроса должны быть строками?

какими строками?


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.