ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
161549 Топик полностью
ReAl (16.07.2009 18:51, просмотров: 147) ответил ReAl на По варианту 2 правильность перечисления поддерживается автоматически ("В обеих порядок определяется ТОЛЬКО enum-ом" - т.е. во втором хоть в массиве только указатели на функции, но они в правильном порядке независимо от порядка указания их в исходном
Вот так: typedef struct { void (*pfunc)(void); char *name; } state_t; #define STATE(code,name) [code] = { do_##code, name } enum { stop, jump, left, right, total_states}; void do_stop(); void do_left(); void do_right(); state_t array[total_states] = { // размер указать, чтобы занулило неинициализированные в конце STATE(left, "Go left"), STATE(right, "Go right"), STATE(stop, "Stop here"), }; avr-gcc -O2 -S -std=c99 .global array .data .LC0: .string "Stop here" .LC1: .string "Go left" .LC2: .string "Go right" .type array, @object .size array, 16 array: .word gs(do_stop) .word .LC0 .skip 4,0 ; это пропущено нулями отсутствующую запись для do_jump .word gs(do_left) .word .LC1 .word gs(do_right) .word .LC2 Ну сам массив правильно бы const объявить и в структуре const char *name. Но именно для AVR тут строки всё равно в ОЗУ выходят, avr-gcc их тут просот так не затолкает во флеш. только через промежуточные имена. cog-ом же всё что угодно намутить можно.