Здравствуйте, kov_serg, Вы писали:
_>Вот такой же код на голом C
_>_>typedef struct {
_> int loop;
_> int machineID, *param;
_> const char* value;
_>} fn1_t;
_>void fn1_setup(fn1_t *self) { self->loop=0; }
_>int fn1_loop(fn1_t *self) {
_> LOOP_BEGIN(self->loop)
self->>value="Idle"; LOOP_POINT
self->>value="Started"; LOOP_POINT
self->>value="Processing"; LOOP_POINT
_> while (*self->param < 10) {
self->>value="Waiting"; LOOP_POINT
_> }
self->>value="Stopped";
_> LOOP_END
_>}
_>
| | вспомогательные макросы |
| | _>/* loop-fn.h */
_>#ifndef __LOOP_FN_H__
_>#define __LOOP_FN_H__
_>typedef int loop_t;
_>#define LOOP_RESET(loop) { loop=0; }
_>#if defined(__COUNTER__) && __COUNTER__!=__COUNTER__
_>#define LOOP_BEGIN(loop) { enum { __loop_base=__COUNTER__ }; \
_> loop_t *__loop=&(loop); __loop_switch: int __loop_rv=1; \
_> switch(*__loop) { default: *__loop=0; case 0: {
_>#define LOOP_POINT { enum { __loop_case=__COUNTER__-__loop_base }; \
_> *__loop=__loop_case; goto __loop_leave; case __loop_case:{} }
_>#else
_>#define LOOP_BEGIN(loop) {loop_t*__loop=&(loop);__loop_switch:int __loop_rv=1;\
_> switch(*__loop){ default: case 0: *__loop=__LINE__; case __LINE__:{
_>#define LOOP_POINT { *__loop=__LINE__; goto __loop_leave; case __LINE__:{} }
_>#endif
_>#define LOOP_END { __loop_end: *__loop=-1; case -1: return 0; \
_> { goto __loop_end; goto __loop_switch; } } \
_> }} __loop_leave: return __loop_rv; }
_>#define LOOP_SET_RV(rv) { __loop_rv=(rv); } /* rv must be non zero */
_>#define LOOP_INT(n) { __loop_rv=(n); LOOP_POINT } /* interrupt n */
_>/* for manual labeling: enum { L01=1,L02,L03,L04 }; ... LOOP_POINT_(L02) */
_>#define LOOP_POINT_(name) { *__loop=name; goto __loop_leave; case name:{} }
_>#define LOOP_INT_(n,name) { __loop_rv=(n); LOOP_POINT_(name) }
_>#endif /* __LOOP_FN_H__ */
|
| | |
Это что за "тут играйте, тут не играйте"?. Не-не-не, давай по-чесноку. Я тебе давал полный текст программы и ты давай тоже полный. Вместо со "вспомогательными макросами" и ссылкой на запускаемую программу.