遇难题,键盘

nsz   2007-9-30 13:25 楼主
遇到一个问题:
这样的,现在有一个函数,它有四种处理方法,A,B,C,D,它根据标志位选一个走下去,而在 A 中它也有四种方法,A1,B1,C1,D1,如此下去,A1中也有四种方法,,,,,,有五层,到第五层的时要返回到A,B,C,D的这个环,再继续  A 中的A1,B1,C1,D1,                     ,B,C,B1,C1,,,,,,,,处理方法类似但又不一样,D,D1完全相同,并且要求要立即结束,也就是不能结束后回到上一层,
请大家帮我想个解答方法.注意函数面对四种选择时要不停的查询四个标志位,这个是系统有要求的,
我用的笨方法算的,没学过计算机,看起来这像个树,
问题是系统要求,最好不要递归,用GOTO,也不行,让我烦躁的是那个D 因为要不停查询,我用的是DO ***  WHILE** 所以总是一结束就回到上一层,郁闷!!!!!!!!!!!!

回复评论 (5)

这是一个标准的状态机思路

如果要在多层间嵌套一般是得用GOTO,因为这样的效率最高,也是GOTO存在的原因之一.

switch (StateMachin)
{
    case A:
    {
        //do sth && State change
        break;
    }
    case B:
    {
        break;
    }
    case C:
    {
        break;
    }
    ...
    case A1:
    {
        break;
    }
    case B1:
    {
        break;
    }
....
    default:
}
点赞  2007-9-30 15:05
楼上哥们,我没学过状态机,但我看你这个和SWITCH CASE结构有什么区别啊
再说了,一个SWITCH 不能解决问题啊,它有五层呢,说白了就是要根据A,A1,A2,,,,,来决定是哪一个的B,C,D,B1,C1,D1,它们的标志位只有四个,没那么多,
问了很多人都说用状态机,谁能详细点说呢,
点赞  2007-10-8 16:04
状态机这个学术点了,说白了就是从代码的角度去看你的过程逻辑.

你的过程是从一个"状态"经过一个的处理,触发,转移到另一个状态.

用代码怎么表达?

你可以这样

IF A
    DOSTH
ENDIF
IF B
    DOSTH
ENIF
对吧?对应A/B做不同的事

那用更形象的表达方式呢?
那是把你的对象整体看成一个东西,以不同的标志(可以为一些特殊值)然后处理该状态下要做的东西,外加管理好状态迁移
比如:
我,有上班,在家.这两个状态
那我可以这样来表示
#define ONWORK 1
#define ATHOME 2

unsigned char MEStateMachin = ATHOME;

...

switch (MEStateMachin)
{
    case ONWORK:
    {
        DOSTH();//做事,里面也可以有不同的状态,可以是新的,比如我做别的事有开始做,正在做,做完,等
        HAVELUCH();//吃午饭
        DOSTH();
        if (Finish())
        {   
            GOHOME();
            MEStateMachin = ATHOME;//状态迁移
        }
    }
    case ATHOME:
    {
        //思路同上
    }

    default:
    {
        //异常
    }
}

状态机一般只在本层面上工作,不传入下一层状态,不然会太复杂,调试的时候可能要郁闷
要进入下一层,那就用新的一组状态了.别不舍得

不知道我说清楚没有?
点赞  2007-10-8 17:05
你的意思是不是说在chang stage那里该边到自己所要的状态
点赞  2007-10-9 15:56
这个changstage就好似一个触发一样
点赞  2007-10-9 15:58
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复