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

 
 
 
Reply to this topicStart new topic
> Перегрузка операторов в IAR, не получается перегрузить оператор ->
prottoss
сообщение Sep 20 2005, 16:26
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Кто нибудь знает как перегрузить оператор -> в IAR?

struct U_Type
{ char a, b;

U_Type *operator->() const { return this;}
}

На такую запись он ругается что надо ставить точку с запятой между оператор и ->. На другие варианты тоже. Запись по идее не перегружает оператор, а дублирует то что есть без перегрузки. Но в скобках можно написать что угодно... Кто нибудь использовал перегрузку?


--------------------
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Sep 21 2005, 05:50
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(prottoss @ Sep 20 2005, 19:26)
Кто нибудь знает как перегрузить оператор -> в IAR?

struct U_Type
{        char a, b

          U_type *operator->() const { return this;}
}

На такую запись он ругается что надо ставить точку с запятой между оператор и ->. На другие варианты тоже. Запись по идее не перегружает оператор, а дублирует то что есть без перегрузки. Но в скобках можно написать что угодно... Кто нибудь использовал перегрузку?
*


Work in Visual C++:

struct U_Type
{
char a;
char b;

U_Type *operator->() const { return (struct U_Type *)this;};
};
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 21 2005, 06:12
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(sergeeff @ Sep 21 2005, 13:50)
Work in Visual C++:


Угу, жаль что только Visual C++ не поддерживает АВР...


--------------------
Go to the top of the page
 
+Quote Post
Old1
сообщение Sep 21 2005, 06:19
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(prottoss @ Sep 21 2005, 09:12)
Угу, жаль что только Visual C++ не поддерживает АВР...
*


В EWAVR от IAR фрагмент кода от sergeeff:
struct U_Type
{
char a;
char b;

U_Type *operator->() const { return (struct U_Type *)this;};
};
компилируется smile.gif...
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 21 2005, 06:28
Сообщение #5


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(prottoss @ Sep 20 2005, 22:26)
Кто нибудь знает как перегрузить оператор -> в IAR?

struct U_Type
{        char a, b

          U_type *operator->() const { return this;}
}

На такую запись он ругается что надо ставить точку с запятой между оператор и ->. На другие варианты тоже. Запись по идее не перегружает оператор, а дублирует то что есть без перегрузки. Но в скобках можно написать что угодно... Кто нибудь использовал перегрузку?
*

Во-первых, после b надо ставить ;.

Во-вторых, оператор возвращает неизвестный тип: U_Type и U_type - это два разных типа.

В-третьих, в конце определения типа надо тоже ставить ;.

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

Код
struct U_Type
{
   char a, b;

   const U_Type *operator->() const { return this;}
};


Вполне успешно компилируется.

Выводы: внимательнее надо быть, раз, и язык немножко подучить, два.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 21 2005, 06:35
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(dxp @ Sep 21 2005, 14:28)
Во-первых, после b надо ставить ;.

Во-вторых, оператор возвращает неизвестный тип: U_Type и U_type - это два разных типа.

В-третьих, в конце определения типа надо тоже ставить ;.

В-четвертых, функция объявлена как константная, и возвращаемое значение - не констатнта. Надо либо убрать const из определения функции, либо тип возврата квалифицировать словом const. В итоге код, приведенных ниже:

Код
struct U_Type
{
   char a, b;

   const U_Type *operator->() const { return this;}
};


Вполне успешно компилируется.


Я записываю правильно, просто в топике при наборе символов ошибся, однако у меня все равно компилятор ругается. Может в опциях что не так поставил?


--------------------
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 21 2005, 06:52
Сообщение #7


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(prottoss @ Sep 21 2005, 12:35)
Цитата(dxp @ Sep 21 2005, 14:28)
Во-первых, после b надо ставить ;.

Во-вторых, оператор возвращает неизвестный тип: U_Type и U_type - это два разных типа.

В-третьих, в конце определения типа надо тоже ставить ;.

В-четвертых, функция объявлена как константная, и возвращаемое значение - не констатнта. Надо либо убрать const из определения функции, либо тип возврата квалифицировать словом const. В итоге код, приведенных ниже:

Код
struct U_Type
{
   char a, b;

   const U_Type *operator->() const { return this;}
};


Вполне успешно компилируется.


Я записываю правильно, просто в топике при наборе символов ошибся, однако у меня все равно компилятор ругается. Может в опциях что не так поставил?
*


А зачем в топике это набирать? cranky.gif Взял из редактора и скопировал. Что может быть проще и быстрее?

Вот полный код, который подается на вход компилятору:
Код
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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 21 2005, 07:00
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Я не копировал свою структуру, потому что чувствовал, что такие вопросы, типа Ваших выше, появятся.
Но пока отвечал на Ваши вопросы разобрался в чем дело - надо было в опциях проекта на вкладке 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;};
};


--------------------
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 21 2005, 10:30
Сообщение #9


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(prottoss @ Sep 21 2005, 13:00)
Я не копировал свою структуру, потому что чувствовал, что такие вопросы, типа Ваших выше, появятся.
Но пока отвечал на Ваши вопросы разобрался в чем дело - надо было в опциях проекта на вкладке General Options -> Library Configuration вместо CLIB подключить DLIB,  И на вкладке C/C++ Compiler -> Language выставить Embedded C++
*

Тип библиотеки для компиляции не важен - это скажется при линковке.

А если ++ не были включены, то ессно, никакой перегрузки быть не могло. Вам бы надо было просто привести тест сообщения об ошибке, быстрее бы разобрались - наверняка компилятор в нем "намекал" на несоответствие исходного текста используемому языку. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 21 2005, 10:48
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(dxp @ Sep 21 2005, 18:30)
Цитата(prottoss @ Sep 21 2005, 13:00)
Я не копировал свою структуру, потому что чувствовал, что такие вопросы, типа Ваших выше, появятся.
Но пока отвечал на Ваши вопросы разобрался в чем дело - надо было в опциях проекта на вкладке General Options -> Library Configuration вместо CLIB подключить DLIB,  И на вкладке C/C++ Compiler -> Language выставить Embedded C++
*

Тип библиотеки для компиляции не важен - это скажется при линковке.

А если ++ не были включены, то ессно, никакой перегрузки быть не могло. Вам бы надо было просто привести тест сообщения об ошибке, быстрее бы разобрались - наверняка компилятор в нем "намекал" на несоответствие исходного текста используемому языку. smile.gif
*



тип сообщения в вольном переводе был "надо поставить ; после operator". А с ходу не смог разобраться потому что всю ночь сидел за написанием текста для константных переменных в памяти программ, отладил, а потом еще надо было это переделать для использования во внешней SPI памяти. А кругом понатыкано ->. Но я все равно решил проблему в традициях С. Ну а после сна уже все проветрилось, чему работать надо, и я проблему решил через С++.
Однако после встречи с заказчиком настроение у меня опять изменилось. Те кто пишет остальные куски программы, пишут под голый С - и мои достижения с С++ оказались не нужны. Так что, то что я сделал ночью, осталось, а то, до чего я допер днем, то же осталось но только в моей голове.

Всем спасибо за помощь, и извеняйте за оффтоп


--------------------
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 21 2005, 12:19
Сообщение #11


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(prottoss @ Sep 21 2005, 16:48)
Однако после встречи с заказчиком настроение у меня опять изменилось. Те кто пишет остальные куски программы, пишут под голый С - и мои достижения с С++ оказались не нужны.
*

Зачем же не нужны? С++ прекрасно дружит с С. Во-первых, С++ компилятор за очень немногими исключениями вполне успешно компиляет С-текст. Во-вторых, если надо устроить взаимодействие между кусками, написанными на С и С++, то для этого есть спецификация extern "C". Все можно легко подружить.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 21 2005, 12:32
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(dxp @ Sep 21 2005, 20:19)
Зачем же не нужны? С++ прекрасно дружит с С. Во-первых, С++ компилятор за  очень немногими исключениями вполне успешно компиляет С-текст. Во-вторых, если надо устроить взаимодействие между кусками, написанными на С и С++, то для этого есть спецификация extern "C". Все можно легко подружить.


Я знаю про директивы компилятора, но заказчикам так легче жить.
К тому же основной проект компилится под С на IAR, а встроить, на сколько я знаю, можно кусок программы на C в проект, написанный на С++, но ни как не на оборот. Если только откомпилировать мой кусок в библиотеку, а заказчику предоставить совместимый с Си интерфейс. Но это лишние парки. Мне платят за исходники и хорошие комментарии к ним, чтобы люди могли разобраться в моей писанине и что-то изменить под свои нужды.


--------------------
Go to the top of the page
 
+Quote Post

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

 


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


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