有限状态机(FSM)是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。通常FSM包含几个要素:状态的管理、状态的监控、状态的触发、状态触发后引发的动作。本文主要阐述一下状态机的几种设计方法。

1:switch case/if else设计方法

curEvent = getEvent();
curState = getCurState();
switch(curState)
{
case state1:
{
switch(curEvent )
{
TODO...
setCurState();
break;
}
break;
}
...
}

这种设计方法最简单,通过一大堆判断来处理,适合小规模的状态切换流程,但如果规模扩大难以扩展和维护。

2:基于表结构的状态机设计方法:建立相应的状态表和动作查询表,根据状态表、事件、动作表定位相应的动作处理函数,执行完成后再进行状态的切换。

一个通用的状态机处理模块的设计如下:

/*状态表注册*/
void FSM_Regist(FSM_T* pFsm,STATE_TABLE_S* pStateTable)
{
pFsm->FsmTable = pStateTable;
return;
}
/*状态迁移*/
void FSM_MoveState(FSM_T* pFsm,int state)
{
pFsm->curState = state;
return;
}
/*事件处理*/
void FSM_EventHandle(FSM_T* pFsm,int event)
{
ACT_TABLE_T* pActTable = NULL;
ActFun eventActFun = NULL;
/*获取当前状态动作表*/
pActTable = FSM_getActTable(pFsm);
/*获取当前动作函数*/
for(int i=;i<MAX_ACT_NUM;i++)
{
if(event == pActTable[i].event)
{
eventActFun = pActTable[i].eventActFun;
break;
}
}
/*动作执行*/
if(eventActFun)
{
eventActFun(pFsm);
}
}

假设我们的状态图如下:

aaarticlea/png;base64,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" alt="" />

相应的状态机设置如下:

/*状态1的动作表*/
ACT_TABLE_T state1ActTable[] = {
{EVENT1,state1Event1Fun},
{EVENT3,state1Event3Fun},
};
/*状态2的动作表*/
ACT_TABLE_T state2ActTable[] = {
{EVENT2,state2Event2Fun},
};
/*状态表*/
STATE_TABLE_T FsmTable[] = {
{STATE1,state1ActTable},
{STATE2,state2ActTable},
}; int main(int argc, _TCHAR* argv[])
{
FSM_T fsm;
/*状态表注册*/
FSM_Regist(&fsm,FsmTable);
FSM_MoveState(&fsm,STATE1);
FSM_EventHandle(&fsm,EVENT1);
FSM_EventHandle(&fsm,EVENT2);
return ;
}
/*客户端提供的状态处理函数*/
void state1Event1Fun(void* pFsm)
{
FSM_MoveState((FSM_T*)pFsm,STATE2);
return;
}
void state1Event3Fun(void* pFsm)
{
FSM_MoveState((FSM_T*)pFsm,STATE3);
return;
}
void state2Event2Fun(void* pFsm)
{
FSM_MoveState((FSM_T*)pFsm,STATE3);
return;
}

通过设计一个通用的基于表结构的状态机模块,针对不同的状态图,我们只需要根据状态图得到其状态表结构,然后通过FSM_Regist注册,就可以方便的使用了状态机的功能了。这种机制便于我们添加新的状态流程,并且可以很好的进行分层状态机的设计。

分层状态机的设计:

于状态较多的状态机,通常的设计会维护一个庞大的二维矩阵,所有状态耦合在一起,这往往导致维护困难,由于可能存在许多公共的特性,也会导致许多状态具有
相同的处理函数。针对这些问题我们可以通过设计分层状态机来解决,主要的思想就是根据不同的功能模块设计出多个状态机,各个状态机分布在不同的层次上。上
层状态机调用下层状态机时,上层状态机入栈,下层状态机变为当前处理状态机。通常我们使用堆栈来保存当前状态机的上层状态机信息。

下图描述一个分层状态机设计实现:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAssAAAFGCAIAAAATrEUXAAAgAElEQVR4nO3d7VMbWZ4veP0X/WJj9sVOxMTeuBsdsdExc+P23piOG+uO8Pb0jdiIUUSP566hC1SmkLuQQTJIMiC7wJiHMRiDKCyD1dgl23LZtO3ABRRVpaJKVS5MYUxZRghhSYB4Eg/CQhgsP+S+SJD1jASpPPnw/bypMkpEksk5+dXJk78joQAAAACYJiG9AwAAACBASBgAAADAPCQMAAAAYB4SBgAAADAPCQMAAACYh4QBAAAAzEPCAAAAAOYhYQAAAADzkDAAAACAeUgYAAAAwDwkDAAAAGAeEgYAAAAwDwkDAAAAmIeEAQAAAMxDwhAWT8dhicqyv1cBAHgqWefm6Tgs2YG+j31IGMKSKkNYVGhlACBIibs+iyrc5VlUEsnhDg/LuyV2SBjCkiRh0Dn+sEqFMQwAEKCEXZ9FFREqMIRLABKGsCRLGBaLJ/mrAAD8tnfnFjGeAWxBwhAWzMMAABHaq3PzdBzGTRL2IWEICxIGAIhQys7N03EY4xdEIGEICxIGAIhQ8s7N03EYczxJQcIQFiQMABChVJPc0ekRg4QhLEgYACBCCTs3TL4gDQlDWCLKy9CimhcSBgAIUqKujy4BFAndH8uQMAAAAIB5SBgAAADAPCQMAAAAYB4SBgAAADAPCQMAAACYh4QBAAAAzEPCAAAAAOYhYQAAAADzkDAAAACAeUgYAAAAwDwkDAAAAGAeEgYAAAAwDwkDAAAAmIeEAQAAAMxDwgAAAADmIWEAAAAA85AwAAAAgHlIGAAAAMA8JAwAAABgHhIGAAAAMA8JAwAAAJiHhAEAAADMQ8IAAAAA5iFhAAAAAPOQMAAAAIB5nEgYbrd7dHTUbDY3NTXpkquvrzebzUNDQw6Hg/QuA7ANzYTXVCqVFEAcVCoV/WdPJmH4/X6r1WowGOhWp1Kpqqqqbt68+d133/2S3MOHD2/evFlXV6fVaqVSqUKh0Ov1FovF5/MR+S0AsgrNREikUukbAHGQSqX0nz2rCcPtdhsMBoVCIZPJGhsbe3t7nz9/vu/fYXp6+uuvv25tbZXL5XK5XK/Xj46OsvnrAGQDmokgIWGAeEil0q2trdevX7ORMPx+f09Pj0KhUKlUvb2909PTjP8+CwsLX3/9dVVVlVwuN5lM+LgGvINmImxIGCAeUqnU5XL5/f7sJgy3293U1CSTyTo7O6enp19n38LCwu3bt+VyuU6ns9lsWf3tABiBZiIGSBggHllPGDabrbq6WqVSDQ4OstBjxhsbG6usrFSpVENDQ1n6HQEOCM1EPJAwQDyymDAcDodOp6usrPz555+JdJqRpqam6urqVCoV7j0Dp6CZiA0SBohHVhJGMBg0Go0ajWZsbIx0nxllamqqqqqqqanJ7/cz+PsC7AOaiTghYYB4MJ8wrFarQqG4f/8+6X4yqcHBQYVC0dPTw9SvDJApNBPRQsIA8WAyYQSDwaampsbGxuXlZdLd4x7W19c7Ozt1Oh0+pQHL0ExETiqVkj6xQjY1NfXzzz/fuHGjsbGxMrm6urobN278+OOP4+PjpHdZyBhLGG63W6vVDg4OhvjjyZMnSqUSU+iBNWgmgITBrOXl5cHBwfb2dqVSKZVKlUplRvXoNBqNVCotKipqbW39+uuvFxYWSP9CgsJMwujv79doNB6Ph3RnmDGfz1dZWWk2m5nqPgCS4XUzqaioQDNhBBIGI6amptrb24uKirJRj661tZULM68FgIGEYTQa29vbNzc3SXeD+3f9+vXGxsZQKMRgPwIQCc0EaEgYB7G8vHz//v2ioiKlUslCPbpr165hVOMgDpQwQqGQXq+/d+8e6a6PAd9++21tbW0wGGS8QwGRC6GZQAQkjP2ZmppqbGxkvx5dYWFhZWUl1x744ov9J4xQKFRXV/fVV1+R7vQYMzw8XFFRgd4TGBRCM4FoSBiZGhsbq6qqUiqVZOvRKZXKH3/8kcgO8Nc+E0YoFNJqtcPDw6S7O4Y5nU70nsCUEJoJxEHCSN/4+Dj96AcXZkXQ9eiUSiUXdoYv9pMwQqFQXV3d8PDwKyGanJwsLy9H7wkHhGYCCSFhpIN+Upqz9eh48bQ5F+wnYej1+oGBAdJdXBY9evSopqYmhBltcABoJpAQEsaeBgcHi4qKOF6PjuN7yBEZJwyj0Xjv3j3SnVvWWa3WmpqarHY0IGBoJpAMEkYK6+vrjY2NvBghoEdZKisrub+rBGWWMHp6ejo7O0l3ayy5e/euwWDIdncDwoNmAikgYSQzNTWl0Wj4WI+Oa7dyuCODhOFwOCorK4PBIOk+jT3nzp37/vvvWeh0QDDQTCA1JIyEent7eV2P7saNG6QPIRelmzCCwaBSqZybmyPdm7FqbW2tuLh4fn6ena4H+A7NBPaEhBGvs7NTAPXozp8///LlS9LHklvSTRh1dXU//PAD6a6MAJvNptVqX716xU7vA7yGZkL6DPAAEkakly9ftrS0CKYe3blz59bX10kfVA5JK2FYLJaWlhbSnRgxJpPJaDSy1f8AX6GZoJmkAwkj7OXLl7W1tcKrR4eQEbZ3wvD7/Uql0ufzke7BiAkGg8XFxZOTk2x2Q8AvaCZoJmlCwqC9fPlSo9EIsh5deXk5QgZt74RhMBgePHhAuvsibHh4uLy8/PXr12z2RMAjaCav0EzSg4Txenf0QnjxgoaQEbZHwnA4HBqNhnTHxQkNDQ1ffPEFy50R8AKaSRiayZ6kUinpKyB5LS0tgq9Hd/bsWV7PXWXEHglDpVJNTk6SPlmc4PP5CgoK1tfXWe6PgPvQTMLQTPaEhNHZ2SmSenRnz54lfbAJS5UwhoaGamtrSZ8mDrl8+fJnn3327t079nsl4Cw0kxhoJqmJPGHcu3evo6OD9B8pS+7evXvp0iXSh5ykVAlDq9XabLZt2LW0tFRQULCyssJ+rwSchWYSA80kNTEnjGfPntGr8pK+9LOnpqbm22+/JX3giUmaMNxut1KpJN1ZcQ4+n0EkNJOE0ExSEG3CoJ+3Emc9uunpadKHn4ykCaO+vt5qtZLuqThnaWkpLy/vxYsXRPom4Bo0k4TQTFIQbcKora0VbT06jUYTDAZJnwECEicMn89XWFhIupviqDNnzvT39+PzGaCZpIBmkow4E8ZXX30l8np0V65cIX0SCEicMMxm8/Xr10n3URxlsVjOnj2Lz2eAZpICmkkyIkwYPp8P9eiKi4vtdjvpU8G2xAlDLpd7vV7SfRRHbWxs5OXlOZ1OUj0UcASaSQpoJsmIMGG0t7ejHh1dj25ra4v02WBVgoRhs9kqKytJd1Cc1tzcfOvWrVAoRLCfArLQTPaEZpKQ2BLGs2fPUI+O1tDQ0NPTQ/qEsCpBwtDr9V9++eUWJPf48WO1Wr26ukqwnwKy0Ez2hGaSkNgShlKpRD06Gl2PbnV1lfQ5YU+ChCGXy2dnZ0n3TpwWCARycnJcLhfBfgrIQjPZE5pJQqJKGD/++CPq0UW6fPnytWvXXr16RfrMsCQ2YdDT40l3TTxw6tSpgYGBra0tsr0VEIFmkiY0k3iiShgajQb16CLR9eiWlpZInxmWxCYMi8Vy8eJF0v0SD5hMpkuXLvn9frK9FRCBZpImNJN44kkYTqcT9ejiXb58+erVqyIZxohNGLi7nCb6HvP8/DzZ3gqIQDNJE5pJPPEkjNraWtSji0fXoxPJbIzYhIG7y2mi7zE7nU7UFBIhNJM0oZnEE0nCmJ+fRz26ZE6fPt3b2yuGYYyohBEMBnNzc19CeoqLi61W6xbuMYsMmklG0ExiiCRh3LhxA/XokrFYLNXV1WIYxohKGA6HQ6PRkO6ReKOhoaG7uxv3mMUGzSQjaCYxpFIp4ecZWFFYWIh6dMnQ9ejsdjvps5R1UQmDnr9GukfiDXoW2+LiIukuC1iFZpIRNJMYYkgYT548qaioIH0d57Tm5maz2Sz4heyjEobJZDKbzRl0HhNthyQn+vb3asRG79GbR39t16G2id1v6jsR9c9k2/cl/Hr0LqW1k4l98803Z8+enZ2dJd1lpeTpOCxRWfb3Kju4sA+ZEFczifiu/bUTfjQTFokhYbS0tGAqdGr0JOilpSXS5yq7ohJGXV3d999/n0Hnkapz7DuRRqfUdyJyk4m2Q9Hfkfj9J9oOSU6cOJHslb5k/9zvTiYzMTGhUCi4XlAo1fXbopJIJGxe3RPsDOv7cGBiaiYRPzkmr6SNH82ERWJIGIWFhZgKnVp4EjTpc5VdUQmjsrJyZGQkk84jcd9Ef+w5dOJEGhf46D4rnb6P/mKKl/bavQx3MqmZmZmCggKXyxXi8soLSRKGp+OwRCI5rFKxOn4QvTNk9iFtPp8v4ddF1EyifvI+h/v40UxYJPiEMTc3h3p06Th16lR/f38gECB9xrIoQcLYTJ+97ZBE0Rf/5b4+e/JXY74/1SaJ3iH8tT6F5FCbPdX2KXcg7Z1Manp6mu46Nzc3SfdaySVLGBaLJ/mrce9AO9zhifmW3X/EbLP7Ssfulw93eHaHK95vk8E+kGA2m+VyucViifm6qJpJhD5Fyr1Ihh/NhEWCTxgDAwOoR5cOk8nU3t6+vLxM+oxlUVTCKCwsnJ6ezqDzSN03pdVz9SnCd37jt03wDhEdZnzfmaDrjBPzfgdIGJubm/Th29jYIN1rJXfQeRgWVTg0WFQSicoS+T2ejsOHOzwJttnJHDtfjfpi3I/jcMKQSqVSqTQmZ4ixmdBbxUaVdPGgmbBI8AkDkzDSRE/FmJmZIX3Gsoh4wgjb7UMjvyP+HaK6y7gPVfv4cIaEkfrqHhEewluHvyk+YESPakSNZ1iS/TjOJ4yYnCHCZrLXKMoeuN5M0m8jybZ8P4a3959ydhOGs/33kuKBLP6AvWESRproqRgTExPb29tEz1gWRSUMmUw2Pz+fQc/BZNcZ/paID0qx75Do01aKrpaVhMF1f/jNryT/8Lv9vSqVSn/3DzHH+x9+J5X+4Te/+tVv/rD7n6TbhN85/P8Jf9ye+8Alcrk8Ly9PVM3E3nZIsu/hi83Nzc1NqVRaVlZ26tQpnU6n0+noh3FoPT09tgjBYHBfGeFg0p8NnXjL8Bgd/b/v43ZCUqYSRoIwMVAskUiIJoy1tbWcnJyMZ+uIVXFx8XfffSfgqRhSkmMYCW7sRn/Pnl1h6q6WrTEMTlcTYnIMI/LLhzss9AhGkm0SfvLj8xiGVCrV6/X0qqriaSYHHL2gSaXSgYGBn376iY4R3d3d4YRhMBh0EY4cORI+2rm5uZEvGY3G8Hd1d3dH5pKDNsD0Z0Mn3DLhGF5yWUoYzvbfSySS3xcXkx3DsNlsarWa9IWbNxoaGm7fvi3gqRhEE0bcp6PYe73R75BwplnUeDASRjwG52HEzreI/EfcNkkTRlwY4UPCoLMF/XURNZODTL6IsL9mEgwGI2NET09POGEYjcbI8JGbmxs+U0eOHIl8yWAwmCNEvuH7Z4XSnw2dVntJuYWn41c7w0q/b3fGpITdf9BhIbzN7ivtu1/+fbtzd7ji/TbOgQHnK/J3SehpnqQv3LxhMpk+/fRTr9dL7oxlV1TC0Gg0Y2NjGfQcccOxUb1RehfviDlscWOxUe+QYFL87vfvbpPOFLbU96QzMT8/n5eXx4eEESXqCp/ZsySRm1pUkf+K3yZxv7yzXdSP5HbCiMwWNPE0k6gfGt920sNyMwmFQpExor+/PxwvTCZTZPiQyWQ7qeQPv/mV5B8iB0z0ev37VNJa8FtJzhX67b785HeSjyzJf3rCCB3BopIc/s0fpK9e0QmheCAyETjbf//7duergeJwsNjZZidz7Hw16otxYYJ0wrh69Soz9egyKPXG77KN1dXVHo+H3BnLLmnM06o///xzENLj8Xjox/A4nTBgv6I+5kZAM8kID5qJp+OwRHUlIpdYLJbIhPH3kt/u5A/F//hfJf9n5JwhrVYbziUVf/rfJZL/Ubn7fUNDQ+E3dLvdFLUzwPeHnbskO1kgHAniA0b0qEbUeAZnE0ZtbS0T9egyKPUmgLKNU1NT5M5YdkUljKqqqocPH5LukXjD6XQeP37c5XIFAgGyPSSwCc0kIzxoJgd4lsThcOyObvxfEsk/FbS+TybV1dXh8KFQKKTSBHOi/2tORW3Zv/761x9evH7xw1//+sOL179t+lPMNrsJYzc3cCNhTE5Ofvvtt/Ffr6ioYKAeXQal3oRQttHpdAYFukBJVMIwGo3d3d3M9zHj+oQDUPpx5n8UmwYHB8+cOcPpx/DSF3czRSKR7DkrXpzQTDLCg2Zy4KdVPR2H06p8vzuGMTk5+WTXDz/8UP7HX39YTgeM67XH/lny93/8uKKioqJCqVRG3sf516KiioqKio//+PeS//rBJ59cv/jhryV/LL9+/fr16wMDAztv16v7rSSXhYTx5MkTqVSq0WiePHkS+XU6YWRwF23vu4SpS70JoWyj0+lcX1/P/kkjICph9Pf3t7W1ke6ReOPmzZttbW0ulytI5BE7IATNJCM8aCYHTBh7Tb6IEDEPI3a+ReQ/wrdJdv/f2f57SfENtzucIT4dHr5+8cNfS3794cXr169fP3/+fAXt4z/+b5L/Enkfp7CwsCLC9QgPHjx4EiGYycfoH374Ifwjamtr5+bm6K8zPA86rdnGpOvRHfhxAafTuba2xthVnUuiEsbo6Ognn3xCukfiDb1ebzKZXC7Xq1ev9tWxAS+hmWSEB80k/dnQibYMF8MPS+9ZksibGQPFkf96/yxJxCTQ+Lsku9tF3RSJu0syNzcXGSMiE0ZLS0tk+Ih8MDs/Pz/ypatXr4a/6969e0+ePLl69Wrk9keOHLl69era2hqzCSPDh6X5WrZRLAnD7/fn5+eT7pF4o7S01GKxuFyut2/fZrH7A45BM8kImkkMxuphZJPP54vMJZ9//nk4YbS3t1dUVBQWFsbXo8vPz//zn//MVD26fZZ642HZRqfTKdSSGFEJg6Ko3NzcpaWlDUhDTk7Os2fPpqenyXZYwD40k/ShmcTgRcLY0/Xr1yOzRW5u7tWrVxmsR5fu6IUgyjaKKGHU1dUNDg6S7pR44NmzZwqFwuVyLSwskO2wgH1oJmkSaTNJOW9aYAmjqKhoYGAguDuHg5mEkUGpNyGUbRRRwujp6TEYDKT7JR64c+dOc3Ozy+VaWVkh2ZcBCWgmaUIziSeMhNHS0lJbWzs8PBzzdbVaffB6dJmWeuN72UYRJQy3211SUkK6X+KBs2fP3r9/n9PP4EHWoJmkCc0knjASRjDJgycVFRWoR5c+uh6diBIGhXvM6aHvLrtcrtevXxPsrYAUNJN0oJnEE0bCSOaTTz5BPbr00fXonE7n6uoq6VOXFQkSBu4x7yl8d3l2dpZgVwUEoZnsCc0kIWEnjI6ODtSjS9/g4ODp06fF8rQqzWq1NjQ0BCC5K1eudHZ24u6ymKGZ7AnNJCFhJ4wHDx6gHl36bt68qdfrnU6n3+8nfeqyIkHCCIVC+fn5i4uLpDso7iooKBgZGXG5XJubmwS7KiAIzWRPaCYJCTthDA8PnzlzhvSFmzf0ev1nn33mdDo3NjZIn7qsSJAwKIoyGAz37t0j3UFx1KNHj9Rqtcvlcrvd7969I9RNAXloJimgmSQj7ITh8/lQjy59paWlX3/9tdPp3NraIn3qsiJxwnA4HGq1mnQfxVGtra10FeSES3uDeKCZpIBmkoywE8arV69ycnIwCTpNOTk5v/zyC11TX5ASJwyKopRKpc1mI91Ncc7q6mpeXh49Pf7ly5dEeijgDjSThNBMUhB8wqitrcUk6HTQU6GdTufs7Czpk5YtSRPG0NDQuXPnSPdUnHP79m26ghCqIAOFZpIEmkkKgk8Y9+7dQz26dNy5c+fChQtOp3NxcZH0ScuWpAkjFAoVFhbOzs6S7qw4ZHV1taCgYGxsDNPjgYZmEg/NJDXBJ4zJyUnUo0vH2bNn7969K+BHVV+lSBjUbmlk0v0Vh4Q/mbnd7jdv3rDeNQEXoZnEQDNJTfAJ4xWmYqSHnoThdDo3NzdJn7FsSZUw8PksEj6ZQUJoJpHQTPYkhoSBqRh7Ck/C8Hg8pE9XFqVKGBRFWSyW5uZm0r0WJ1y9etVgMLhcLpRAhhhoJmFoJnsSQ8L49ttvGxoaSF/EOc1oNF6+fFnYkzBe7ZkwKIqqrKx89OgR6Y6LMIfDoVAoJicnXS7X4uIim/0R8AKaSQDNJD1SqXRb6DY2NlCPLrWCgoLh4WG6mifp05VFeycMt9utVqtXV1dJnxGSdDpdb28vfWsZn8wgHppJAM0kPWJIGNvb259++inq0SXz6NGjsrIyp9NJ19oifa6yaO+EQVGUyWS6ceMG6ZNCzMDAwNmzZ+mB3/X1ddZ6IuAXNBM0k3SIJGHYbDbUo0umtbWVLhY+NzdH+kRlV1oJIxQKKZXKiYmJF+IzMzNz4sQJeuba7Ows6h9DMmgmaCbpEEnC2N7eLikpQT26eHQ9OvopkvX1ddJnKbvSShgURXm93pKSkpWVFdJdGdu0Wu3AwAD9yWxra4udPgh4Cs0EzWRP4kkYVqsV9eji3b59my609fz5c9KnKOvSTRgURVkslgsXLpDuyljV1dUVnhiP5RUgHWgmpM8A14knYWxsbOBB7hj049yPHz92Op0LCwukT1HWZZAwKIpqbW394osvSHdoLAkvDomBX8gImgmkIJ6Esb29fffu3UuXLpG+rHNIeACDLrRF+vxkXWYJIxQKVVVVPXr0iHS3lnUTExMqlYpeusntdodCoSx3OyAcaCaQgqgSBoYxIoltAGM704RBUVQwGCwvL7fZbKQ7tyxyuVwajWZkZIT+ZLaxsZHVHgeEB80EkhFVwtje3h4YGLhw4QLpizsnXL16tb29nR7ACAaDpM8MGzJOGBRF+f3+srIyl8tFuovLioWFhZMnT/700090v7m6upq9vgYEDM0EEhJbwtje3q6oqEA9Oroend1up5drJ31OWLKfhEFRlM/nKy4ufv78+bqwzM/Pa7Vaq9WKaWtwcGgmEE+ECcPhcKAenU6ne/DggagGMLb3nTAoivJ6vadOnXr69Cnp7o4xz58/j+w3FxYWstG/gKigmUAMESaM7e3tq1evirweXXV1NR0vfD4f6bPBnv0nDIqifD6fVqsdGRkh3ekxwG63azSayH4Ts+KBEWgmEEmcCWNjY6OkpES09egUCgU9wZMuGEP6bLDnQAmDoqhgMHjq1Kkvv/ySdNd3IENDQyqVKjxnDf0mMAvNBMLEmTC2t7ddLpdo69H19/fTAxjCXucs3kETBkVRoVCovr6+paVleXmZdB+4H11dXWq1mn7iDjeVIUv43kw6OjoUCsXg4CCayQGJNmFsb28PDAw0NTWRvuKzqqurK/z8iOBXIYnHQMKg3b9/v7S01G63k+4JMzA9Pa3VasPlCDElHrKNv82kvb39gw8+kEqlUqk0JydHp9NVV1ebzWaz2ez3+0kfVz4Rc8LY3t6+ePGiqOrRhddQdbvdoro/QmMsYVAU5XA4Tp48effuXT8ffPPNNwqFIryYgtvtxgP9wAL+NpP79+9L48hksmAwSPqg8onIE8bGxsaZM2fEU4+OXuFMVM+PRGIyYVAU9eLFiwsXLpSWlv7yyy+k+8akpqamdDrdmTNn6KUg6WrHKEcIrAkEAs3NzXxsJpWVlTEJY2hoiPTh5BmpVLolbqurq6dOnRJDPbpHjx5NTk5OTk6urq6SPupkMJwwaCMjIwqForOzc25ujnQ/GWV5edlkMh0/fry3tzd8Z8Tn82HCGrCPX81kaWnp7du3brf7yJEj4XihUqlIH0X+QcLY2tpaXFwsLS0Vdj26H374gY4XCwsLpI83MVlJGBRFbW9vd3V1FRQUdHV1caEDXV5e/vzzzwsKCtra2iYnJ+lOc2Zm5uXLl8z+4gDpe/XqFfebyfT09ObmZnifjUZj+P6IVqvVarVer5fgMeQdJAza7OysUOvRaTSawcFBOl7Mzc2RPtIkZSth0BYXFw0GA9kONNxpNjc3h8d73W633+/H0AVwwdLSEmebyerqakwzCQaDMplMKpVarVaKorq7u3Nzc00mE+4zpgkJI4yu3iawenSR8WJmZob0MSYsuwmDoqi3b9/OzMzQHWhjY+NPP/3EWqf5yy+/tLS0xHSaLpdrcXERvSFwCr+aSX9/f3V1dfiffr+/urpaoVA4HA62DhiPIWFEmp2dpdfPI50NGGC329VqdWS8ePnyJekDTFjWEwbtzZs3MzMzn3/+uVqtLigo6OzsHB8fX8sOp9NpMpn+8pe/KBQKk8kU2Wn6fD5kC+AsHjWT+OdHLBYLBjPSgYQRY3V1VavVCqMeXXhqJ+IFjaWEQXv79q3f7x8bG+vs7Dx+/HheXl5tbe3f/va3g3ejTqezp6ensbGxoKDg2LFjbW1t4VUfXS6Xx+NZXl5+/fo1C78jwAHxt5lgMCMdSBjxAoFAbW0tf+vRdXV1lZWVjY2NYe5FDFYTRtjW1pbP53v69Gl3d/f58+ePHz+ek5Oj1Wo//fRTk8n08OFDj8eToqP0er0PHz68detWZ2enVqvNy8s7duxYXV3drVu3wiWNwxPg8bA+8BRPm4nVapXJZHq9Hk0vISSMZLq7u0+ePMnTenSTu8T85Eg8MgmD9u7du2AwuLy8PDs7++zZs4GBga6uLr1er1arw9UDEzp69KharW5ubu7s7BwYGIgc4KWfEPH5fBsbG2/fvmX/lwJgFh+bSTAY1Ov1MplsdHSU8TfnOySMFJ4+fapSqfhVj66vr4/OFk6nU7R1L5IhmTAivXnzJhgMrqyszM/PezweV7Rbt24plcrw43Mx3G73/Py8z+cLBAK4BwwClqKZ6PX6urq6hA2EVDMZHR3FYEY8JIzUfD5fU1PTyZMnOV6PrrKy8vTp0yMjI3S8cLlcGxsbpA8e53AlYcR49x+aslsAACAASURBVO7d1tZWIBAIn9Gmpqb29vbIc/zixYutra03b96Q3lkAMsLNZGRkJC8vb3p6Or4rJNtMwoMZKP0ZhoSRjp9++qmoqIiz9ejkcnlPT0/4zsjc3BzmdSbE0YQRLxgMyuVy9FMAMUKhkEqloqtTcJPNZlMoFNXV1X6skYaEkbYXL15cuXKFg/XoWltbx8fHw0MXfr+f9KHiLt4kDIqiHA6HTCbDstEAkcxmc319Pem92EMoFDKZTLm5uRaLhfS+EIaEkZGZmZn29naO1KNramoK3xZxOp1LS0sYukiNTwmDoqienh6tVovJFgA0t9stk8n8PBkbcDgcGMxAwsjU5ubm8+fP6ZxBqh5dZLaYnJycnZ3FrIt08CxhUBRVX19vNBpJ7wUAJ2i1Wn6NCoQHM3p6ekjvCxlIGPsTDAafP39uNpvLysrYqUd3/PjxoqKia9euRWaLubk5ZIv08S9hYEIGAK27u1un05Hei/3wer2iXTUNCeMgNjc3l5aWRkZGDAaDXC5nvB7d+fPn6Xp0ra2t4cVRJycnp6am5ubmgsEg6QPAM/xLGBRFORwOuVwu5oFWAJ/Pl5uby+tpSfSqad3d3aR3hFVIGIxYX1+fm5sbHR29fft2Q0ODXC4/evToAevR1dbW3rx5M1z5m+b1elHlYt94mTAoiurp6eHppzcARuh0OgHcaBDhYIZUKn0JDNnc3FxdXZ2bm3O5XGNjY319fUajsbW1taysbM96dGVlZU1NTQaDoa+vL/I+yOTk5PPnz71e78rKSjAYJP0r8htfEwZFUTqdzmw2k94LAAL6+/u1Wi3pvWBMd3e3TCYTyappSBhZsrGxsbq6Shejczqdk9GkUulkSh6Px+v1Li8vBwIB0r+KcPA4Yfj9fplMZrPZSO8IAKvov3yBfej3i2bVNCQMdmxubtIPmi4uLi4uLkql0sU4Pp/P7/dvbGyQ3lnB4nHCoCjKZrPx6FE9AEZUV1cLdfRODEvAI2EQgcNOBL8TBkVRZrMZEzJAPKxWq0qlEvAFWPCDGbjUEYHDTgTvEwaFCRkgGvT9EbfbTXpHsk7AS8DjUkcEDjsRQkgYmJABItHU1GQymUjvBUuEugQ8LnVE4LATIYSEQVGUzWaTy+XC+7gDEDY6OqpQKAR8fyQh4S0Bj0sdETjsRAgkYVAUZTKZuL/+E8D+BINB0Q7UCWwwA5c6InDYiRBOwgiFQlqtVgA1iADiGQwGg8FAei9IEsyqabjUEYHDToRwEgZFUT6fTyaTCXUKOogW/VS22O6PxBPGEvC41BGBw06EoBIGRVFDQ0OYkAFCEgqF5HK5MG4QMILvgxm41BGBw06E0BIGRVFGoxETMkAwTCaTXq8nvRfcQg9myGSy/v5+0vuSMVzqiMBhJ0KACQMTMkAwHA4HqtYmw9NV03CpIwKHnQgBJgxqd0IGv/odgBihUEilUlmtVtI7wmm8WwIelzoicNiJEGbCoCjKarWKsHgACInZbMb9vnTwazADlzoicNiJEGzCoChKr9fjBjbwlNvtxv2RjPT09MhkMrPZzPHPFbjUEYHDToSQE0YoFFIoFLx+sA1ES6vV4k83U7xYNU0qlW4C63DYiRBywqAoyuv15ubm8mLsFCCsu7sbKwbvG8eXgMeljggcdiIEnjAoirJYLJiQATzi8/lyc3N9Ph/pHeExLg9m4FJHBA47EcJPGBQmZACv6HQ6PGvNiKGhIZlMZjAYOFWCD5c6InDYiRBFwsCEDOCL/v5+rVZLei+Eg4OrpuFSRwQOOxGiSBgURXm9XplMhpFn4DK/3486LtnAqSXgcanLjL3tkETRl/jrOxK9HCuLhz3ZHoJ4EgZFUT09PVqtFhMygLOqq6vNZjPpvRAm7gxmIGFkJvH1u08RDhZ9ConkUJt9j7dh5rAn2Jk+RbohR4xElDAoiqqvrzcajaT3AiABq9WqUqmQgLOKXjWtvr6eYKERJIzMJEwYfYqIUJHWGEI2EgY9jHJIocAYRjLiShjBYFAulw8NDZHeEYAo9P0Rt9tNekeEj/gS8EgYmdk7P0SMZyR9B9qhNnvMG+7+I2ab3Vfadr98qM2+O1zxfht7X589rT0UL3ElDGp3KSlMyABOaWpqMplMpPdCRAguAY+EkZm9rt/2tkMpb5LsDHdIpdLdKBLxjva2Q4fa7JFDIuG4Ym87FI4SUV+M2xkkjORElzAoTMgAjhkdHUXJFvaFl4BneTADCSMzKa/f9rZDe8yB2A0PUqk0/F7ht4wPGNGjGlHjGUgY+yDGhEFhQgZwRjAYlMlkNpuN9I6IFPurpiFhZCb59TtylCGp8J2NyAdPdpLFzn+SbhP+uUgY+yXShEFPyCA+qxzAYDAYDAbSeyF2bC4Bj4SRmSTX771HL2hRYxiRXz7U1rcTMKLHMBL9XCSM/RJpwqAoymazYe1KIIv+I8T9ES5gbTADCSMzSS/qez+hurm5GTUPI3a+ReQ/wu+2+/9JE0bcz0XCSE68CYOiKLPZjPWlgJRQKISBNK6hl4Dv7u7OXuxDwshMRGWt8IMccbc10nyWJHKzPkXkv+K3SZgwdreL+nFIGMmJOmFQFKXT6VDjCIgwmUxNTU2k9wJiZXvVNCQMInDYiRB7wqDrEGCeHbCMfmoaN+k4K3tLwONSRwQOOxFiTxgUJmQA6+il+KxWK+kdESJPx2GJypLOq8m29HQc3h0w/295zA9mSKXS4J7G9e8H7Xv33hwij1jkHRX9+M7raR12YBoSBkVhQgawy2w2V1dXk94LgUqVMCwqiUSyR8KwqMJbWFQSyeHKB6MymcxoNAYZWjUt8aVuXH/ofZboVYSDRa8i8jIJ+4aEQQQSxg5MyAB2uN1ujJllUZKEQQ9MHFap9hjDsKgkhzs80e8VZHTVtL0TRq8iIlRERQ/YNyQMIpAwdvj9/tzc3CzN7QIIU6lU/f39pPdCuJIlDIvFQ6V3l+S9iPGMhEvAv7+fcrjDE/OGu/+I2YaipH/4zSGJQr87qH9IP06PVMSM6u+KGM+AA0DCIAIJ472hoSG5XB5kaCwUIF53dzfux2XXwedhRG77fjyDoigqGAwaDIbdwYyI4Y6dKBLxjp6Ow4c7PAm2oRPGbpQI54ckQxXj+kO4ScIIJAwikDCiGI3G+vp60nsBwuT1enNzc7HqXnYxlDA8HYclSV7dWQK+4HeS//tizP2U8FvGB4zwNtI//OZ9aggHi0QJY1x/COMXTEHCIAIJI0ooFNJqtT09PaR3BARIp9OxU5da1JhIGJ6Ow5KY4YtooVDIVP4vMc8t7NwTOdzh2f3PztTS6G3ouyQ7uSF5whjXH8IcTwYhYRCBhBHL5/PJZDJMyABm9ff3a7Va0nshAgdOGClGL6JYVJL/djYvbgl4i+pwh2UnYESPYexIJ2Fg9IIRT548+WyXVCoN//+TJ09I75pYIGEkgAkZwCx6HrHb7Sa9IyJwwIQRP/kiKYtKcrh9KmQ2m2Wyf/mT5B8j5ltETr4Iv9vO/ydPGJG3TjB6wYC5ubkjR45Iox05cmRubo70rokFEkZimJABDKqursaz0CyJqJcV9QjH+1cjE0bslnG3NfacC7rjv/x/Wp1O5/V6KcqiivymiG3oryZOGLsVoxS97x8sCcNoxr4ZDIaYhGEwGEjvlIggYSQWCoXwVCEwwmKxqFQqLKAqeGkuAY8JAWyKGcbAAAbLhJgw0h8mTYme+c/wUs7vPyKlORIL2cTQn0oK9MI3+5nWE/fZF7gvnSXgkTBYFjmMgQEMloktYUSXDd6LxWJRKBQH+vQZOyob+3A8kMTcn0oyTU1NJpMp852JrV2NPEpM3M2UPT8h9Pf300vAJ3wVCYNl4WEMDGCwT0QJI0HZ4DTo9Xq9Xs/4ziSeZQ4sY/RPJR49ZTjdhBq5M4nqKACPpFgCHgmDffQwBgYw2CemhBFfNjjVO+x8UmmfCinyDv2j5E+WiNcSFgOmX+nY/XL04/CxYSKDGeuQPYz+qcTUjQ4Gx//57yQfXLEd8E8F4138lXAJeCQM9s3NzeXk5GAAg30iShhpvUpR8cWAb3l/+u3/Ivnolnfn25MUA44q0xP1xegft3O9Qb7gAKb/VCLrRuur/ud//s85B/pTCe8F/lh4K34wAwkjq8bHxx8+fPjZZ5/9x3/8R0WEkydPRv7z3Llzn3322eDgIGpjZBUSRpxEA9Q3Vf8o+c2/hkKhFMWAoy4FkdWDE/44fC7lgiz8qdD/sdlsR/757w7pxw/4p5Ju9SfgNnrVNJPJRPe5G8Acr9f71VdftbW1lZSUSKVSpVJZVVV18+bN77777pfkHj58ePPmzbq6Oo1GI5VKi4qKmpub+/r6PB4P6V9IUJAw4iQq9Et5Ov7Tf/qfVfqqFMWAExfzwTwMLsvOn8rvf9+eI8+p/O1vD/insmftauCR4O4S8EgYjHj27FlbW1tRUVF+fn5jY2Nvb+/z58/f7Nf09PTXX3/d0tJSWFhYWFjY3Nz8448/kv4VhQAJI06SS3+v4tB//3//+z/9U1myYsBIGPyTnT+Vsv/n//iT/E8p6kan86eC0QtBGh0dlUqlFy5cWFpaIt3585LX671z505RUZFSqezt7Z2ent53qkhmYWHh66+/rqqqKiws/Otf/4pRjYNAwoiXoNDvzv9KJH/3z0d8Pl/ibZJeNhI9obq7NBKQlIU/FYfDIfuXX0tS1o3e+08Fky+ESyqV6vX6/Px8fErOyLNnzxoaGvLz8zs7O6enp19n38LCwu3btwsLC8vLy4eHh0kfAF4SasJI/uh6Zg8IRG5qUUlU53p6tFptKBRKsE3iJQ92tov6R8wbAylM/6mEQiGFQmG1XkxdN3rPP5XMalcDr9B3SZ48efLxxx83NDR4vV7SVwGuGx4ePnPmjFKpHBwcZCFYxBsbG6uoqCgpKRkcHCR9MHhGiAkjy+rr641GI+m9AC4ym83V1dWk9wI4LTwPY21tzWg05uTk9PX1kb0McNaTJ0/Ky8srKip+/vlnItki0tTUVG1tbUlJCQaf0oeEkbFgMCiXy4eGhkjvCHCL2+2WyWSRC3kDxIuZ6UkPZpw5cwaDGZGWlpYMBoNGoxkbGyMdLaJMTU198sknGHxKk4gTRubFgMMcDodMJvP5fNnfS+CA9P5UsFQepCP+WZK1tbVr167l5+djMIP21VdfFRUV3b9/n3ScSGpwcLCoqOjOnTukDxXXiThhHExPeEIGAEV1d3frdDrSewE8kOxp1cnJybKysjNnzkxOTrJ8GeCOpaWlhoaG8+fPLy8vk04Re1hfX+/o6CgvL8dgRgpIGPun0+kwIQOo3WV4MaYF6UhdD+PmzZs5OTk3b95k7RrAHc+ePVOr1YODgyH+ePLkSUlJCZ40SQYJY//ohbltNhvpHWGV2+0eHR01m81NTU265Orr681m89DQ0H4WLucbnU6XbCFNgBh7VtyiBzPKyspENZhx//59tVrt8XhIZ4aM+Xy+ioqKa9eukT6EXISEcSA2m03wk/v8fr/VajUYDCqVSiqVqlSqjIryarVaqVSqUCj0er3FYhHeB/3+/n6tVkt6L4A30qzpef/+/fz8fJEMZhgMhvb29s3NTdJpYf+uX7/e0NCwtrZG+lhyCxLGQZnNZkHegHe73QaDQaFQyGQyporytra2yuVyuVyu1+tHR0dJ/4oM8Pv9ubm5breb9I4Ab6RfNdzr9Z45c6akpOTJkydZvQwQtLa21tzcfO/ePdIJgQHffvttTU0NqrVGQsJggE6nM5vNpPeCGX6/v6enR6FQqFSqbBfllcvlJpOJ16Ma1dXVgjn1wI5M1yXp6+vLyckxGo3C+3y8trZ27ty5gYEB0tmAMcPDw6dOnULICEPCYIAwJmS43e6mpiaZTMZyUV65XK7T6fh49CwWi0qlCuF5IsjEPlY+83q9NTU1H3/8sZAGM9bW1tRq9fDwMOlUwDCn04mQEYaEwQxeT8iw2WzV1dUqlYpgUd7KykqVSsWjOmZ0rBTDPFZg1r7XVv3xxx/z8/OFMZhBj14MDw+/EqLJyUmEDBoSBmP4OCHD4XDodLrKykqOFOWtq6tTqVS8mKLR1NRkMplI7wXwz0FWb19aWrpw4YIAVk1rbm4eGBggnQSy6NGjR9XV1QLIggeEhMGYUCik1Wr5clc+GAwajUZuFuWtqqpqamri8oDQ0NCQXC4P4f4IZE4qlQYOhh7MuHDhwuLi4gHfigiDwXD37l3SGSDrrFZrdXU16YNNGBIGk3w+Hy9Gzq1Wq0Kh4HhRXoVC0dPTQ/pQJRAMBgUw7QZIOXjCCAQCi4uLly5dogczDv5ubLpz505HRwfpqz9L7t6929bWRvqQk4SEwTD6020wGCS9I4kFg8GmpqbGxkZeFOXt7OzU6XRcG8zQ6/UGg4H0XgBfMZIwaKOjox9//PGFCxdmZ2eZes+sGh0draioCAaDpC/97Kmpqfnqq69IH3hikDCYZzQa6+vrSe9FAm63W6vV8q4or1Kp5M6AAT2ll7MJEriPwYQRCARWV1fpJeB7e3sZfNtsWFxcLCkpmZubI33RZ9Xa2tqJEyecTifpw08GEgbzQqGQVqvl2gh/f3+/RqPhaVHeyspKLkxwCYVCcrmcFxNRgbOYTRg0ejDj9OnTXB7MqKmp+eGHH0hf8Qmw2WxqtXplZYX0GSAACSMruDYhw2g0CqAob2NjY4jo5Eqj0djU1ERwB0AAspEwAoHA6urqjRs38vPzuTmY0dvbe/HiRdLXemJMJtPly5dJnwQCkDCyhSMTMkKhkF6vF0xR3traWlKH1OFw8LfkCXBHlhIGzeFwlJWVnT592uFwZO+nZGp2drakpMTn85G+0BMTDAaLi4vHxsZInwq2IWFkkV6vJzshIxQK1dXVffXVV6SzAWOGh4fpmWLsH0mFQmG1Wln+uSA8WU0YtBs3buTk5Ny4cSPbPyhNer3+wYMHpK/yhNEFxf1+P+mzwSokjCyiL0v9/f2kfrpWqxVkUV72Q4bZbK6urmbzJ4JQsZAwAruDGWVlZcQHM0ZHR9VqNenrOyc0NDTcvXuX7OlgGRJGdnm93tzcXK/Xy/LPDYVCdXV1Ai7KW15ezlrIcLvduD8CTGEnYdB6e3vz8/PJDmaUlJRMTk6S7jM4wefzFRQUzM/PEzwdLEPCyDqLxaJQKELsTlHU6/WCL8pbU1PDwlENhUIqlYrUQBQID5sJIxAIzM7Onj59uqysbHR0lM2fS6PnTpHuLTjk8uXLf/3rX1+8eMH+uSACCYMNer1er9ez9uOMRuO9e/dIN6Wss1qtNTU12T6Y3d3dvFtuBriM5YRB6+3tpZeAX11dZfPnqtVqm822DbuWlpYKCgq4/FAxs5Aw2BAKhRQKhcViYeFn9fT0dHZ2kr76s+Tu3btZLa9J3+Ty+XzZ+xEgNkQSRiAQmJ2dpZeAZ20ww2azlZSUkL6mc46ohjGQMFjCzoQMh8NRWVkpqqK8586d++6777J0PLVabXd3d5beHMSJVMKghZeAZ2Ewo6amxmq1kr6gc87S0lJeXt7CwkK2jz8XIGGwp7+/P6sTMoLBoFKpFGFR3uLi4mxEt/7+fq1Wy/jbgsiRTRiBQGBxcfHChQsfffRRVldNc7vdhYWFpK/mHHX69Omenh4xDGMgYbCqvr4+exMy6urqRFuUV6PRbG9vM3gwfT5fbm6u2+1m8D0BKA4kDFq2l4C/du3a9evXSV/KOcpisVRVVYlhGAMJg1XBYFAulw8NDTH+zhaLpaWlhfS1nhiTyXTlyhUGj2d1dTUXVkIB4eFIwghkeQn4wsJCr9dL+lLOURsbG3l5eU+fPmX8sHMNEgbb6OLTzE4e9Pv9SqUSRXknJiYYOZ5EHjAGkeBOwqCFl4BncDDj0aNHFRUVpK/jnNbc3Hzjxo21tTWmjjk3IWEQ0NPTo9VqGbyAGQwGFOUdHh4uLy9//fr1AQ+m3+/Pzc3lzqp1IDBcSxiBLCwBf+HChS+//HILknv8+HFZWZngH1tFwiCjvr7eaDQy8lYOh0Oj0ZC+vnNCQ0PDgwcPDng8m5qamDo1APE4mDBoDC4BX1hYODs7S/oizmmBQCAnJ8dutzNx6rgLCYMMBidkqFQqFOWl0UV519fX930wrVarXC7H/RHIHs4mjABDS8DTT5GQvoLzwKlTp3p7e1dWVhg8g1yDhEGMw+E4eDWnoaEhFOWNdPny5c8+++zdu3f7OJjBYFAmk9lstoOcEYDUuJwwaOEl4N1u9z6+vbe39+LFi6Qv3zxgMpna2trm5uYYP4PcgYRBktlsPuCEDK1Wi6K8keiivIuLi/s4mCwXdwdx4n7CoO17CXhMwkgTPRXD5XJl4/RxBBIGYTqdzmQy7e973W63UqkkfU3nnMuXL1+7di3TYYzR0VGZTMbyovAgQnxJGIFAwOFwlJeXZ7oEPCZhpCkQCOTk5NhsNgGX3kLCIMzv9+97ZL6+vh5FeePRRXlfvHiR/pEMhUJZqlMCEINHCYOW0RLwi4uLOTk5LyE9xcXFFotFwFMxkDDIs9lsMpnM7/dn9F0+nw9FeZM5c+ZMf39/+sMYBoOhqakp81MHkDHeJYxAxBLwNpst9Zajo6NqtZr0hZs3Ghoabt26JeCpGEgYnGA2mzNdItxsNqMobzIWi+Xs2bNpDmPQNdAyTXgA+8PHhEFLZwn43t7e5uZm0hdu3qAne+5vRi0vIGFwhU6ny6hMtVwuR1HeZOiivE6nc8/DGAqFFAqFxWLZ/5kDyAR/E0YgEJidnW1oaEixBLzRaDSbzRlcYyfaDklO9CX++o5ELyfZNLx19Nd2HWqb2P2mvhNR/0y2fV/Cr+/uUQY7mdg333xTVVU1NTXF8nlkDRIGV2Q0IcNms1VWVpK+jnNac3PzrVu39nxOx2QyVVdXM3ECAdLC64RBS7EEfE1Nzffff5/BNTZxwug7Eb5mx0SBOBGb7rxd1Pslfv+JtkOSEydOJHulL9k/97uTyUxMTBQVFU1MTBA5jyxAwuCQoaGhNIfr9Xo9ngdL7fHjx2q1enV1NcVhdLvdubm5uD8CbBJAwgjsLgH/8ccfx6yaVl5ePjIyksk1NtElvO9ExPU61UU+ZtMEmyf8bvqLKV5K/e0Z72RSMzMzx44dm5iYEOoCJUgY3GI0GtOZkCGXy/E8WGqBQCAnJ8flciU7hqFQSKVS9ff3M3n+APYijIRBi18Cnk4Ym+mztx2SKPpSbdGnkKTYwt52KNXLCd8//LU+heRQmz3V9nvvXjo7mdT09DSdMHw+H9lTmSVIGNwSCoW0Wm13d3eKbeinSEhfwXng1KlTAwMDW1tbCQ9jd3d3prNrAQ5OSAkjEAgsLi4ajcbwEvAfffTR9PR0BtfYvS7h9rZDcSkgRp8iPEEi/p0SvH9EroiPGAkSRpy4n5LGTiYllUonJiYYXNiWU5AwOMfn88lkshRre1osFhTlTYfJZLp06VLCmyBerzc3N9fr9WbzTAIkILCEQQsvAX/s2DEGE8ZeAxQxdqNG5HfEv39Uqogbe8h8DCPDnYyFhAFsGxoaksvlyepLYhJGmuipGPPz8/HHcM+BIoAsEWTCCOwuAf/v//7v8/PzGVxgk1/C7W2HJPsYGYgZT4h9/0SDEikSSTpDLPsevtjc3NxNGEItiYGEwVFGo7G+vj7hS5iEkaZAIJCTk+N0OmNKb/X396tUKlZOI0AsqVT6QriYukuS7sBAgvkP0e+4Z2JInUiYHGJJTCqV2u32ubk50qcuK5AwOIqekNHT0xPz9WAwmJubm/GUZbEqLi62Wq2RT5T4fL7c3Fy3283q6QTYhYQRd5U+yLyG2EGE2G+Nfv+EEzKjbpuknzAOMvkiAhIGkEHPFaAnZASDwerqarfb7XA4NBoN6Qs3bzQ0NHR3d1+/fr26upqekFFdXZ1RZTMAZgk7YZSVlY2NjWVwgY27a3GozR4xdTPpDM5IUdunmrmZ4NmR3e/f3SadmZ4SiaJvM9OdTGh+fv6DDz5AwgAyLBaLXC6nl/2USqVWq5We5kn6ws0b9GTP5uZmqVSam5ur1+sVCsWeZbgAskfYCaO8vPznn38OQno8Hs+xY8eQMIAYlUol3WUymUwmEzNFedN5NWKj2IK57BTl7TuR4J0z8c0335w9e7a8vDx8DLVaLUpsAUHCThinT59++PAh6Qs3bzidTrlcbrfbFxYWSJ+6rEDC4C6/36/T6aQR6uvr6+rqmCjKG3kB3yNhECvKO9F2KBwsoncifRMTEwqFoqioKPIw5ubmYiESIEXYCePSpUvd3d3MX4rH9Qk/oujHmf9RbBocHNTpdHa7fXFxkfSpywokDI6ilymRRlMoFJWVlQwU5d0dUzh04sReYxjkivKm3o30zMzMFBQUHD16NOZIGgyGYJKHgQGyStgJ4969e21tbaQv3Lxx8+bNlpYWJAwgwO/3G43GI0eORF4aKyoqGCnKa+/rsyd/Neb7iRfl3fesbboob+QB1Ol0eJAECBJ2wvjhhx/OnDlD+sLNG62trV1dXXa7fWVlhfSpywokDK6LyRkffvghk0V507rAEy3Ku7PB/p8KC2cLmUw2NDRE+nyC2Ak7YczMzOTn55O+cPNGaWnpl19+abfb/X4/6VOXFUgY/BDOGXl5eawnjDAyRXkTvk36pFLpv/3bv127dg2PkAAXCDthvHjxIicnZ2lpaQPScPTo0dHRUYfDQfqkZQsSBp/4/f4///nPTBXl3fvVpN/CXlHeXUkeZE+DVCodGxvD8yPAEYJPGDU1NYODg6Sv3Tzw7NmzoqIiu93ucrlIn7RsQcLgmcLCQlbHMIgW5Y3ej/0nDPpPnPSpA6AoESSM27dvGwwG0pdvHrhz505jY6Pdbp+ZmSF90rIFCYNn2E4YBIvyxhTaO8DiyEgYwB2CTxg2m62kpIT05ZsHqqur3eedbwAAC3FJREFUu7u7BfwgyQskDN7RaDQHL8ob/ereQwhEivJGv7jPSRjz8/N5eXlIGMAdgk8YLzAVIz30JAy73b62tkb6jGULEgbPVFZWoihv+jweT0FBARIGcIcYEgamYuwpPAnD6XSSPl1ZhITBM1VVVSjKmz6n03n8+HGXyxUIBEifOgCKEkfCGBgYaGhoCEByV65cuXTpkrAnYbxAwuAdo9GIorzpGxwcPHPmjMvl2tjYIH3qAChKHAljZWUlPz9/cXGR9HWcuwoKCh4+fGi325eWlkifrixCwuCZ/v5+FOVN382bN9va2lwuVxA1woEbpFLpugi0trbeu3eP9HWcox49elRWVma32+laW6TPVRYhYfDM6OjoJ598QvrCzRt6vd5kMrlcrlevXpE+dQAUJZqEMTIyUlZWRvpSzlEtLS10sXCPx0P6RGUXEgbP+P1+FOVNX2lpqcVicblc7969I33qAChKNAljfX29uLjYZrORvppzzurqal5eHv0UydLSEumzlF1IGPyTm5uLJ8HSlJOT8+zZs+npadInDWCHeBKGxWKpqakhfUHnnNu3bzc1NdntdofDQfoUZR0SBv/U1dXhSbB0PHv2TKFQuFyuhYUF0icNYId4Esby8vJHH300OztL+prOIaurqwUFBcPDw3a7fXp6mvQpyjokDP7p6elBUd503Llzp7m52eVyrayskD5pADvEkzDW19dv37596dIl0pd1DgkPYNCFtkifn6xDwuAft9uNorzpOHv27P37910u1+bmJumTBrBDVAkDwxiRxDaAsY6EwVOYipEOehKGy+V6+/Yt6TMGsENUCWN9ff2LL764cOEC6Ys7J3R1dX366af0AMbq6irpM8MGJAxewlSMPYUnYXi9XtKnC+A9sSWM9fX1U6dOPXr0iPT1nTCHw1FUVPT06VN6uXbS54QlSBi8ZLVaUZQ3tStXrnR2dmISBnCNCBPG06dPy8rKVldXSfcKJOl0uvv374tqAGMdCYOnQqEQivKmVlBQMDIygkkYwDUiTBjr6+tXrly5ceMG6V6BmIGBgaqqKjpezM3NkT4b7EHC4CuDwYCivMk8evRIrVa7XC6Px4NaW8Ap4kwYy8vLxcXFExMTpBfKIGBmZkahUNATPCcnJ4VdJjwGEgZfORwOtVpN+lLOUa2trXSxcJ/PR/pEAUQRZ8JYX1+32+3FxcUrKyukr/hs02q1X3zxBT2A4fP5SJ8HViFh8JhSqURR3nh0UV76KZKtrS3SZwkgimgTxvr6+hdffNHU1ET6is+qyOdHBL8KSTwkDB4bGho6d+4c6Qs659y+fZsutIVi4cBBYk4Y6+vrTU1NX3zxBenrPksePXpUWlpKxwux3R+hIWHwWCgUKiwsRDWbSHRNm7GxMZfLtbq6SvoUAcQSecJYXl7W6XSPHj0iffXPuomJCaVSSa9wZrfbV1ZWSB97ApAw+I2uIE76ss4h4QEMt9v95s0b0ucHIJbIE8b6+vr8/LxWq7XZbKQzQBa5XC61Wv3w4UM6XiwsLJA+6mQgYfAbhjEiRQ5goAwGcJNUKvWL3vT0dGlpqcvlIp0EsmJhYeHkyZODg4Pj4+Pj4+PT09OkjzcxSBi8Z7FYmpubSV/cOeHq1asGg8HlcrlcLgxgADchYdCmpqZOnDjx/Plz0h+zGTY/P6/RaL755hs6XrjdbtJHmiQkDCGorKxEUV6Hw6FQKCYnJ10u1+LiIulzApAYEkaY3W7XaDRPnz4lnQoY8/z588h48fz5c9LHmDAkDCFwu91qtRpFeXt7e+kZGK9fvyZ9TgASQ8KINDU1pVarR0ZGSGcDBtjtdrVaHRkv1tbWSB9gwpAwBMJkMom8KO/Zs2fp+yPr6+ukzwZAUkgYMebm5tRq9Zdffkk6IRzI0NCQUqn88ccfES8iIWEIRCgUUiqVoi3Ke+LECXqC5+zsLMqEA5chYcRbXl6uqalpaWlZXl4mHRX2o6urq7S09PHjx5h7EQMJQzi8Xm9JSYk4i/IODAzQAxgo4gkch4SRzOeff37y5Em73U46MGRgenpaq9W2tbWN7xLzkyPxkDAExWKxXLhwgfQVn1VdXV3h50ewCglwHxJGCiMjI0ql8u7du6R3JC3ffPONQqF48OABnS3sdvv8/DzpneIWJAyhaW1tFVVRXnoNVdwfAb5Awkhtdnb2/PnzJ0+e/OWXX0jvS1JTU1OVlZV0cVI6XkxOTi4vL5PeL85BwhCaUChUVVUlkqK8KpWKXuHM7XaHQiHSxx5gb0gY6fj++++Lioo6Ozvn5uZI70uU5eXlzz77TC6X379/P3xnxO12Y15nQkgYAhQMBsvLywVflFej0YyMjNADGBsbG6SPOkBakDDS5PP5Ll++fOzYsb/+9a9cyBnLy8uff/55QUFBS0vLL7/8QmcLh8OxuLhIete4CwlDmPx+f1lZmbCL8v700090vMAKZ8AjSBgZmZqaamtrI5szwtmisbExfFvEbrfPzs5i6CI1JAzB8vl8xcXFgizKq9VqrVYrZncCHyFhZGptbW1iYoLOGY2NjT/99BNrP/qXX35paWmJyRbj4+MulwuzLtKBhCFkXq/31KlTAivKGxkvFhYWSB9jgMwgYezP6urqxMTE9evXS0tLCwoKOjo6xsfH17LD6XSaTKbjx48XFRV1dXVFZgu3241skT4kDIHz+XxarVYwRXk1Gk1kvMDDI8A7SBgHsba2Njs7OzQ01N7eLpfLP/jgg9ra2r/97W8HTxtOp7Onp+f8+fMFBQXHjh1raWkJL446Pj4+MTHh8XhWVlZIHwCeQcIQvmAweOrUKQEU5VWpVOGpnYuLi4gXwEdIGIxYWlpyu90///yz2Wyur6+Xy+VHjx7VaDSffvqpyWR6+PChx+NJkSe8Xu/Dhw9v3brV2dmp0Wg++OCDY8eOnTt3zmQyhSt/h2+ILCwskP51+QoJQxRCoVB9fT2vi/Kq1Wr6wVT6DijpIwqwT0gYDFpbW1tYWPB4PJOTk48fP37w4EFnZ+fFixdLS0s/+OADaXJHjx4tLS1tbGxsb29/8OBB5H0Q+gkRt9s9Pz+/homcB4OEISL3798vLS3lY1HecNVO+o+V9IEE2D+pVHrA8XxIaGVlZX5+3uPxOJ1Ou90+niGn0+lyubxer8/nI/2rCAcShrg4HI6TJ0/yqyhveM0Rj8ezublJ+hACHAgSBjtWV1cXFxe9Xu9Mcl6vd3FxcWVlhfTOChYShugEAoHm5ubS0lKOF+XV6XRnzpyhV0x1uVxzc3OvX78mffAADgoJA8QDCUOkHj9+rFAouFmUl35OrLe3N3xnZHV1FfM6QRiQMEA8kDDEKxQKdXV1FRQUdHV1cSFnhAvntbW1TU5O0tnC6/Vub2+TPlQAjEHCAPFAwhA7uvg/2ZwRzhbNzc3h2yIej2d9fZ304QFgGBIGiAcSBlBv376dm5szGAx0cVwiRXkjswVdC/zNmzekDwwA85AwQDyQMGAHnTNu376tVqsLCgo6OzuzXZT3L3/5i0KhMJlMMdkCMzpBwJAwQDyQMCDK27dv/X7/2NhYZ2fn8ePH8/LymC3K29jYSBflbWtrCy+OSt8TWV5eRrYAwcvNzU1RCQpASI4ePYqEAQlsbW35fL6nT592d3efP3/++PHjOTk5Wq12H0V5tVptXl7esWPH6urqbt26Fa78TVtaWgoGg6R/XQBW+f1+F4A4IGFAYu/evQsGg8vLy7Ozs8+ePRsYGOjq6tLr9Wq1es+ivGq1urm5ubOzc2BgIPI+iMvlmpmZ8fl8Gxsbb9++Jf0rAhCwtbXF2mwnALK2traQMGAPb968CQaD4dK8GWVYusi/z+cLBAKhUIj0rwIAAOxBwoDMvHv3bmtrKxAIpIiuL1682NrawlMhAABi9v8D4mtYY8nVsXMAAAAASUVORK5CYII=" alt="" />

如上图所示,假设L1为上层状态机,L1状态机在L1_STATE2中可以通过L1L2_EVENT1事件触发进入L2状态机,L2状态机在L2_STATE2中通过L1L2_EVENT2事件触发返回L1状态机,L1和L2各自维护自己的状态表。

struct FSM_S
{
int curState; //当前状态机状态
int curFsmTableSize; //当前状态机查询表大小
STATE_TABLE_T* curFsmTable; //当前状态机查询表
FSM_STACK_T stack[MAX_FSM_STACK_DEP];//状态机堆栈
int curStackTop; //栈顶
FSM_REGIST_T registFsm[MAX_FSM_NUM]; //注册状态机
int registFsmNum; //注册状态机个数
};

1:通过堆栈数据结构维护上层状态机信息。

2:保存所有可以注册状态机信息。

3:记录当前运行状态机信息。

主要接口:

void FSM_Init(FSM_T* pFsm);
void FSM_Regist(FSM_T* pFsm,STATE_TABLE_S* pStateTable,int FsmId,int curFsmTableSize);
void FSM_Begin(FSM_T* pFsm,int FsmId);
void FSM_MoveState(FSM_T* pFsm,int state);
void FSM_EventHandle(FSM_T* pFsm,int event);
void FSM_Push(FSM_T* pFsm);void FSM_Pop(FSM_T* pFsm);

1:FSM_Regist 对所有的状态机信息进行注册

void FSM_Regist(FSM_T* pFsm,STATE_TABLE_S* pStateTable,int FsmId, int curFsmTableSize)
{
pFsm->registFsm[pFsm->registFsmNum].fsmId = FsmId;
pFsm->registFsm[pFsm->registFsmNum].FsmTable = pStateTable;
pFsm->registFsm[pFsm->registFsmNum].fsmTableSize = curFsmTableSize; pFsm->registFsmNum++;
return;
}

2:FSM_Begin 用于开始一个新的状态机流程,切换状态表信息。

void FSM_Begin(FSM_T* pFsm,int FsmId)
{
for(int i=;i<pFsm->registFsmNum;i++)
{
if(FsmId == pFsm->registFsm[i].fsmId)
{
pFsm->curFsmTable = pFsm->registFsm[i].FsmTable;
pFsm->curFsmTableSize = pFsm->registFsm[i].fsmTableSize;
break;
}
}
return;
}

3:FSM_Push/FSM_Pop 用于状态机切换的出入堆栈操作。

void FSM_Push(FSM_T* pFsm)
{
if(pFsm->curStackTop < MAX_FSM_STACK_DEP)
{
pFsm->curStackTop++;
pFsm->stack[pFsm->curStackTop].state = pFsm->curState;
pFsm->stack[pFsm->curStackTop].pFsmTable = pFsm->curFsmTable;
pFsm->stack[pFsm->curStackTop].fsmTableSize = pFsm->curFsmTableSize;
} return;
} void FSM_Pop(FSM_T* pFsm)
{
if(pFsm->curStackTop > -)
{
pFsm->curState = pFsm->stack[pFsm->curStackTop].state;
pFsm->curFsmTable = pFsm->stack[pFsm->curStackTop].pFsmTable;
pFsm->curFsmTableSize = pFsm->stack[pFsm->curStackTop].fsmTableSize;
pFsm->curStackTop--;
} return;
}

接口的使用:

/*L1 状态机定义*/
ACT_TABLE_T L1state1ActTable[] = {
{L1_EVENT1,L1state1_Event1Fun},
{L1_EVENT3,L1state1_Event3Fun},
};
ACT_TABLE_T L1state2ActTable[] = {
{L1_EVENT2,L1state2_Event2Fun},
{L1_L2_EVENT1,L1state2_L1L2EventFun},
};
STATE_TABLE_T L1FsmTable[] = {
{L1_STATE1,sizeof(L1state1ActTable)/sizeof(ACT_TABLE_T),L1state1ActTable},
{L1_STATE2,sizeof(L1state2ActTable)/sizeof(ACT_TABLE_T),L1state2ActTable},
};
/*L2 状态机定义*/
ACT_TABLE_T L2state1ActTable[] = {
{L2_EVENT1,L2state1_L2Event1Fun},
};
ACT_TABLE_T L2state2ActTable[] = {
{L1_L2_EVENT2,L2state2_L1L2EvenFun},
};
STATE_TABLE_T L2FsmTable[] = {
{L2_STATE1,sizeof(L2state1ActTable)/sizeof(ACT_TABLE_T),L2state1ActTable},
{L2_STATE2,sizeof(L2state2ActTable)/sizeof(ACT_TABLE_T),L2state2ActTable},
}; int main(int argc, _TCHAR* argv[])
{
FSM_T pFsm; FSM_Init(&pFsm);
/*状态机注册*/
FSM_Regist(&pFsm,L1FsmTable,FSM_L1,sizeof(L1FsmTable)/sizeof(STATE_TABLE_T));
FSM_Regist(&pFsm,L2FsmTable,FSM_L2,sizeof(L2FsmTable)/sizeof(STATE_TABLE_T));
/*开始L1状态机*/
FSM_Begin(&pFsm,FSM_L1);
FSM_MoveState(&pFsm,L1_STATE1);
FSM_EventHandle(&pFsm,L1_EVENT1);
/*push 状态机*/
FSM_EventHandle(&pFsm,L1_L2_EVENT1);
/*L2状态机处理*/
FSM_EventHandle(&pFsm,L2_EVENT1);
/*pop 状态机*/
FSM_EventHandle(&pFsm,L1_L2_EVENT2);
/*L1状态机处理*/
FSM_EventHandle(&pFsm,L1_EVENT2);
return ;
}

1:首先通过FSM_Regist注册所有的状态机。

2:FSM_EventHandle(&pFsm,L1_L2_EVENT1)中的动作处理函数中进行压栈操作同时进入L2状态机。

void L1state2_L1L2EventFun(void* pFsm)
{
FSM_Push((FSM_T*)pFsm);
FSM_Begin((FSM_T*)pFsm,FSM_L2);
FSM_MoveState((FSM_T*)pFsm,L2_STATE1); return;
}

3:FSM_EventHandle(&pFsm,L1_L2_EVENT2)中的动作处理函数中进行出栈操作返回到L1状态机。

void L2state2_L1L2EvenFun(void* pFsm)
{
FSM_Pop((FSM_T*)pFsm); return;
}

结论:

通过分层状态机的设计,各个功能实体维护自身的强相关的一套状态机,可以有效的减小状态机的复杂度,通过构建公共流程状态机,可以减小规模。综上所述:在针对规模较大、流程复杂的状态机设计,我们考虑使用分层的设计方法。

转载请注明原始出处:http://www.cnblogs.com/chencheng/archive/2012/06/28/2564336.html

有限状态机(FSM)的设计与实现的更多相关文章

  1. 有限状态机FSM(自动售报机Verilog实现)

    有限状态机FSM(自动售报机Verilog实现) FSM 状态机就是一种能够描述具有逻辑顺序和时序顺序事件的方法. 状态机有两大类:Mealy型和Moore型. Moore型状态机的输出只与当前状态有 ...

  2. cocos2d-x 游戏开发之有限状态机(FSM) (二)

    cocos2d-x 游戏开发之有限状态机(FSM)  (二) 1 状态模式

  3. 有限状态机FSM

    有限状态机(Finite-state machine)又称有限状态自动机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.常用与:正则表达式引擎,编译器的词法和语法分析,游戏设计,网络 ...

  4. 有限状态机FSM详解及其实现

    有限状态机,也称为FSM(Finite State Machine),其在任意时刻都处于有限状态集合中的某一状态.当其获得一个输入字符时,将从当前状态转换到另一个状态,或者仍然保持在当前状态.任何一个 ...

  5. Atitit. 有限状态机 fsm 状态模式

    Atitit. 有限状态机 fsm 状态模式 1. 有限状态机 1 2. "状态表"和"状态轮换表" 1 3. 有限状态机概念(状态(State)事件(Even ...

  6. cocos2d-x 游戏开发之有限状态机(FSM) (四)

    cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge ...

  7. cocos2d-x 游戏开发之有限状态机(FSM) (三)

    cocos2d-x 游戏开发之有限状态机(FSM) (三) 有限状态机简称FSM,现在我们创建一个专门的FSM类,负责管理对象(Monkey)的状态.然后Monkey类就实现了行为与状态分离.Monk ...

  8. cocos2d-x 游戏开发之有限状态机(FSM) (一)

    cocos2d-x 游戏开发之有限状态机(FSM) (一) 参考:http://blog.csdn.net/mgphuang/article/details/5845252<Cocos2d-x游 ...

  9. [原创][FPGA]有限状态机FSM学习笔记(一)

    1. 概述--何为有限状态机FSM? 有限状态机-Finite State Machine,简写为FSM,是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.通常 ...

  10. Linux编程之有限状态机FSM的理解与实现

    有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.FSM是一种逻辑单元内部的一种高效编程方法,在 ...

随机推荐

  1. java jmap

    jmap : 命令用于生成堆转储快照.它还可以查询finalize执行队列.Java堆和永久代的详细信息,如空间使用率.当前用的是哪种收集器等. 命令格式: jmap [option] vmid op ...

  2. 第十七章 提升用户体验 之 使用MVC扩展功能控制程序行为

    1. 概述 ASP.NET MVC具有很好的扩展性,每一个核心功能都可以被扩展.重写 和 定制. 本章内容包括:实现MVC过滤器和controller工厂.使用 action results,view ...

  3. bootstrap fileinput 上传文件

    最近用到文件上传功能, 说实话:以前遇到过一次,COPY了别人的代码 结束! 这次又要用,可是看到别人很酷的文件上传功能,心痒了! 好吧.简单的办法,找控件: bootstrap fileinput ...

  4. background-size在IE8不兼容问题

    background-size在IE8及以下浏览器不兼容:要解决的话要用滤镜: filter: progid: DXImageTransform.Microsoft.AlphaImageLoader( ...

  5. PHP实现正态分布的累积概率函数

    在实际项目中,遇到需要正态分布算法去计算一个数值在整体的分布区间,例如:  100,90,80,70,60,50,40,30,20,10共10个数,按从高到低的顺序排序,总数的10%分布区域为极高频, ...

  6. 挂sqlserver计划,系统自动分配拣货任务

    USE [P2WMS_WH43] GO /****** Object: StoredProcedure [dbo].[sp_fru_CalcAllocatePickData] Script Date: ...

  7. IIS 7.0的根文件(applicationHost.config)位置及说明

    位置 C:\Windows\System32\inetsrv\config\applicationHost.config 说明 https://www.microsoft.com/taiwan/tec ...

  8. Distributed Transaction Coordinator(DTC)一些问题的解决方法

    有时运行某个程序或者安装SQL Server时报错. 错误信息: 事务管理器不可用.(从 HRESULT 异常: 0x8004D01B) 启动服务Distributed Transaction Coo ...

  9. cv2.minAreaRect() 生成最小外接矩形

    简介   使用python opencv返回点集cnt的最小外接矩形,所用函数为 cv2.minAreaRect(cnt) ,cnt是所要求最小外接矩形的点集数组或向量,这个点集不定个数.   cv2 ...

  10. (原)IPhone开发时把ToolBar中的元素居中的技巧

    在IPhone应用开发时,经常用到ToolBar,其中的控件通常都是居左,想让它居中就有点困难. 这里介绍一种方法: 将Flexible Space Bar Button Item从库中拖到位于控件左 ...