|
Положение поля в классе |
|
|
|
Oct 9 2008, 05:48
|

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

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

Группа: Участник
Сообщений: 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' Вот я и хочу спросить, есть ли какие нибудь другие варианты?
--------------------
Я могу ВСЁ, вопрос, сколько времени у меня это займет.
|
|
|
|
|
Oct 15 2008, 08:49
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Oct 15 2008, 19:56
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(defunct @ Oct 15 2008, 21:52)  Переводится как на инструкцию LDD накладываются ограничения dest - r, src - base pointer y, z.
Что кстати весьма странно, ведь эта инструкция может работать и с x регистром. Не может, нет инструкции LDD Rd, X+q; есть только LD Rd, [-]X[+] Цитата(Ivan. @ Oct 15 2008, 10:13)  Код #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' Вот я и хочу спросить, есть ли какие нибудь другие варианты? Я не экстрасенс, а автор не привел описание структуры (класа?) TMultiBus но все же рискну погадать. Скорее всего структура довольно большая и offsetof(TMultiBus, Echo) больше 63, что больше ограничения накладываемого constraint "I" (константа от 0 до 63). На что и ругается компилятор. Анатолий.
Сообщение отредактировал aesok - Oct 15 2008, 20:09
|
|
|
|
Сообщений в этой теме
Ivan. Положение поля в классе Oct 9 2008, 05:48 Сергей Борщ Цитата(Ivan. @ Oct 9 2008, 08:48) #define... Oct 9 2008, 06:46 ReAl Цитата(Ivan. @ Oct 9 2008, 08:48) При при... Oct 9 2008, 09:05 demiurg_spb Цитата(Ivan. @ Oct 15 2008, 10:13) Дефайн... Oct 15 2008, 07:40 aesok Цитата(Ivan. @ Oct 15 2008, 10:13) Компил... Oct 15 2008, 08:49  IgorKossak Цитата(Сергей Борщ @ Oct 15 2008, 11:49) ... Oct 15 2008, 10:50   Сергей Борщ Цитата(IgorKossak @ Oct 15 2008, 13:50) А... Oct 15 2008, 11:15 Ivan. Огромное спасибо за такую поддержку, но пока это в... Oct 20 2008, 05:18 defunct Ivan
Сорри за нескромный вопрос. Для чего Вы хотит... Oct 20 2008, 15:14  demiurg_spb Цитата(defunct @ Oct 20 2008, 19:14) Ivan... Oct 20 2008, 15:52 Ivan. ЦитатаСорри за нескромный вопрос. Для чего Вы хоти... Oct 28 2008, 07:06
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|