相关疑难解决方法(0)

C状态机设计

我正在用混合C和C++制作一个小项目.我正在我的一个工作线程的核心构建一个小型状态机.

我想知道你是否会在SO上分享你的状态机设计技巧.

注意:我主要是经过久经考验的实施技术.

更新:基于SO上收集的所有重要输入,我已经确定了这个架构:

事件泵指向指向调度员的事件集成器. 调度程序指向1到n的操作,这些操作指向事件集成器. 带通配符的转换表指向调度程序.

c c++ architecture state-machine

192
推荐指数
9
解决办法
8万
查看次数

是否使用goto?

这个问题可能听起来有些陈词滥调,但我处于这种情况.

我正在尝试实现一个有限状态自动机来解析C中的某个字符串.当我开始编写代码时,我意识到如果我使用标签来标记不同的状态并使用goto从一个状态跳转到另一个案件来了.

在这种情况下使用标准的break和flag变量非常麻烦,很难跟踪状态.

什么方法更好?最重要的是,我担心这会给我的老板留下不好的印象,因为我正在实习.

c parsing goto finite-automata

20
推荐指数
6
解决办法
4032
查看次数

C中的状态机

在C中编写状态机的最佳方法是什么?
我通常在for(;;)中编写一个大的switch-case语句,并在外部操作完成时使用回调来重新进入状态机.
你知道更有效的方式吗?

c state-machine

16
推荐指数
2
解决办法
2万
查看次数

什么是函数指针,我将如何使用它们?

我明白我可以使用指针来实现功能.

有人可以解释为什么会使用它们,以及如何使用它们?简短的示例代码对我很有帮助.

c pointers function-pointers

14
推荐指数
3
解决办法
2万
查看次数

如何在代码中对测试进行模糊处理以防止篡改响应处理?

我正在寻找一种方法来混淆(在目标代码中)一个测试 - 就像检查许可证密钥是否有效一样.我想要防止的是有人在图像二进制文件中搜索处理响应的代码.

bool checkError = foo();
if ( checkError ) // I'd like to avoid making a simple check like this one.
{
   // process response
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的例子,但不是推荐的方法:

int check = 71 * 13;
check += 35 * isValid(); // will only return 0 or 1

//later (delayed execution of response)
if ( check % 71 )
{
   //process response
}
Run Code Online (Sandbox Code Playgroud)

编辑:只是为了澄清,实际测试已经完成,我正在通过/失败返回.我的响应处理将是一个基本的jmp,并且会对如何混淆jmp位置的指针感兴趣.

c++

7
推荐指数
2
解决办法
1301
查看次数

什么可能导致 C 跳过 return 语句?

我正在用 C 为微控制器编程,所以我不确定这个问题是属于这里还是属于电子堆栈交换。如果它不适合这里,请告诉我,我会将问题移到那里。

所以我在 C 中有有限状态机。这个 FSM 负责通过 UART 检索数据。每个状态检索一些数据并对其执行一些检查。每个状态都有三个可能的方向。如果接收到的数据有效,它将进入下一个状态。如果不是,它将重复其状态。如果该状态已重复一定次数,它将进入失败状态。为了说明这一点方向的状态返回代码:okerrrepeat。这适用于除最后一个之外的所有状态。在这里调用时,return repeat我可以看到调试器转到该语句,然后最后检查它}函数,然后它转到内存中的随机位置,我只能在 Code Composer Studio 的反汇编视图中看到。有时这是 0x0 有时它是我看不到的 RAM 中的随机内存。

什么会导致这种奇怪的行为?我在 Code Composer Studio 中关闭了优化选项。

所有州都有这样的机构:

enum ret_codes fc_state(void) {
    uint8_t buf[250];
    static uint8_t fail_counter = 0;
    const uint8_t max_tries = 5;

    int ret = 0;
    while (ret == 0) {
        ret = UART_read(_uart, buf, sizeof(buf));
    }
    if (ret == UART_STATUS_ERROR) {
        return err;
    }

    /*
        perform tests on buf ... …
Run Code Online (Sandbox Code Playgroud)

c memory enums state-machine fsm

6
推荐指数
1
解决办法
125
查看次数

关于缩小这个功能的想法?

我有这个巨大的开关案例,里面有嵌套的switch case语句,我想知道是否有人对如何清理有任何想法?

switch (datatype) {
    case STR:
    {
         switch(operation)
         {
              case EQUALS:
              {
                     /* perform str compare */
              }
              case NOTEQUALS:
              {
              }
              case LT:
              {
              }
              case GT:
              {
              }
              case GTE:
              {
              }
              case LTE:
              {
              }
              default:
                 break;
         }
         break;
    }
    case VER:
    {
         switch(operation)
         {
              case EQUALS:
              {
                     /* perform version compare */
              }
              case NOTEQUALS:
              {
              }
              case LT:
              {
              }
              case GT:
              {
              }
              case GTE:
              {
              }
              case LTE:
              {
              }
              default:
                 break; …
Run Code Online (Sandbox Code Playgroud)

c switch-statement

3
推荐指数
2
解决办法
379
查看次数

C语言的有限状态机

我正在尝试用 C 创建一个简单的有限状态机,但我对如何开始感到非常困惑。我尝试在网上查找,但没有任何东西真正为我解决这个问题。

我的目标是检查字符串是八进制、十六进制还是十进制。

要成为八进制,字符串必须以 0 开头,后跟数字 0-7。要为十六进制,字符串必须以 0x 或 OX 开头,后跟 (af、AF、0-9)

我创建状态的尝试是:

typedef enum  {
   ERROR,
   OCTAL,
   HEX,
   DECIMAL
} stringStates;
Run Code Online (Sandbox Code Playgroud)

现在,我将使用 switch 语句来遍历整个字符串并在不同状态之间切换,直到我正确识别它属于哪个状态。

 while (current_Position<=end_String-1)
 {
    switch( "input something here")
      {
        case 0:
             //process string
             break;
        case 1:
             //process string
             break;

         case 2:
             //process string
             break;
         case 3:
             //process string
             break;
         default:
             break;
      }
  }
Run Code Online (Sandbox Code Playgroud)

这个概念对我来说仍然很新,我很难理解它的实现。如果有人能提供一些线索,我们将不胜感激。

c state-machine switch-statement

2
推荐指数
1
解决办法
1万
查看次数