Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在状态机上使用全局变量_C_Global Variables_State Machine - Fatal编程技术网

C 如何在状态机上使用全局变量

C 如何在状态机上使用全局变量,c,global-variables,state-machine,C,Global Variables,State Machine,我制作了这个状态机: enum states { STATE_ENTRY, STATE_....} current_state; enum events { EVENT_OK, EVENT_FAIL,EVENT_REPEAT, MAX_EVENTS } event; void (*const state_table [MAX_STATES][MAX_EVENTS]) (void) = { { action_entry , action_entry_fail , action_entr

我制作了这个状态机:

 enum states { STATE_ENTRY, STATE_....} current_state;
 enum events { EVENT_OK, EVENT_FAIL,EVENT_REPEAT, MAX_EVENTS } event;
 void (*const state_table [MAX_STATES][MAX_EVENTS]) (void) = {
   { action_entry , action_entry_fail , action_entry_repeat }, /* 
                                                  procedures for state 1 */
  ......}

void main (void){
   event = get_new_event (); /* get the next event to process */
   if (((event >= 0) && (event < MAX_EVENTS))
   && ((current_state >= 0) && (current_state < MAX_STATES))) {
      state_table [current_state][event] (); /* call the action procedure */
      printf("OK 0");
   } else {
      /* invalid event/state - handle appropriately */
         }
}
enum states{STATE\u ENTRY,STATE\u….}当前状态;
枚举事件{EVENT_OK,EVENT_FAIL,EVENT_REPEAT,MAX_events}事件;
void(*const state_table[MAX_STATES][MAX_EVENTS])(void)={
{action\u entry,action\u entry\u fail,action\u entry\u repeat},/*
国家1的程序*/
......}
真空总管(真空){
event=get_new_event();/*获取下一个要处理的事件*/
如果((事件>=0)和&(事件<最大事件))
&&((当前状态>=0)和&(当前状态<最大状态))){
状态表[当前状态][事件]();/*调用操作过程*/
printf(“正常0”);
}否则{
/*无效事件/状态-正确处理*/
}
}
当我在一个状态中修改一个全局变量时,全局变量保持不变,并且我需要在所有状态中使用该变量。你现在知道有什么问题吗? 我的全局变量是以下结构:

  #if (CPU_TYPE == CPU_TYPE_32)
     typedef uint32_t word;
     #define word_length 32
     typedef struct BigNumber {
     word words[64];
    } BigNumber;
   #elif (CPU_TYPE == CPU_TYPE_16)
    typedef uint16_t word;
    #define word_length 16
    typedef struct BigNumber {
    word words[128];
    } BigNumber;
   #else
     #error Unsupported CPU_TYPE
  #endif
  BigNumber number1 , number2;

 Here is how I modify:
 //iterator is a number from where I start to modify,
 //I already modified on the same way up to the iterator
 for(i=iterator+1;i<32;i++){
     nr_rand1=661;
     nr_rand2=1601;
     nr_rand3=1873;
     number2.words[i]=(nr_rand1<<21) | (nr_rand2<<11) | (nr_rand3);
  }
\if(CPU类型==CPU类型32)
typedef uint32_t字;
#定义字长32
typedef结构BigNumber{
单词[64];
}大数;
#elif(CPU类型==CPU类型16)
typedef uint16_t字;
#定义单词长度16
typedef结构BigNumber{
单词[128];
}大数;
#否则
#错误:不支持的CPU\u类型
#恩迪夫
大数字1,数字2;
以下是我如何修改的:
//迭代器是我开始修改的数字,
//我已经用同样的方法修改了迭代器

对于(i=iterator+1;i这只是为了防止您可能想要更改定义FSM的方法。我将用一个示例向您展示;假设您有以下FSM:

您可以将其表示为:

void function process() {
   fsm {
     fsmSTATE(S) {
       /* do your entry actions heare */
       event = getevent();
       /* do you actions here */
       if (event.char == 'a') fsmGOTO(A); 
       else fsmGOTO(E);
     }

     fsmSTATE(A) {
       event = getevent();
       if (event.char == 'b' || event.char == 'B') fsmGOTO(B); 
       else fsmGOTO(E);
     }

     fsmSTATE(B) {
       event = getevent();
       if (event.char == 'a' ) fsmGOTO(A); 
       else fsmGOTO(E);
     }
     fsmSTATE(E) {
       /* done with the FSM. Bye bye! */
     }
   }
}
我确实声称(但我相信有人会不同意)这比使用表格更简单,可读性更强,更直接地传达了FSM的结构。即使我没有放图片,绘制FSM图也相当容易

要实现这一点,您只需定义
fsmXXX
内容,如下所示:

#define fsm            
#define fsmGOTO(x)    goto fsm_state_##x
#define fsmSTATE(x)   fsm_state_##x :

这只是为了防止您可能想要更改定义FSM的方法。我将用一个示例向您展示;假设您有以下FSM:

您可以将其表示为:

void function process() {
   fsm {
     fsmSTATE(S) {
       /* do your entry actions heare */
       event = getevent();
       /* do you actions here */
       if (event.char == 'a') fsmGOTO(A); 
       else fsmGOTO(E);
     }

     fsmSTATE(A) {
       event = getevent();
       if (event.char == 'b' || event.char == 'B') fsmGOTO(B); 
       else fsmGOTO(E);
     }

     fsmSTATE(B) {
       event = getevent();
       if (event.char == 'a' ) fsmGOTO(A); 
       else fsmGOTO(E);
     }
     fsmSTATE(E) {
       /* done with the FSM. Bye bye! */
     }
   }
}
我确实声称(但我相信有人会不同意)这比使用表格更简单,可读性更强,更直接地传达了FSM的结构。即使我没有放图片,绘制FSM图也相当容易

要实现这一点,您只需定义
fsmXXX
内容,如下所示:

#define fsm            
#define fsmGOTO(x)    goto fsm_state_##x
#define fsmSTATE(x)   fsm_state_##x :

关于更改编号2的代码:

for(i=iterator+1;i<32;i){
    nr_rand1=661;
    nr_rand2=1601;
    nr_rand3=1873;
    number2.words[i]=(nr_rand1<<21) | (nr_rand2<<11) | (nr_rand3);
}

for(i=iterator+1;i关于更改的代码
number2

for(i=iterator+1;i<32;i){
    nr_rand1=661;
    nr_rand2=1601;
    nr_rand3=1873;
    number2.words[i]=(nr_rand1<<21) | (nr_rand2<<11) | (nr_rand3);
}

for(i=iterator+1;i这不是一个答案,而是一个注释。但是它太大,无法容纳注释字段,所以我现在将其发布在这里

问题中发布的代码不足以找到根本原因。您需要发布一个显示问题的最小但完整的示例

比如:

#include<stdio.h>
#include<stdlib.h>
#include <stdint.h>

typedef uint32_t word;
#define word_length 32
typedef struct BigNumber {
  word words[4];
} BigNumber;

BigNumber number2;

enum states { STATE_0, STATE_1} current_state;
enum events { EVENT_A, EVENT_B } event;

void f1(void)
{
  int i;
  current_state = STATE_1;
  for (i=0; i<4; ++i) number2.words[i] = i;
}

void f2(void)
{
  int i;
  current_state = STATE_0;
  for (i=0; i<4; ++i) number2.words[i] = 42 + i*i;
}

void (*const state_table [2][2]) (void) =
{
    { f1 , f1 },
    { f2 , f2 }
};


int main (void){
  current_state = STATE_0;

  event = EVENT_A;
  state_table [current_state][event] (); /* call the action procedure */
  printf("%u %u %u %u\n", number2.words[0], number2.words[1], number2.words[2], number2.words[3]);

  event = EVENT_B;
  state_table [current_state][event] (); /* call the action procedure */
  printf("%u %u %u %u\n", number2.words[0], number2.words[1], number2.words[2], number2.words[3]);

  return 0;
}

这不是一个答案,而是一个评论。但是它太大了,不适合评论栏,所以我现在把它贴在这里

问题中发布的代码不足以找到根本原因。您需要发布一个显示问题的最小但完整的示例

比如:

#include<stdio.h>
#include<stdlib.h>
#include <stdint.h>

typedef uint32_t word;
#define word_length 32
typedef struct BigNumber {
  word words[4];
} BigNumber;

BigNumber number2;

enum states { STATE_0, STATE_1} current_state;
enum events { EVENT_A, EVENT_B } event;

void f1(void)
{
  int i;
  current_state = STATE_1;
  for (i=0; i<4; ++i) number2.words[i] = i;
}

void f2(void)
{
  int i;
  current_state = STATE_0;
  for (i=0; i<4; ++i) number2.words[i] = 42 + i*i;
}

void (*const state_table [2][2]) (void) =
{
    { f1 , f1 },
    { f2 , f2 }
};


int main (void){
  current_state = STATE_0;

  event = EVENT_A;
  state_table [current_state][event] (); /* call the action procedure */
  printf("%u %u %u %u\n", number2.words[0], number2.words[1], number2.words[2], number2.words[3]);

  event = EVENT_B;
  state_table [current_state][event] (); /* call the action procedure */
  printf("%u %u %u %u\n", number2.words[0], number2.words[1], number2.words[2], number2.words[3]);

  return 0;
}

您能在修改全局变量的地方添加实际代码段吗?您对将FSM表示为(2D)有严格要求吗指向函数的指针数组?我发现它非常复杂,您选择它肯定会从其他地方获得一些好处。@PopoviciSebi-不要添加代码作为注释。而是编辑您的问题,使代码成为问题本身的一部分。尝试提供一个生成问题的小而完整的示例,以便我们可以在自己的系统中重复它stem.@Remo.D这是我发现的最简单的模型之一…我需要一个rsa签名的状态机,在32位板上实现,我是这方面的新手。您的方法还可以,但您没有向我们展示足够的代码来帮助您。请尝试将您的代码转换为一个可以按原样编译的简短简化示例。也许您会发现错误,而我举一个简化的例子;-)您能在修改全局变量的地方添加实际的代码段吗?您对将FSM表示为(2D)有严格的要求吗指向函数的指针数组?我发现它非常复杂,您选择它肯定会从其他地方获得一些好处。@PopoviciSebi-不要添加代码作为注释。而是编辑您的问题,使代码成为问题本身的一部分。尝试提供一个生成问题的小而完整的示例,以便我们可以在自己的系统中重复它stem.@Remo.D这是我发现的最简单的模型之一…我需要一个rsa签名的状态机,在32位板上实现,我是这方面的新手。您的方法还可以,但您没有向我们展示足够的代码来帮助您。请尝试将您的代码转换为一个可以按原样编译的简短简化示例。也许您会发现错误,而我举个简单的例子;-)谢谢,我要试试这个模型,它看起来适合我需要的。谢谢,我要试试这个模型,它看起来适合我需要的。好的捕获-这可能是:-)我修改了增量(这里的复制粘贴错误),但问题出在状态机或全局内存上,因为如果我在状态内声明它们,它正在工作,但我需要下一个状态上的结构(修改)好的捕获-可能就是这样:-)我修改了增量(这里粘贴了错误的副本),但问题是在状态机或全局内存上,因为如果我在状态内声明它们,它正在工作,但我需要结构(修改)在下一个状态谢谢,我把所有的函数都放在这个较小的STM机器上,然后再复制粘贴回来,看起来它工作了,仍然不知道是什么问题,但现在它工作了