Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не работает полиморфизм для глобальных объектов
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
yanvasiij
Доброго времени суток! Компилятор arm-none-eabi-gcc, процессор stm32f407. Объявил два класса, один базовый, другой наследник:

Код
class SomeBase
{
    public:
    virtual void foo (void) = 0;
}

class SomeDelivered : public SomeBase
{
    public:
    void foo (void)
    {
        printf("hello!\r\n");
    }
}


Далее внутри main'a делаю следующее:

Код
SomeDelivered a; /**<<<< Объект объявлен ГЛОБАЛЬНО */


int main (void)
{
    ...
    SomeBase *p;
    p = &a;
    p->foo();
    ...
}


Программа выпадает в HardFault сразу после вызова p->foo().

А если я делаю так:

Код
int main (void)
{
    ...
    SomeDelivered a; /**<<<< Объект объявлен ЛОКАЛЬНО */
    SomeBase *p;
    p = &a;
    p->foo();
    ...
}


то все работает
.

В чем дело, помогите пожалуйста?! В keil такая штука работает без проблем и так и так.
Aaron
А если просто сделать глобальный объект SomeDelivered - он будет работать? До этого в GCC с C++ и классами работали в глобальном пространстве?
За глобальные объекты и их конструкторы отвечает секция кода инициализации, где должны вызываться конструкторы. Если вы заимствовали стартап-файл из Сишного проекта, то там этого участка просто может не быть.
Посмотрите в приложенном стартап файле:
Код
    // Call constructors
    unsigned long *ctors;
    for(ctors = &__ctors_start__; ctors < &__ctors_end__; )
        ((void(*)(void))(*ctors++))();

Ну и в линкер-скрипте проверить, ссылки на начало/конец секции так же называются?
yanvasiij
Цитата(Aaron @ Dec 25 2015, 12:10) *
А если просто сделать глобальный объект SomeDelivered - он будет работать? До этого в GCC с C++ и классами работали в глобальном пространстве?
За глобальные объекты и их конструкторы отвечает секция кода инициализации, где должны вызываться конструкторы. Если вы заимствовали стартап-файл из Сишного проекта, то там этого участка просто может не быть.
Посмотрите в приложенном стартап файле:


Сами объекты работают. Если вызывать метод глобального объекта, то он отработается нормально. Но то, о чем вы говорите очень похоже на правду. Я сделал, как описано вот тут и все заработало. А там описано, если я правильно понимаю, то чем Вы говорите.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.