Staska писал(а):Можете подсказать хорошую книжку про Си ?
Самые начальные буквари советовать не буду, их навалом и практически все равноценны, поскольку толкут одну и ту же воду в одинаковых ступах; если программировали на куда более развитом C#, то разобраться с C легко сможете по любому попавшемуся под руку справочнику.
Что касается стиля программирования на С, рекомендую полистать
Schreiner A. Object-oriented programming with ANSI C. Подход IMHO не идеальный, но некоторые идеи заслуживают рассмотрения.
Применение TDD на C обстоятельно рассмотрено в
James W. Grenning. Test Driven Development for Embedded C. Есть также забавная, но очень толковая брошюрка
Mark VanderVoord. Embedded Testing with Unity and CMock. Марк с коллегами из
Atomic Objects опубликовали также ряд хороших статей по использованию паттерна MCH (Model-Conductor-Hardware) в программах для МК на языке C.
Примеры неплохого встроенного кода можете посмотреть в
Jean J. Labrosse. Embedded Systems Building Blocks. Правда, насколько я помню, Лабросс пишет для интеловского микропроцессора (кажется, i80186 или что-то наподобие), но на то он и C, чтобы не заморачиваться на подобные мелочи.
Если хотите построить свою систему на основе модели конечного автомата, может пригодиться отличная книга
Miro Samek. Practical Statecharts in C/C++: Quantum Programming for Embedded Systems, а также прилагаемый к ней бесплатный фреймворк разработки автора.
Ну и, конечно же, незаменимая "книжка" по C - стандарт языка.

Например, ISO/IEC 9899.
Staska писал(а):Я как бывший С# программист привык к удобным конструкциям из С#.
Отличная основа. Наверняка как минимум знакомы с основными паттернами проектирования и имеете практику объектно-ориентированного анализа. А реализовать хороший проект сможете без труда и на обычном C.
Staska писал(а):Собственно (*void) наследование - по другуму не знаю как делать макрос такого вида. Указатель конечно на тот же тип как и само мену.
Классический вариант - элемент структуры ссылается на саму структуру:
Код: Выделить всё
struct TreeNode
{
DataItem dataItem;
TreeNode *left;
TreeNode *right;
};
TreeNode * вместо аморфного
void * позволяет использовать все преимущества сильной типизации.
Staska писал(а):Что имеете под видом клиента ?
Клиент некоторого модуля - это любой код, использующий ресурсы этого модуля. В нашем случае - код, работающий с меню (например, отображающий его визуальное представление).
Staska писал(а):Наружу имеют доступ только событию меню (минус, плюс, ввод, меню.)
А как быть с объявлениями
extern? Они ведь имеют внешнюю компоновку и, следовательно, нарушают инкапсуляцию.
Staska писал(а):Запасной вариант - сделать программу для генераций menu.h из удобного хмл файла..
Хорошая идея. Но с генераторами кода связана общая проблема: если в сгенерированный код внесены изменения, а потом понадобилось перегенерировать его заново (например, добавились пункты меню), все изменения потеряются.
Нужно продумать очень хороший, самодостаточный генератор, к выходу которого ничего не нужно приписывать вручную.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle