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

 
 
13 страниц V  « < 5 6 7 8 9 > »   
Reply to this topicStart new topic
> Как писать на С++ при создание приложений под ARM, Примеры
Forger
сообщение Dec 10 2011, 07:09
Сообщение #91


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

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



Цитата(brag @ Dec 10 2011, 06:55) *
Как можно реализовать такую вещ без кривоты, rtti, библиотек:

Для полноты картины, расскажите, для чего вам нужна такая конструкция?
Что это на самом деле?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
neiver
сообщение Dec 10 2011, 07:29
Сообщение #92


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Массив указателей на объекты базового класса - это как раз правильное решение.
А когда вы пытаетесь индексировать массив объектов производного класса
Derived aaa[]={Derived(0),Derived(0),Derived(0)};
как массив объектов базового класса, то происходит "срезка". Объекты базового и производного класса имеют разные размеры.

Цитата
Derived *aaa[]={&Derived(0),&Derived(0),&Derived(0)};
а на такое компиллер матерится, типа юзание временного обьекта

И правильно матерится. На стеке создаются три временных объекта, указатели на них заносятся в массив, после чего эти объекты уничтожаются и их место в стеке освобождается. В результате указатели в массиве указывают куда-то, где раньше был стек и ваши объекты. Сейчас там корректные данные, потом будет мусор.
Правильно создать массив объектов производного типа и массив указателей базового типа...
Go to the top of the page
 
+Quote Post
brag
сообщение Dec 10 2011, 15:37
Сообщение #93


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Цитата
Для полноты картины, расскажите, для чего вам нужна такая конструкция?
Что это на самом деле?


Это для построения gui. вот пример использования:
Код
....

static MenuItem* const settingsItemsList[]={
    &settingsItems[0],&settingsItems[1],
    &settingsItems[2],&settingsItems[3],
    &settingsItems[4],&settingsItems[5],
    &settingsItems[6],&settingsItems[7]
};
static Menu settingsMenu(Rect(0,8,96,56),0,settingsItemsList,sizeof(settingsItemsList)/sizeof(MenuItem*));

static MenuItem mainItems[]={
    MenuItem(0,"Normal",&normalMenu),
    MenuItem(0,"Professional",&proMenu),
    MenuItem(0,"Settings",&settingsMenu),
};
static MenuItem* const mainItemsList[]={ &mainItems[0],&mainItems[1],&mainItems[2] };
static Menu mainMenu(Rect(0,8,96,56),0,mainItemsList,sizeof(mainItemsList)/sizeof(MenuItem*));


Сам конструкторы выглядят так:
Код
class Menu: public Widget{
public:
    Menu(const Rect &geom,Widget *parent=0,MenuItem* const *children=0,int nchild=0);
...

Код
class MenuItem: public Widget{
public:
    MenuItem(Menu *parent=0,const char *text=0,Menu *target=0);
...

Код
class Widget : public PaintDevice{
public:
    Widget(Widget *parent=0,Widget* const *children=0,int nchild=0);
....


Цитата
Массив указателей на объекты базового класса - это как раз правильное решение.

правильное, только вот ни препроцессор, ни самя язык похоже не позволяет его создать "автоматом", в отличия, скажем, массива указателей на строки:
const char* const stringptrs[]={"kolbasa1","kolbasa2","kolbasa3"};
вот такое хотелось бы иметь и для обьектов...

Цитата
Правильно создать массив объектов производного типа и массив указателей базового типа...

массив указателей должен тоже быть производного типа, тк он передается производному классу сначала:
Menu(const Rect &geom,Widget *parent=0,MenuItem* const *children=0,int nchild=0);
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 10 2011, 17:39
Сообщение #94


Adept
******

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



Цитата(brag @ Dec 10 2011, 22:37) *
массив указателей должен тоже быть производного типа, тк он передается производному классу сначала:
Menu(const Rect &geom,Widget *parent=0,MenuItem* const *children=0,int nchild=0);

Если я правильно понял, что требуется работа с коллекцией объектов, то я для таких целей юзаю stl::list<Widget*>. Да, там будет аллокация памяти, но размер ноды небольшой (три указателя) и траблов с фрагментацией в этом случае, вроде, не ожидается.


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


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Цитата
Если я правильно понял, что требуется работа с коллекцией объектов, то я для таких целей юзаю stl::list<Widget*>. Да, там будет аллокация памяти, но размер ноды небольшой (три указателя) и траблов с фрагментацией в этом случае, вроде, не ожидается.

stl не канает, из доступных вещей есть только проц, голый компилятор и моск.
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 10 2011, 21:44
Сообщение #96


Adept
******

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



Цитата(brag @ Dec 11 2011, 01:11) *
stl не канает, из доступных вещей есть только проц, голый компилятор и моск.

О как! А куда ж стандартная библиотека-то делась? Компилятор один, что-ли, присутствует? sm.gif К тому же, stl - открытая вещь, можно взять и отдельно. Правда, может потребоваться доводка напильником. А может и не потребоваться.


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


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



да просто проект такой, что проще свое написать, чем прикручивать что-то туда и потом парицца с синхронизацией, гонками итп...
Go to the top of the page
 
+Quote Post
kan35
сообщение Dec 11 2011, 09:52
Сообщение #98


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Писать на С++ под ARM точно так же как на любую другую архитектуру. О чем тут вообще можно рассусолить на 7 страниц?
Go to the top of the page
 
+Quote Post
alx2
сообщение Dec 11 2011, 10:37
Сообщение #99


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(brag @ Dec 10 2011, 07:55) *
Как можно реализовать такую вещ без кривоты, rtti, библиотек:

Наверное как-то так:
CODE
template <typename T>
class Base{
public:
Base() : _a(NULL) {}
Base(T *array) : _a(array) {}
T *getItem(int n) const { return &_a[n]; }
private:
T * _a;
};

class Derived: public Base<Derived>{
public:
Derived() {}
Derived(Derived *array) : Base<Derived>(array){}
private:
int other;
};

int main()
{
Derived array[3];
Derived d(array);
return printf("%p = %p\n", d.getItem(1), &array[1]);
}

Хотя лучше, как Вам уже посоветовали, использовать stl.
Цитата(brag @ Dec 11 2011, 03:59) *
да просто проект такой, что проще свое написать, чем прикручивать что-то туда и потом парицца с синхронизацией, гонками итп...

Если вы способны писать код классом выше чем годами и тысячами людей проверенные реализации stl, почему Вы задаете такие вопросы? sm.gif
Если Вы используете многопоточность, неиспользование stl не гарантирует отсутствие в вашем коде гонок и не избавляет от необходимости "парицца с синхронизацией". Также как использование stl не способствует появлению гонок.
Синхронизация потоков в обоих случаях остается вашей заботой.

Сообщение отредактировал alx2 - Dec 11 2011, 11:19


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
brag
сообщение Dec 11 2011, 13:32
Сообщение #100


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Спасибо.
но это тоже не то, массив указателей все же должен быть, тк там могут быть наследники разных типов разного уровня и все они должны корректно обрабатываться базовым классом...

Цитата
Если вы способны писать код классом выше чем годами и тысячами людей проверенные реализации stl, почему Вы задаете такие вопросы?

Никто этого не говорил, просто так проще, во первых. в системе совсем иные механизмы распределения памяти(скажем, аналога malloc нету) и других ресурсов, что несовместимо с stl, по крайней мере с ее частями....
на основе динамики (stl::list<Widget*>) не идет.
И на основе статики тоже - памяти мало, надо экономить. Константый массив указателей в flash - самое оно, создавать бы его еще красиво...
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Dec 12 2011, 05:19
Сообщение #101


Знающий
****

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



Не совсем понял, что нужно в итоге получить, но возможно такая конструкция поможет Base *array[] = {new Derived(0), new Derived(0), new Derived(0)};
Если у вас и new нет реализации, то совсем всё плохо. sm.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 12 2011, 07:47
Сообщение #102


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Ему нужно статически всё слинковать и разместить во flash, если я правильно понял.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Dec 12 2011, 08:43
Сообщение #103


Знающий
****

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



Ага, проблема видимо в том, что getItem возвращает Base *. Может тогда просто приводить возвращаемое значение к нужному типу? Вот так: (Derived *)d.getItem(1).
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Dec 12 2011, 10:13
Сообщение #104


Знающий
****

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



Не, не получается нифига. Думаю, что стоит getItem вытащить из базового класса - пускай он объект класса принимает на вход.
Go to the top of the page
 
+Quote Post
brag
сообщение Dec 12 2011, 10:21
Сообщение #105


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Цитата
Если у вас и new нет реализации, то совсем всё плохо.

new нету, дорого
Цитата
Не, не получается нифига. Думаю, что стоит getItem вытащить из базового класса - пускай он объект класса принимает на вход.

не пойдет, по сколоьку нaдo иметь такую возможность:
Код
Derived1 derived1;
Derived2 derived2;
Base * const *arraay[]={&derived1,&derived2};
Derived3 d3(array);
Go to the top of the page
 
+Quote Post

13 страниц V  « < 5 6 7 8 9 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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