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

 
 
 
Reply to this topicStart new topic
> Не работает полиморфизм для глобальных объектов
yanvasiij
сообщение Dec 25 2015, 06:33
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Доброго времени суток! Компилятор 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 такая штука работает без проблем и так и так.
Go to the top of the page
 
+Quote Post
Aaron
сообщение Dec 25 2015, 07:10
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



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

Ну и в линкер-скрипте проверить, ссылки на начало/конец секции так же называются?
Прикрепленные файлы
Прикрепленный файл  startup.zip ( 2.06 килобайт ) Кол-во скачиваний: 5
 
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Dec 25 2015, 07:47
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



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


Сами объекты работают. Если вызывать метод глобального объекта, то он отработается нормально. Но то, о чем вы говорите очень похоже на правду. Я сделал, как описано вот тут и все заработало. А там описано, если я правильно понимаю, то чем Вы говорите.
Go to the top of the page
 
+Quote Post

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

 


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


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