А про С++ в вопросе не было!
Цитата(_Артём_ @ Jun 5 2007, 00:14)

Вариант Сергея Борща почему-то в С++ глючит (то работает, то нет).
Как заставить Американца прыгнуть с моста? Встретить его на мосту и убедить, что он разорен. Как заставить француза прыгнуть с моста? Встретить его на мосту и убедить, что жена ему изменяет. Как заставить русского прыгнуть с моста? Встретить его на мосту и сказать "А вы знаете, здесь прыгать с моста запрещено!"
Цитата(Сергей Борщ @ Jun 1 2007, 21:20)

4) В С++ такое уже не прокатит.
В С++ такое не работает по простой причине: при наследовании данные производной структуры (которая в С++ есть частный случай класса) располагаются вслед за данными родителя. А если размер родителя неизвестен, компилятор не сможет иметь доступ к данным производного класса. А сказать "от этого класса наследников не будет никогда" возможности нет. Как сделать на С++ то, что вы хотите, да еще с инициализацией через {} - не знаю

Могу предложить два варианта - 1) массив структур сам по себе, структура из размера и указателя на массив. Да, лишний указатель, зато можно писать a = pArray[n].member; 2) не указывать размер, а в конце масива добавлять элемент с каким-либо признаком конца структуры (например если одно из полей - указатель, то он равен нулю.
Код
class terminal_t
{
public:
terminal_t() {};
static void process();
private:
static bool read_input(char c);
public:
private:
................
struct dictionary_t
{
char Name[10];
void (*Action)(void);
uint8_t StackRequired;
} static const __flash Dictionary[];
} static Terminal;
#define TERMINAL_DICTIONARY \
terminal_t::dictionary_t const __flash terminal_t::Dictionary[] = \
{ \
{ "HEX", ns_terminal::SetHex, 0}, \
{ "DECIMAL", ns_terminal::DECIMAL, 0}, \
{ ".", ns_terminal::UDOT, 1}, \
{ "@", ns_terminal::Reference, 1}, \
{ "!", ns_terminal::Dereference, 2}, \
{"DUMP", ns_terminal::DUMP, 2}, \
#define TERMINAL_DICTIONARY_END \
{0, 0 } \
};
TERMINAL_DICTIONARY
{"v", readADC, 0},
{"IDUMP", RAM_DUMP, 2},
{"RDUMP", XROM_DUMP, 3},
{"XDUMP", XRAM_DUMP, 2},
{"X!", writeRAM, 2},
{"X@", readRAM, 1},
{"RB!", writeROM_byte, 3},
{"R!", writeROM, 3},
{"R@", readROM, 2},
{"SN", SN, 0},
TERMINAL_DICTIONARY_END
Да, на каждую структуру лишний элемент, но не нужно вручную перед компиляцией считать количество элементов, а значит и ошибиться невозможно. И те же самые Dictionary[n].Action();