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

 
 
 
Reply to this topicStart new topic
> как правильно вызывать конструктор в IAR C++
Jurdens
сообщение Oct 5 2005, 05:33
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 9-07-05
Пользователь №: 6 656



Где располагать
Я делаю так

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

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

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

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

Еще интересно что будет если компилятору
дать указание расположить объект во внешней памяти - ОЗУ?
Куда разместятся функции объекта(методы)?
или там только указатели?
Go to the top of the page
 
+Quote Post
Old1
сообщение Oct 5 2005, 06:44
Сообщение #2


Знающий
****

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



Цитата(Jurdens @ Oct 5 2005, 08:33)
Где располагать
Я делаю так

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

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

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

}
*

Конструктор вызывается одновременно с созданием объекта. А объект можно создать до main тогда он будет глобальный (т.е виден везде), или в main или в другой ф..ции, тогда он будет локальный, т. е виден в пределах ф-ции. Правильно и так и так. Все это ИМХО. Сам эти вопросы изучаю. Более опытные пусть поправят.
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 5 2005, 07:36
Сообщение #3


Adept
******

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



Цитата(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)
Еще интересно что будет если компилятору
дать указание расположить объект во внешней памяти - ОЗУ?
Куда разместятся функции объекта(методы)?
или там только указатели?
*

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
G}{OST
сообщение Oct 5 2005, 07:43
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 48
Регистрация: 6-05-05
Пользователь №: 4 784



Код правильный, можно еще передавать параметры конструктору при объявлении объекта.

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

Програмный код (методы) в AVR всегда располагается в памяти программ (внутренняя flash), если только вы не используете JAVA laugh.gif


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
Nikola Kirov
сообщение Oct 5 2005, 11:20
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 4-11-04
Из: Болгария
Пользователь №: 1 050



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
Go to the top of the page
 
+Quote Post
Jurdens
сообщение Oct 5 2005, 12:45
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 9-07-05
Пользователь №: 6 656



Спасибо Никола
понятно попробовал - вроде
получается.
Читал твое сообщение по поводу размещения
строковых констант в RAM - помогло а то приходилось мирится с большим расходом RAM
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Oct 10 2005, 07:51
Сообщение #7


Шаман
******

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



По поводу конструкторов и внешней памяти следует добавить.
В IAR C++ инициализация памяти и создание глобальных объектов осуществляется внутренней функцией C_startup, которая работает ДО начала работы ЛЮБОГО пользовательского кода.
Это значит, что код конфигурирования внешней памяти (после ресета внешняя память не разрешена и не сконфигурирована) надо запустить в функции char __low_level_init() (см. образец в файле \avr\src\lib\low_level_init.c). Лучше сам этот файл включить в проект.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Oct 10 2005, 07:55
Сообщение #8


Шаман
******

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



Ещё одно добавление.
Для объектов, размещаемых в EEPROM, нельзя задавать никаких конструкторов.
Go to the top of the page
 
+Quote Post
Jurdens
сообщение Oct 19 2005, 07:19
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 9-07-05
Пользователь №: 6 656



Цитата(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 */
?
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Oct 19 2005, 11:42
Сообщение #10


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Цитата
Програмный код (методы) в AVR всегда располагается в памяти программ (внутренняя flash), если только вы не используете JAVA

В С++ код классов всегда располагается в программной памяти и существует единожды для всех представителей каждого класса. То есть, сколько бы экземпляров класса MyClass вы не создавали, весь код этого класса останется в единственном екземпляре smile.gif. Память данных для каждого экземпляра класса резервируется только для ДАННЫХ этого класса - переменных, структур, массивов и т.д. И то, если только они не объявлены как static smile.gif
Go to the top of the page
 
+Quote Post
Make_Pic
сообщение Oct 20 2005, 06:44
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 779
Регистрация: 9-10-04
Из: Россия, Пермь
Пользователь №: 828



Цитата(G}{OST @ Oct 5 2005, 10:43)
...
если только вы не используете JAVA laugh.gif
*

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

Если да - то намыльте мне их pls!
bаnt{собaка}pi точка ссl точка ru
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Oct 21 2005, 10:22
Сообщение #12


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



К сожалению, ни я, ни 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>
-->

То есть закомментированные ссылки на прошивки, но эти ссылки не работают (кроме линухового скрипта), видимо автор прибил и сами файлы, а не только ссылки.
Go to the top of the page
 
+Quote Post

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

 


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


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