prottoss 0 20 сентября, 2005 Опубликовано 20 сентября, 2005 · Жалоба Кто нибудь знает как перегрузить оператор -> в IAR? struct U_Type { char a, b; U_Type *operator->() const { return this;} } На такую запись он ругается что надо ставить точку с запятой между оператор и ->. На другие варианты тоже. Запись по идее не перегружает оператор, а дублирует то что есть без перегрузки. Но в скобках можно написать что угодно... Кто нибудь использовал перегрузку? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 21 сентября, 2005 Опубликовано 21 сентября, 2005 · Жалоба Кто нибудь знает как перегрузить оператор -> в IAR? struct U_Type { char a, b U_type *operator->() const { return this;} } На такую запись он ругается что надо ставить точку с запятой между оператор и ->. На другие варианты тоже. Запись по идее не перегружает оператор, а дублирует то что есть без перегрузки. Но в скобках можно написать что угодно... Кто нибудь использовал перегрузку? <{POST_SNAPBACK}> Work in Visual C++: struct U_Type { char a; char b; U_Type *operator->() const { return (struct U_Type *)this;}; }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 21 сентября, 2005 Опубликовано 21 сентября, 2005 · Жалоба Work in Visual C++: Угу, жаль что только Visual C++ не поддерживает АВР... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 21 сентября, 2005 Опубликовано 21 сентября, 2005 · Жалоба Угу, жаль что только Visual C++ не поддерживает АВР... <{POST_SNAPBACK}> В EWAVR от IAR фрагмент кода от sergeeff: struct U_Type { char a; char b; U_Type *operator->() const { return (struct U_Type *)this;}; }; компилируется :)... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 56 21 сентября, 2005 Опубликовано 21 сентября, 2005 · Жалоба Кто нибудь знает как перегрузить оператор -> в IAR? struct U_Type { char a, b U_type *operator->() const { return this;} } На такую запись он ругается что надо ставить точку с запятой между оператор и ->. На другие варианты тоже. Запись по идее не перегружает оператор, а дублирует то что есть без перегрузки. Но в скобках можно написать что угодно... Кто нибудь использовал перегрузку? <{POST_SNAPBACK}> Во-первых, после b надо ставить ;. Во-вторых, оператор возвращает неизвестный тип: U_Type и U_type - это два разных типа. В-третьих, в конце определения типа надо тоже ставить ;. В-четвертых, функция объявлена как константная, и возвращаемое значение - не констатнта. Надо либо убрать const из определения функции, либо тип возврата квалифицировать словом const. В итоге код, приведенный ниже: struct U_Type { char a, b; const U_Type *operator->() const { return this;} }; Вполне успешно компилируется. Выводы: внимательнее надо быть, раз, и язык немножко подучить, два. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 21 сентября, 2005 Опубликовано 21 сентября, 2005 · Жалоба Во-первых, после b надо ставить ;. Во-вторых, оператор возвращает неизвестный тип: U_Type и U_type - это два разных типа. В-третьих, в конце определения типа надо тоже ставить ;. В-четвертых, функция объявлена как константная, и возвращаемое значение - не констатнта. Надо либо убрать const из определения функции, либо тип возврата квалифицировать словом const. В итоге код, приведенных ниже: struct U_Type { char a, b; const U_Type *operator->() const { return this;} }; Вполне успешно компилируется. Я записываю правильно, просто в топике при наборе символов ошибся, однако у меня все равно компилятор ругается. Может в опциях что не так поставил? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 56 21 сентября, 2005 Опубликовано 21 сентября, 2005 · Жалоба Во-первых, после b надо ставить ;. Во-вторых, оператор возвращает неизвестный тип: U_Type и U_type - это два разных типа. В-третьих, в конце определения типа надо тоже ставить ;. В-четвертых, функция объявлена как константная, и возвращаемое значение - не констатнта. Надо либо убрать const из определения функции, либо тип возврата квалифицировать словом const. В итоге код, приведенных ниже: struct U_Type { char a, b; const U_Type *operator->() const { return this;} }; Вполне успешно компилируется. Я записываю правильно, просто в топике при наборе символов ошибся, однако у меня все равно компилятор ругается. Может в опциях что не так поставил? <{POST_SNAPBACK}> А зачем в топике это набирать? :cranky: Взял из редактора и скопировал. Что может быть проще и быстрее? Вот полный код, который подается на вход компилятору: struct U_Type { char a, b; const U_Type *operator->() const { return this;} }; int main() { return 0; } Вот ключи компилятора: %IAR%\%AVR%\bin\iccavr.exe slon.cpp -lC slon.lst -e --ec++ --cpu=m128 -ms -s9 -r -I%IAR%\%AVR%\inc -I%IAR%\%AVR%\inc\dlib Вот листинг: ############################################################################## # # # 21/Sep/2005 13:48:59 # # IAR Atmel AVR C/C++ Compiler V4.10B/W32, Evaluation Version # # Copyright 1996-2005 IAR Systems. All rights reserved. # # # # Source file = slon.cpp # # Command line = slon.cpp -lC slon.lst -e --ec++ --cpu=m128 -ms -s9 -r # # -ID:\CAD\IAR\AVR\avr\inc -ID:\CAD\IAR\AVR\avr\inc\dlib # # --diag_suppress=Pe951 # # List file = slon.lst # # Object file = slon.r90 # # # # # ############################################################################## D:\slon\IAR\AVR\!V4\03_Overload\slon.cpp 1 2 struct U_Type 3 { 4 char a, b; 5 6 const U_Type *operator->() const { return this;} 7 }; 8 \ In segment CODE, align 2, keep-with-next 9 int main() \ main: 10 { 11 return 0; \ 00000000 E000 LDI R16, 0 \ 00000002 E010 LDI R17, 0 \ 00000004 9508 RET 12 } 13 Maximum stack usage in bytes: Function CSTACK RSTACK -------- ------ ------ main() 0 2 Segment part sizes: Function/Label Bytes -------------- ----- main() 6 6 bytes in segment CODE 6 bytes of CODE memory Errors: none Warnings: none Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 21 сентября, 2005 Опубликовано 21 сентября, 2005 · Жалоба Я не копировал свою структуру, потому что чувствовал, что такие вопросы, типа Ваших выше, появятся. Но пока отвечал на Ваши вопросы разобрался в чем дело - надо было в опциях проекта на вкладке General Options -> Library Configuration вместо CLIB подключить DLIB, И на вкладке C/C++ Compiler -> Language выставить Embedded C++ А реальная структура в проекте записана вот так теперь: typedef struct Menu_Item_Type Menu_Item; typedef struct Menu_Item_Type Menu_Item; struct Menu_Item_Type { CONST_CHAR *icon; // адрес пиктограммы CONST_CHAR *help; // адрес текстового пояснения к меню // указатели на соседние с данным пункты меню MENU_ITEM *left; // если смежных пунктов с данным нет, должен указывать на самого себя MENU_ITEM *right; // если смежных пунктов с данным нет, должен указывать на самого себя MENU_ITEM *up; // если родительских пунктов нет, должен быть равен NULL MENU_ITEM *down; // если нисходящих пунктов нет, должен быть равен NULL int flags; // флаги void (*metod)(); // функция, выполняющаяся при нажатии "ОК" Menu_Item *operator->() { return this;}; }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 56 21 сентября, 2005 Опубликовано 21 сентября, 2005 · Жалоба Я не копировал свою структуру, потому что чувствовал, что такие вопросы, типа Ваших выше, появятся. Но пока отвечал на Ваши вопросы разобрался в чем дело - надо было в опциях проекта на вкладке General Options -> Library Configuration вместо CLIB подключить DLIB, И на вкладке C/C++ Compiler -> Language выставить Embedded C++ <{POST_SNAPBACK}> Тип библиотеки для компиляции не важен - это скажется при линковке. А если ++ не были включены, то ессно, никакой перегрузки быть не могло. Вам бы надо было просто привести тест сообщения об ошибке, быстрее бы разобрались - наверняка компилятор в нем "намекал" на несоответствие исходного текста используемому языку. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 21 сентября, 2005 Опубликовано 21 сентября, 2005 · Жалоба Я не копировал свою структуру, потому что чувствовал, что такие вопросы, типа Ваших выше, появятся. Но пока отвечал на Ваши вопросы разобрался в чем дело - надо было в опциях проекта на вкладке General Options -> Library Configuration вместо CLIB подключить DLIB, И на вкладке C/C++ Compiler -> Language выставить Embedded C++ <{POST_SNAPBACK}> Тип библиотеки для компиляции не важен - это скажется при линковке. А если ++ не были включены, то ессно, никакой перегрузки быть не могло. Вам бы надо было просто привести тест сообщения об ошибке, быстрее бы разобрались - наверняка компилятор в нем "намекал" на несоответствие исходного текста используемому языку. :) <{POST_SNAPBACK}> тип сообщения в вольном переводе был "надо поставить ; после operator". А с ходу не смог разобраться потому что всю ночь сидел за написанием текста для константных переменных в памяти программ, отладил, а потом еще надо было это переделать для использования во внешней SPI памяти. А кругом понатыкано ->. Но я все равно решил проблему в традициях С. Ну а после сна уже все проветрилось, чему работать надо, и я проблему решил через С++. Однако после встречи с заказчиком настроение у меня опять изменилось. Те кто пишет остальные куски программы, пишут под голый С - и мои достижения с С++ оказались не нужны. Так что, то что я сделал ночью, осталось, а то, до чего я допер днем, то же осталось но только в моей голове. Всем спасибо за помощь, и извеняйте за оффтоп Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 56 21 сентября, 2005 Опубликовано 21 сентября, 2005 · Жалоба Однако после встречи с заказчиком настроение у меня опять изменилось. Те кто пишет остальные куски программы, пишут под голый С - и мои достижения с С++ оказались не нужны. <{POST_SNAPBACK}> Зачем же не нужны? С++ прекрасно дружит с С. Во-первых, С++ компилятор за очень немногими исключениями вполне успешно компиляет С-текст. Во-вторых, если надо устроить взаимодействие между кусками, написанными на С и С++, то для этого есть спецификация extern "C". Все можно легко подружить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 21 сентября, 2005 Опубликовано 21 сентября, 2005 · Жалоба Зачем же не нужны? С++ прекрасно дружит с С. Во-первых, С++ компилятор за очень немногими исключениями вполне успешно компиляет С-текст. Во-вторых, если надо устроить взаимодействие между кусками, написанными на С и С++, то для этого есть спецификация extern "C". Все можно легко подружить. Я знаю про директивы компилятора, но заказчикам так легче жить. К тому же основной проект компилится под С на IAR, а встроить, на сколько я знаю, можно кусок программы на C в проект, написанный на С++, но ни как не на оборот. Если только откомпилировать мой кусок в библиотеку, а заказчику предоставить совместимый с Си интерфейс. Но это лишние парки. Мне платят за исходники и хорошие комментарии к ним, чтобы люди могли разобраться в моей писанине и что-то изменить под свои нужды. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться