Программируем робота

Постаревшие школьники, которые программировали черепашку на уроках информатики, оценят по достоинству. :)

Light bot

Как распознать неадекватного водителя

По моим наблюдениям, водители Санкт-Петербурга делятся на опытных, неопытных и неадекватных. Сейчас я поделюсь своим скромным опытом в распознавании неадекватного водителя. Будем учиться определять такое существо по его машине и поведению на дороге.

Любимое авто и личный водитель

  • ЕЗДИТ НА ТЮНИНГОВАННОМ АВТОМОБИЛЕ. Существует особых вид тюнинга автомобиля — так называемый ара-тюнинг. Как бы и не тюнинг вовсе, а какая-то хрень. Как это выглядит каждый мог лицезреть по телевизору. Адекватность водителя машины с выхлопной трубой диаметром в 10 сантиметров и скамейкой на крыше в объяснении не нуждается
  • СЛУШАЕТ ГРОМКУЮ МУЗЫКУ. Такую, что стекла дребезжат. Особенно с открытыми окнами
  • РАССЕКАЕТ БЕЗ НОМЕРНЫХ ЗНАКОВ (даже транзитных). Тут два варианта: или человеку все пофигу и он спокойно свалит с места ДТП, или он только что купил машину
  • ГОВОРИТ ПО МОБИЛКЕ. Особо клинический случай представляет собой расслабленного идиота водителя с трубкой, зажатой между ухом и плечом, при это весь мир предстает перед ним наклоненным на 30-45 градусов
  • ПЕРЕСТРАИВАЕТСЯ ИЗ РЯДА В РЯД КАЖДЫЕ 100 МЕТРОВ. Это означает, что водитель или торопится на кладбище, или дурак. А может дурак куда-то торопится
  • НЕ ВКЛЮЧАЕТ ПОВОРОТНИКИ. Создается впечатление, что некоторым дорогим иномаркам поворотники ампутируют еще в автосалоне. В голове рисуется картина, как будущий владелец автомобиля умоляет менеджера салона не отрезать нужные на дороге поворотники, но тот остается глухим к слезам водителя
  • Адский водитель

  • НЕОПЫТНЫЙ ВОДИТЕЛЬ БЕЗ СПЕЦИАЛЬНОГО ЗНАКА. Этот персонаж особенно интересен и распознать его довольно сложно. Помните, как только вы вешаете знак «Неопытный водитель», ваши дебильные выходки за рулем, которые вызывают злобу и ненависть окружающих, автоматически превращаются в робкие попытки юного водителя справится с автомобилем, которые в свою очередь могут вызвать только умиление и улыбку. :) Удивительно, не правда ли?

P.S. Вышенаписанное является черновиком. Я буду дополнять эту заметку по мере поступления новых данных. :)

CMake + precompiled headers + MSVC. Окончательный вариант

Как неожиданно выяснилось, предыдущие варианты (раз, два, три) оказались неправильными. Публикую окончательный правильный вариант использование precompiled headers при компиляции nmake или в Visual Studio 2008:

CMakeLists.txt

macro( use_precompiled_header SRC_LIST_VAR HDR_FILE SRC_FILE )
 
    get_filename_component( PCH_HEADER ${HDR_FILE} NAME )
    get_filename_component( PCH_BINARY ${HDR_FILE} NAME_WE )
 
    set( PCH_BINARY "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${PCH_BINARY}.pch" )
 
    if (MSVC)
        set( SRC_LIST ${${SRC_LIST_VAR}} )
 
        set_source_files_properties( ${SRC_LIST} PROPERTIES
            COMPILE_FLAGS "/Yu${PCH_HEADER} /Fp${PCH_BINARY}"
            OBJECT_DEPENDS "${PCH_BINARY}" )
 
        set_source_files_properties( ${SRC_FILE} PROPERTIES
            COMPILE_FLAGS "/Yc${PCH_HEADER} /Fp${PCH_BINARY}"
            OBJECT_OUTPUTS "${PCH_BINARY}"
            OBJECT_DEPENDS "" )
    endif(MSVC)
endmacro( use_precompiled_header )

Особенное внимание обратите на использование:

file( GLOB_RECURSE CORE_SRC *.cpp )
use_precompiled_header( CORE_SRC precompiled.h precompiled.cpp )

CORE_SRC — это НАЗВАНИЕ переменной, а не сама переменная.

P.S. С версии CMake 3.16.0 доступна команда target_precompiled_headers(), которая позволяет без лишних усилий работать с precompiled headers.

Используем OgreBullet в своем проекте с помощью CMake

В нашей системе сборки все сторонние библиотеки компилируются вместе с проектом, поэтому стандартное FIND_PACKAGE нам не подходит. Значит, CMakeLists.txt из сборки OgreBullet тоже идет лесом. Поэтому приходится извращаться на свой лад.

CMakeLists.txt

# Название проекта
project( OgreBullet )
 
# Разделяем исходники для двух precompiled headers
file( GLOB_RECURSE OGRE_BULLET_COLLISIONS Collisions/*.cpp )
file( GLOB_RECURSE OGRE_BULLET_DYNAMICS Dynamics/*.cpp )
 
# Папки для поиска #include
include_directories(
    ${GLOBAL_INCLUDE_DIR}/Ogre
    ${GLOBAL_INCLUDE_DIR}/OgreBullet/Collisions
    ${GLOBAL_INCLUDE_DIR}/OgreBullet/Dynamics
    ${GLOBAL_LIB_DIR}/Bullet
    ${GLOBAL_LIB_DIR}/Bullet/BulletConvexDecomposition
    ${GLOBAL_LIB_DIR}/Bullet )
 
# Определяем макрос для использования precompiled headers
macro(use_precompiled_header SRC_LIST HDR_FILE SRC_FILE)
    # Выделяем имя заголовка без пути
    get_filename_component(PCH_HEADER ${HDR_FILE} NAME)
    # Выделям имя заголовка без расширения и пути
    get_filename_component(PCH_BINARY ${HDR_FILE} NAME_WE)
    # Полный путь к созданному pch
    set(PCH_BINARY "${CMAKE_CURRENT_BINARY_DIR}/${PCH_BINARY}.pch")
 
    if (MSVC)
        # Для precompiled.cpp создаем pch, указывая файл (OBJECT_OUTPUTS), который создается в результате комманды 
        set_source_files_properties( ${SRC_FILE} PROPERTIES
            COMPILE_FLAGS "/Yc${PCH_HEADER} /Fp${PCH_BINARY}"
            OBJECT_OUTPUTS "${PCH_BINARY}" )
        # Для каждого исходника в списке, задаем зависимость от precompiled.pch и указываем использовать его параметром "/Yu"
        foreach( SOURCE ${SRC_LIST} )
            set_source_files_properties( ${SOURCE} PROPERTIES 
                COMPILE_FLAGS "/Yu${PCH_HEADER}" 
                OBJECT_DEPENDS "${PCH_BINARY}" )
        endforeach( SOURCE ${SRC_LIST} )
 
    endif(MSVC)
 
endmacro(use_precompiled_header)
 
# Создаем precompiled header для Collisions
use_precompiled_header( OGRE_BULLET_COLLISIONS
    "${GLOBAL_INCLUDE_DIR}/OgreBullet/Collisions/OgreBulletCollisions.h" Collisions/OgreBulletCollisionsPrecompiled.cpp )
 
# Создаем precompiled header для Dynamics
use_precompiled_header( OGRE_BULLET_DYNAMICS
    "${GLOBAL_INCLUDE_DIR}/OgreBullet/Dynamics/OgreBulletDynamics.h" Dynamics/OgreBulletDynamicsPrecompiled.cpp )
 
# Объединим два списка файлов для удобства
set( OGRE_BULLET_SRC
    "${OGRE_BULLET_COLLISIONS}"
    "${OGRE_BULLET_DYNAMICS}" )
 
# Добавляем define для использования precompiled headers библиотекой OgreBullet
add_definitions( -D_PRECOMP )
# Profit!
add_library( ogre_bullet STATIC ${OGRE_BULLET_SRC} )

UPDATE: Окончательный вариант precompiled headers смотрим здесь.

Блог Евгения Жирнова