Перейти к содержанию
    

Не компилируется &&= в C++

44 минуты назад, haker_fox сказал:

А как вы читаете код спустя время? Ведь нужно трассировать переменную глазками от места использования, чтобы понять, что она значит.

Не понял вопроса... :wacko2:  Глазками и читаю. Как ещё?

44 минуты назад, haker_fox сказал:

    m_uart[number].txSrc = static_cast<const std::uint8_t *>(_src);
    m_uart[number].txSize = _size;
    m_uart[number].regs->THR = *m_uart[number].txSrc++;

 

Здесь и везде где есть m_uart[number] у Вас будет существенный оверхед результирующего кода при малом уровне оптимизации (при отладке например).

Я в таких случаях обычно использую промежуточную переменную указатель на объект этого типа: тип_m_uart *ptr = &m_uart[number];

Да и "магическое" число 300 лучше проименовавть #define-ом или enum-ом. Тем более что оно у Вас встречается дважды и я полагаю - это одно и то же значение? Тогда - обязательно нужно проименовать единым enum-ом.

8 минут назад, ViKo сказал:

Глобальным - более длинные, в PascalStyle. Но они становятся похожими на имена фунций. Здесь еще в поиске. 

У меня функции в стиле НекотораяФункция(), а переменные - некотораяПеременная. За десятилетия уже привык.  :smile:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Сергей Борщ сказал:

Даже после просмотра кода не понял, что означает "rb" в названии функции.

RingBuffer. Реализация кольца. Приписки вначале делаю для того, чтобы понимать, откуда тянется глобальная функция (из какого файла, например).

 

56 минут назад, haker_fox сказал:

Вот мои примеры...

Выглядят красиво:smile:

 

P.S. А вообще не покидает меня ощущение, что каждый по-своему прав. Один видит так, другой так. Это как фантазировать о вкусах пива:spiteful:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, Forger сказал:

Похвастаю ))) Давно отказался от них, стало гораздо проще управлять проектом (в смысле объектами внутри него и их взаимодействием).

Ну да - и пожертвовали эффективностью кода, так как всюду приходится тратить лишние регистры на таскание кучи указателей.

 

6 минут назад, Arlleex сказал:

RingBuffer. Реализация кольца. Приписки вначале делаю для того, чтобы понимать, откуда тянется глобальная функция (из какого файла, например).:smile:

+++

Тоже использую такую практику. Весь код разбит на ряд служб (драйверов). Каждая служба имеет своё API. У каждой службы есть уникальный (в пределах проекта) префикс, с которого начинаются имена всех (или почти всех) функций/переменных/констант службы. Например: ConfigRead(), ConfigWrite(), ConfigInit(), ... которые в свою очередь могут вызывать: FlashRead(), FlashWrite(), FlashErase().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 minutes ago, jcxz said:

Ну да - и пожертвовали эффективностью кода, так как всюду приходится тратить лишние регистры на таскание кучи указателей.

Ничего подобного. Указателей практически нет, а если и есть, то лишь с крохотной областью видимости - внутри цикла или на край одного метода.

В чистом виде указатели для связывания не используются в силу их небезопасности.

Для связи используются делегаты. 

Конечно, в каком-то роде их можно назвать указателями, но то же самое можно сказать о виртуальных методах классов.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

38 минут назад, Forger сказал:

Ничего подобного. Указателей практически нет, а если и есть, то лишь с крохотной областью видимости - внутри цикла или на край одного метода.

И как же попадают указатели на данные внутрь ваших функций если нет глобальных объектов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, jcxz said:

И как же попадают указатели на данные внутрь ваших функций если нет глобальных объектов?

Есть один единственный глобальный объект, да и тот с припиской static и то внутри функции main.

int main()
 {
	static InternalControlPanel internalControlPanel;
	internalControlPanel.initialize();
	internalControlPanel.run();
}

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

Сами модули являются экземплярами этого класса (в соотв. разделе private).

Где-то тут я уже это озвучивал.

Схема построения простая, в очень многом позаимствована из того же Qt, в частности принцип signal/slot.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, Forger said:

Для связи используются делегаты.

Какие еще делегаты?
В C++ нет делегатов. 

6 hours ago, haker_fox said:

Но работает, уже хорошо)))))))))))))))))))))


Debug::Errno::Error Drv::Lpc4337Uart::write( const void * _src, std::uint32_t _size, std::uint32_t _tm_ms )  {
    FFWK_ASSERT(_src);
    FFWK_ASSERT(_size);
    auto number = static_cast<std::uint32_t>(getDescription().number);
    Os::Mutex::Service mt(m_uart[number].mutex);
    FFWK_ASSERT(mt.take(300));
    m_uart[number].txSrc = static_cast<const std::uint8_t *>(_src);
    m_uart[number].txSize = _size;
    m_uart[number].regs->THR = *m_uart[number].txSrc++;
    if (--m_uart[number].txSize) {
        enableInterrupt(IrqSource::Thre);
        return m_uart[number].rxSignal.wait(300);
    }
    return Debug::Errno::Error(Debug::Errno::Code::Ok);
}

 

Странные сорсы.
Похоже на CMSIS переложенный на C++. Не оно? 
Эти сорсы точно ваши?  
Ставить ассерты в драйвере эт чудно.
Еще более чудно ставить флаг ошибки там где надо ставить счетчик ошибок.  
Эт не боевой код. 

 

 
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 minutes ago, AlexandrY said:

Какие еще делегаты?

В строке поиска в гугле нужно написать 'c++ delagate".

Я нашел подходящий исходник, перепилил под себя. Для моей задачи более чем.

Оверхед ничтожный, профит колоссальный (на картинке показан вызов делегата на макс оптимизации):

 

Вызов делегата.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 minutes ago, Forger said:

В строке поиска в гугле нужно написать 'c++ delagate".

Возьмите лучше справочник по C++ и найдите там делегаты.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, jcxz said:

Не понял вопроса...

Я имел в виду, что безликие переменные, типа "a", "ptr" мало, что значат сами по себе. И если такая переменная встречается по тексту программы, то, на мой взгляд, не всегда очевидно, что она означает и почему вы делаете с ней такие действия. Поэтому я предпочитаю давать переменным и функциям "говорящие имена".

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, jcxz said:

Я в таких случаях обычно использую промежуточную переменную указатель на объект этого типа: тип_m_uart *ptr = &m_uart[number];

Согласен! Спасибо за замечание! Об особенностях с низким уровнем оптимизации я не подумал. Я бы сделал так с прелестями Си++

auto * const ptr = &m_uart[number];

Тут тоже малоговорящее имя, но область его использования крайне узкая.

8 hours ago, jcxz said:

Тогда - обязательно нужно проименовать единым enum-ом.

Тоже верно, и это мой недосмотр.

8 hours ago, jcxz said:

Тогда - обязательно нужно проименовать единым enum-ом.

Я предпочитаю

static const std::size_t TIMEOUT = 300;

Естественно в приватной секции класса. Но может быть у "энама" в данном случае есть преимущество?

8 hours ago, Arlleex said:

Выглядят красиво:smile:

Спасибо))) Это вариант ПО пока в стадии проработки, поэтому со временем кое что подсократится, уйдут "маджик намберы" и т.п.)))

8 hours ago, Arlleex said:

P.S. А вообще не покидает меня ощущение, что каждый по-своему прав.

Совершенно ага!:dance3: Но ещё есть корпоративный стиль, если работа происходит на фирме в коллективе. Так вот, мой пример, это не корпоративный стиль, а то, как я пишу софт для своих личных целей, ибо в корпоративном мне не всё нравится. Он у нас на гугловском стандарте основан.

8 hours ago, jcxz said:

Ну да - и пожертвовали эффективностью кода, так как всюду приходится тратить лишние регистры на таскание кучи указателей.

Вот, кстати, довольно актуальная тема в мире встраиваемых систем: компромисс между эффективностью машинного кода и красотой исходника. Мне этот компромисс до сих пор не удаётся как-то для себя решить. И хочется, чтобы исходник выглядел красиво, например, создаёшь несколько разных файлов, каждый для своих целей (драйвер двигателя, клавиатуры, дисплея). А потом смотришь в листинг, а там сплошные "call" на функции, с сохранением регистров в стеке, передаче параметров через стек. А если такие функции вызываются в прерывании ,то исходник выглядит идеологически правильно, а процу - лишняя работа(((((((((((((((((((((

4 hours ago, AlexandrY said:

Похоже на CMSIS переложенный на C++. Не оно? 

Ну CMSIS делает тоже самое. Поэтому код похож, ну это как "жигули" и "бентли". Фирмы разные, внешний вид, по сути, одинаковый.

4 hours ago, AlexandrY said:

Эти сорсы точно ваши?

А почему вы сомневаетесь? Да, исходники мои.

4 hours ago, AlexandrY said:

Ставить ассерты в драйвере эт чудно.

А что вы предлагаете в замен?:acute:Я считаю, что в случае ошибки, пусть сработает "ассёрт", выведен в консоль минимальную информацию, запишет её в журнал на флешке, затем "завести" процессор, и тот перезагрузится от сторожевого таймера.

4 hours ago, AlexandrY said:

Еще более чудно ставить флаг ошибки там где надо ставить счетчик ошибок. 

Можно чуть подробнее, чем счётчик ошибок лучше?

4 hours ago, AlexandrY said:

Эт не боевой код. 

Тоже хотелось бы подробностей. Какие критерии у боевого кода?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, AlexandrY said:

Возьмите лучше справочник по C++ и найдите там делегаты.

Их там нет, это и без справочника всем и так известно. Но есть готовые решения, которые почти полностью их реализуют. В справочниках их тоже нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, Forger said:

Их там нет, это и без справочника всем и так известно. Но есть готовые решения, которые почти полностью их реализуют. В справочниках их тоже нет.

Не, "готовые решения" и их названия оставьте себе. 
А в C++  делегатов нет и отсылки к неким делегатам просто от незнания С++ и его терминологии.
Эт все случается когда C++ изучают по гугле, а не по учебникам.  
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, AlexandrY said:

А в C++  делегатов нет и отсылки к неким делегатам просто от незнания С++ и его терминологии.

Гм, но, простите, и так же всё понятно. Язык лишь предоставляет нам инструмент описания алгоритма. Ясно, что в самом языке и библиотек нет, ибо они лежат "боком" и написаны на самом же языке. Но мн е кажется, что уважаемый @Forger показывает очень удобный способ связки разных классов. Я немного программировал для Qt, мне их сигналы и слоты весьма понравились.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, haker_fox said:

Тоже хотелось бы подробностей. Какие критерии у боевого кода?

Нормальный ленивый разработчик не будет добровольно писать ассерты. 
Эт либо в корпоративной культуре, где следят за каждой строчкой, и кодеры - подневольные люди  или во фреймворках на экспорт. 
Ассерты в драйвере если в нем есть ошибка сами положат систему либо никогда не будут использованы. Но всегда вносят задержку.


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...