реклама на сайте
подробности

 
 
> Положение поля в классе
Ivan.
сообщение Oct 9 2008, 05:48
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 13-02-07
Пользователь №: 25 325



Как получить Offset поля в классе?
Впринципе это вопрос общего назначения, но для уточнения, я пишу под WinAVR.
При применении ассемблерных вставок в C++ для работы со структурами появляется необходимость взятия переменной относительно какого-то объекта (указателя), например:
LDD R0, Y+OFFSET(T::i)
Написал define:
#define OFFSETT(Type, Item) ((int)(&((Type *)0)->Item))
Что впринципе и возврящает необходимую константу. В С++ такой прикол проканывает, в асме старого компилятора тоже, а в новом начинает через один ворчать, мол не константа это.
Подскажите, может есть какие нибудь иные способы решения?


--------------------
Я могу ВСЁ, вопрос, сколько времени у меня это займет.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Ivan.
сообщение Oct 15 2008, 06:13
Сообщение #2





Группа: Участник
Сообщений: 7
Регистрация: 13-02-07
Пользователь №: 25 325



Дефайна offsetof в 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'

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


--------------------
Я могу ВСЁ, вопрос, сколько времени у меня это займет.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 15 2008, 08:49
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Ivan. @ Oct 15 2008, 09:13) *
Все хорошо, все правильно, но компилятор ругается, притом через раз. Вот пример:
error: impossible constraint in 'asm'
Вот с этого и надо было начинать. В ошибке ведь все сказано. Идете в c:/WinAVR/DOC/avr-libc/avr-libc-user-manual, находите там руководство по inline-ассемблеру, и в нем видите, что с инструкцией ldd должны использоваться констранты (это как-то переводится?) r и b, а не r и e, как у вас.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Oct 15 2008, 10:50
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Сергей Борщ @ Oct 15 2008, 11:49) *
... констранты (это как-то переводится?) ...

Переводится так:
Цитата
1) принуждение; оказывание давления (на кого-л., что-л.)
- under constraint
- impose a constraint
- place a constraint
- put a constraint
- legal constraints
2)
а) принужденность; стеснение; стеснительность
б) напряженность; скованность, неестественность
- show constraint
Syn:
tensity, tenseness
3) тюремное заключение
Syn:
imprisonment

А вот как это выглядит в контексте сообщения ... wacko.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 04:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01387 секунд с 7
ELECTRONIX ©2004-2016