|
Проблема с константами в классе., В iar всё работает а в GCC нет... |
|
|
|
May 19 2010, 11:57
|
Частый гость
 
Группа: Свой
Сообщений: 161
Регистрация: 26-08-05
Из: Российская Империя
Пользователь №: 7 984

|
Есть некий базовый класс:
class uart { protected: const uint8_t num; const uint8_t channel; volatile uint32_t time; uint8_t rxCount; uint8_t echoMode; __uartState state; uint32_t tx_pointer; uint32_t rx_pointer; uint32_t size; uint32_t txSize; uint8_t rxEchoSize; uint8_t error[2]; uint16_t crc; public: uart(const uint8_t n, const uint8_t c) : num(n), channel( c) { // Конструктор time = tx_pointer = rx_pointer = size = 0; error[0] = error[1] = 0; }; ...
есть от него наследник:
class mco_uart : public uart { public: uint8_t buf[2][MCO_BUFF_SIZE]; mco_uart(const uint8_t n, const uint8_t c) : uart (n, c) {}; // Конструктор ...
создаю экземпляры класса:
mco_uart extUart[EXTUART_NUM] = { mco_uart(0, 4 << 4), mco_uart(0, 5 << 4), mco_uart(0, 6 << 4), mco_uart(0, 7 << 4), mco_uart(1, 4 << 4), mco_uart(1, 5 << 4), mco_uart(1, 6 << 4), mco_uart(0, 1 << 4), mco_uart(0, 2 << 4), mco_uart(0, 3 << 4), mco_uart(1, 0 << 4), mco_uart(1, 1 << 4), mco_uart(1, 2 << 4), mco_uart(1, 3 << 4) };
В результате переменные num и channel равны 0. В иаре всё работает то есть значения переменным присваивается правильно, а в gcc присваивания нет. Что я делаю не так? На плюсах пишу первый раз, до этого писал только на чистом C. Хочется перейти на gcc и не получается! Компилятор от клёна kgp_arm_eabi_20100509
|
|
|
|
|
 |
Ответов
|
May 19 2010, 18:31
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(inco @ May 19 2010, 22:13)  Стартап брал стандартный из библиотеки stm32 версии 3.2 Этот стартап совершенно точно не вызывает конструкторы глобальных объектов. Пример рабочего стартапа и линкерного скрипта для C++ можете посмотреть вот в этом примере из scmRTOS. Проверено с kgp и codesourcery.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 20 2010, 06:15
|
Частый гость
 
Группа: Свой
Сообщений: 161
Регистрация: 26-08-05
Из: Российская Империя
Пользователь №: 7 984

|
Спасибо за помощь!!! Всё получилось! Собрал гибрида стартапа из scmRtos и других примеров под себя и переделал скрипт линкера. Теперь вроде всё на месте, конструкторы работают. Вот только не понятно, как это всё работает, где бы про это почитать? Интересует как происходит процесс инициализации конструкторов в деталях. Если со стартом сишной программы всё понятно, то с плюсами получается пробел в понимании. Вообще где почитать чем отличается инициализация сишной программы от плюсовой? Не люблю чего-то не понимать. И ещё попутно вопрос по этой строке: uart(const uint8_t n, const uint8_t c) : num(n), channel( c) { // Конструктор параметры после двоеточия num(n), channel( c) не понимаю. То есть, что происходит смысл понятен, присваивается значение константам, но вот как до этого додуматься не понятно! Я просто нашел этот способ инициализации констант в инете, а где про это почитать не нашел. Вроде по плюсам там должен быть предок а не переменные?! Если вопросы глупые прошу сильно не пинать, на плюсах первый раз решил написать прогу. До этого всё больше на чистом си. А теперь понравилось! Оказывается такая вещь...
|
|
|
|
|
May 20 2010, 10:44
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(inco @ May 20 2010, 12:15)  Всё получилось! Аминь  Цитата Интересует как происходит процесс инициализации конструкторов в деталях. При помощи вызова оных  Аналогия с си - прямая. Если в си есть статическая переменная, то она инициализируется в стартапе. Если в C++ есть глобальный объект, то он точно так же инициализируется в стартапе. За инициализацию отвечает конструктор. Поэтому он вызывается из стартапа. Цитата Вообще где почитать Читать естественно "Язык программирования С++", Бьерн Страуструп. Третье издание.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 20 2010, 19:43
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(AHTOXA @ May 20 2010, 13:44)  При помощи вызова оных  Аналогия с си - прямая. Если в си есть статическая переменная, то она инициализируется в стартапе. Если в C++ есть глобальный объект, то он точно так же инициализируется в стартапе. За инициализацию отвечает конструктор. Поэтому он вызывается из стартапа. Более "на пальцах": Указатели на конструкторы помещаются в секцию .ctors, а код в стартапе проходит эту секцию, вызывая функции по считанному указателю. Если указатель равен нулю - баста. "Ловкость рук и никакого мошенничества". Можно в скрипте линкера отсортировать эти указатели по именам объектов или именам файлов, обеспечив некоторый определенный порядок вызова конструкторов, но Страуструп такого не обещал.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
inco Проблема с константами в классе. May 19 2010, 11:57 klen Цитата(inco @ May 19 2010, 15:57) В резул... May 19 2010, 14:36 AHTOXA Цитата(klen @ May 19 2010, 20:36) Код/* .... May 19 2010, 15:31     inco Спасибо просветили! Скачал третье издание Стра... May 20 2010, 20:10      Сергей Борщ Цитата(inco @ May 20 2010, 23:10) Линкер ... May 20 2010, 20:49      inco Спасибо ещё раз!!!
Дали направлен... May 21 2010, 06:02       AHTOXA Цитата(inco @ May 21 2010, 12:02) Вот вык... May 21 2010, 06:38        inco Цитата(AHTOXA @ May 21 2010, 09:38) Код .... May 21 2010, 07:48
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|