我需要对自动机进行编码,并且我遇到了计算goto的旧需求(ala fortran4 :))
我需要在便携式ansi-C中对此进行编码。
我希望远离那些"不要远离longjmp / setjmp,远离嵌入式ASM(),远离非ansi-C扩展。
有谁知道怎么做?
答案 0 :(得分:2)
就像我在评论中所说,尽管你请求不使用goto以外的任何东西,但标准C没有提供任何东西。
适当地设计你的状态,并将指向它的指针传递给处理函数以供它们修改。这样处理程序可以设置下一个要调用的函数。像这样:
struct state;
typedef void state_func(struct state*);
#define NULL_ACTION_ADDRESS (state_func*)0
struct state {
state_func *action;
int value1;
int value2;
};
#define INIT_STATE { initial_action, -1, -1}
state_func initial_action;
state_func handle_a;
state_func handle_b;
int main(void) {
struct state s = INIT_STATE;
while(s.action != NULL_ACTION_ADDRESS) {
(*s.action)(&s);
}
return 0;
}
void initial_action(struct state* ps) {
ps->action = &handle_a;
}
void handle_a(struct state* ps) {
ps->action = &handle_b;
}
void handle_b(struct state* ps) {
ps->action = NULL_ACTION_ADDRESS;
}