【问题标题】:How to set a bitfield in a specific order and check later against the order如何按特定顺序设置位域并稍后检查该顺序
【发布时间】:2018-08-22 12:55:13
【问题描述】:

假设我在一个系统中有 3 个可以调用或不调用的函数。 稍后在我的算法中(参见下面的“myMainFunction()”),我很想知道是否调用了所有函数。

实际上,为了跟踪我的函数是否被调用,我使用了一个设置 16 位域的辅助函数:

static void SetBitField(u16 p_Bitfield, u8 Bit)
{
   u16 tmp_Bitmask;

   tmp_Bitmask = (u16)((u16)(1) << (u16)(Bit));

   *p_Bitfield |= tmp_Bitmask;

}

现在在我的函数中,我正在执行以下操作:

static u16 BitMask;

#define SHIFT_0     0
#define SHIFT_1     1
#define SHIFT_2     2

#define MASK        7

fun1()
{
/*doing some stuff*/

SetBitField(&BitMask,SHIFT_0)

}

fun2()
{

/*doing some stuff*/

SetBitField(&BitMask,SHIFT_1)
}

fun3()
{

/*doing some stuff*/

SetBitField(&BitMask,SHIFT_2)
}

现在在主函数中,我可以检查是否调用了所有函数

    myMainFunction()
    {

    /*doing some stuff*/

    if ((BitMask & MASK) == MASK)
    {
        /*all functions are called*/
    }

    /*doing some stuff*/
}

到目前为止还不错。但最后,无论函数调用的顺序如何,我都会得到相同的 BitMask。 但是如何修改 SetBitField() 函数,以便以后检查我的函数是否按特定顺序调用。 例如检查是否调用了 func1() --> func2() --> func3() 而不是例如 func2() --> func1() --> func3()?

有什么想法吗?

【问题讨论】:

  • 您需要将该信息存储在某处。创建单独的多个位域并存储位域历史,有一个位域数组来存储哪个函数首先运行,分配一个字符串来存储函数名。
  • 这对我来说就像一个XY problem为什么您需要按特定顺序调用函数?你想通过这个解决的实际问题是什么?如果你正在编程,为什么不能确保函数按照你想要的顺序被调用?
  • 可能使用一些日志记录?如果你只有 3 个函数,你可以设置最高位,然后右移 SHIFT_X 次,然后你就可以解码了,
  • 除了上述 cmets 之外,这似乎可以通过 gdb 轻松完成,而且总的来说它是学习如何使用的好工具。我会推荐。
  • @perreal 你可以在上面的例子中展示这个吗?

标签: c


【解决方案1】:

“您无法通过查看轨道知道火车的行驶方向”,您也无法通过查看位知道函数的调用顺序。他们只会告诉你函数被调用了,但不会告诉你调用的顺序。

但是,以下是:

struct BITMASK {
    unsigned int b1:3;
    unsigned int b2:3;
    unsigned int b3:3;
    unsigned int b4:3;
    unsigned int b5:3;
    unsigned int b6:3;
    unsigned int b7:3;
} myBits;
int counter;

static void SetBitField(u8 Bit)
{
    switch (Bit) {
    case 0: myBits.b1= ++counter; return;
    case 1: myBits.b2= ++counter; return;
    case 2: myBits.b3= ++counter; return;
    case 3: myBits.b4= ++counter; return;
    case 4: myBits.b5= ++counter; return;
    case 5: myBits.b6= ++counter; return;
    case 6: myBits.b7= ++counter; return;
    }
}

所以这里你使用三位(最多七个函数调用)来保存一个数字,它是调用的顺序。

【讨论】:

    【解决方案2】:

    给定 3 个函数和移位值 (1, 2, 3)。

    如果您在函数调用时应用此规则:

    • 设置最高有效位,然后按相应的值右移。

    对于给定的(订单),你会得到[这些位]:

    (1, 2, 3) [0, 0, 0, 1, 0, 1, 1, 0]
    (1, 3, 2) [0, 0, 1, 0, 0, 1, 1, 0]
    (2, 1, 3) [0, 0, 0, 1, 1, 0, 1, 0]
    (2, 3, 1) [0, 1, 0, 0, 1, 0, 1, 0]
    (3, 1, 2) [0, 0, 1, 1, 0, 0, 1, 0]
    (3, 2, 1) [0, 1, 0, 1, 0, 0, 1, 0]
    

    为示例目的生成位的 python 脚本:

    import itertools                             
    
    def mark(v, x):                              
      v[0] = 1                                   
      v = [0] * x + v[:-x]                       
      return v                                   
    
    for x in itertools.permutations([1,2,3]):    
      v = [0] * 8                                
      for xx in x:                               
        v = mark(v, xx)                          
      print x, v                                 
    

    【讨论】:

    • 感谢您的提示!最后,它比我想象的要容易。
    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 2012-02-01
    • 1970-01-01
    • 2021-10-16
    • 2023-02-09
    • 1970-01-01
    相关资源
    最近更新 更多