Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как правильно вызывать конструктор в IAR C++
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Jurdens
Где располагать
Я делаю так

В файле MyClass.hpp описываю новый тип

В основной программе
#include MyClass.hpp // подкличаю описание
MyClass MyObj1; // сдесь как я понял вызывается конструктор
// до мейна правильно или нет?

main
{
MyObj1.Set(0x12);
.......

}
И есть еще файл MyClass.сpp
в котором описываю методы обьекта

Еще интересно что будет если компилятору
дать указание расположить объект во внешней памяти - ОЗУ?
Куда разместятся функции объекта(методы)?
или там только указатели?
Old1
Цитата(Jurdens @ Oct 5 2005, 08:33)
Где располагать
Я делаю так

В файле  MyClass.hpp описываю новый тип

В основной программе
#include MyClass.hpp  // подкличаю описание
MyClass  MyObj1;        // сдесь как я понял вызывается конструктор
                                // до мейна правильно или нет?

main
{
MyObj1.Set(0x12);       
.......

}
*

Конструктор вызывается одновременно с созданием объекта. А объект можно создать до main тогда он будет глобальный (т.е виден везде), или в main или в другой ф..ции, тогда он будет локальный, т. е виден в пределах ф-ции. Правильно и так и так. Все это ИМХО. Сам эти вопросы изучаю. Более опытные пусть поправят.
dxp
Цитата(Jurdens @ Oct 5 2005, 11:33)
Где располагать
Я делаю так

В файле  MyClass.hpp описываю новый тип

В основной программе
#include MyClass.hpp  // подкличаю описание
MyClass  MyObj1;        // сдесь как я понял вызывается конструктор
                                // до мейна правильно или нет?

main
{
MyObj1.Set(0x12);       
.......

}
И есть еще  файл MyClass.сpp
в котором описываю  методы обьекта

Да, все верно. В заголовочном файле - определение класса, чтобы его могли видеть все, кому надо. А в исходном (срр) - определения функций.


Цитата(Jurdens @ Oct 5 2005, 11:33)
Еще интересно что будет если компилятору
дать указание расположить объект во внешней памяти - ОЗУ?
Куда разместятся функции объекта(методы)?
или там только указатели?
*

Компилятор ничего не знает ни про внешнюю память, ни про внутреннюю. Для него просто есть память, есть адресное пространство. Если Вы разместите объект в адресах, которые соответствуют внешней ОЗУ, то объект там и будет размещен. И проинициализирован путе вызова конструктора.
G}{OST
Код правильный, можно еще передавать параметры конструктору при объявлении объекта.

Кстати, пробовал делать динамические объекты (через new) - куча (heap) забивается очень быстро. Поэтому желательно делать именно статические объекты, как у вас.

Програмный код (методы) в AVR всегда располагается в памяти программ (внутренняя flash), если только вы не используете JAVA laugh.gif
Nikola Kirov
class __near MyClass
{
public:
MyClass(char in1,char in2)
{
Var1 = in1;
Var2 = in2;
}
char Var1;
char Var2;
void Funct();
};


обект создаем
MyClass MyClas1(1,2);

__near указъивает разположит обект в near
Там в декларации можно указат куда будут разполагатся обектъи етого класа,если нужно поставит в еепром -> __eeprom

Если хочем поставит обект етого класа на заданнъи адресс
#pragma location=0x200
__no_init MyClass MyClas1(1,2);

если не обявит ето как __no_init компилятор сообщает
Error[Be012]: location address not allowed (object must have static storage duration and be const or __no_init)

А собствено если хочем что компилятор поставил обект в внешнеи памяти или в определеное адресное пространство нада сделат сегмент
-Z(DATA)MYSEGMENT=100-25F

и обявит обект так
#pragma location="MYSEGMENT"
__no_init MyClass MyClas1(1,2);

Кажется понятно обяснил с моим плохии рускии smile.gif
Jurdens
Спасибо Никола
понятно попробовал - вроде
получается.
Читал твое сообщение по поводу размещения
строковых констант в RAM - помогло а то приходилось мирится с большим расходом RAM
IgorKossak
По поводу конструкторов и внешней памяти следует добавить.
В IAR C++ инициализация памяти и создание глобальных объектов осуществляется внутренней функцией C_startup, которая работает ДО начала работы ЛЮБОГО пользовательского кода.
Это значит, что код конфигурирования внешней памяти (после ресета внешняя память не разрешена и не сконфигурирована) надо запустить в функции char __low_level_init() (см. образец в файле \avr\src\lib\low_level_init.c). Лучше сам этот файл включить в проект.
IgorKossak
Ещё одно добавление.
Для объектов, размещаемых в EEPROM, нельзя задавать никаких конструкторов.
Jurdens
Цитата(IgorKossak @ Oct 10 2005, 10:51)
По поводу конструкторов и внешней памяти следует добавить.
В IAR C++ инициализация памяти и создание глобальных объектов осуществляется внутренней функцией C_startup, которая работает ДО начала работы ЛЮБОГО пользовательского кода.
Это значит, что код конфигурирования внешней памяти (после ресета внешняя память не разрешена и не сконфигурирована) надо запустить в функции char __low_level_init() (см. образец в файле \avr\src\lib\low_level_init.c). Лучше сам этот файл включить в проект.
*


Посмотрел функцию low_level_init.c
в теле функции нужно раскоментировать
/* EXTERN __RSTACK_in_external_ram */
/* REQUIRE __RSTACK_in_external_ram */
?
AndyBig
Цитата
Програмный код (методы) в AVR всегда располагается в памяти программ (внутренняя flash), если только вы не используете JAVA

В С++ код классов всегда располагается в программной памяти и существует единожды для всех представителей каждого класса. То есть, сколько бы экземпляров класса MyClass вы не создавали, весь код этого класса останется в единственном екземпляре smile.gif. Память данных для каждого экземпляра класса резервируется только для ДАННЫХ этого класса - переменных, структур, массивов и т.д. И то, если только они не объявлены как static smile.gif
Make_Pic
Цитата(G}{OST @ Oct 5 2005, 10:43)
...
если только вы не используете JAVA laugh.gif
*

А вот здесь можно поподрбнее: Вы успели скачать исходники этой VM для AVR?

Если да - то намыльте мне их pls!
bаnt{собaка}pi точка ссl точка ru
AndyBig
К сожалению, ни я, ни G}{OST (как он мне сказал) не скачали это чуду smile.gif.
В исходном тексте странички есть такие строки:
Код
<font color=red>The download is currently disabled due to licensing issues. The
download will hopefully be available again soon. Stay tuned!</font>

<!--
<ul>
<li><a href="nanovm-20050926.tgz">nanovm-20050926.tgz</a>
<li><a href="nanovm-20050915.tgz">nanovm-20050915.tgz</a>
<li><a href="install_javacomm.sh">Linux javacomm installation script</a>
</ul>
-->

То есть закомментированные ссылки на прошивки, но эти ссылки не работают (кроме линухового скрипта), видимо автор прибил и сами файлы, а не только ссылки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.