-5

我现在在下面清楚地解释了这个问题:

最初,我正在处理一个 16X32 字节矩阵的偏移量,该矩阵将在下面的函数中应用。下面的函数是我正在做的事情的简化形式,因为这将使我清楚地知道我在这里尝试做什么。

偏移量:0、8、16、24、32、40、48、56 在位置 0、1、2、3、4、5、6、7 垂直。

所以,我将它们定义为宏:

#define X1 0 * 8
#define X2 1 * 8
#define X3 2 * 8
............
#define X7 7 * 8

简化代码:(实际上使用上述所有偏移量,并有3个不同的函数使用这些偏移值来确定一些东西。但只在下面演示了一个,因为这应该足够了)

function(uint8 *ubase)
{
    if (((*(ubase + X3)) - *((ubase + X7))) != 
    (*((ubase + X2)) - *((ubase + X6)))  
    and so on ....)
    {
        Statements1;
        Statements2;
    }
    else
    {
        Statements3;
        Statements4;
    }            
}

现在,我需要根据标志应用不同的偏移量。即如果 bool bType 为 TRUE,则使用上面的偏移量,否则使用不同的集合。幸运的是,将要应用的较新集合只是上面每个偏移值的 2 *。

我知道只有当我们需要在程序中多次使用常量时才会使用宏。

一种方法如下:

由于较新和较旧的偏移量具有相似性,因此我仍然可以保留宏部分并检查简化代码中的条件,例如

if ((*((ubase + (X3 * (TRUE == bType ? 0 : 2)))))...........)

但是,正如我上面提到的,有多次出现偏移,并且执行上述方式意味着需要在所有出现的情况下检查条件。由于大约有 20 次这样的事件,想知道这样做是一个好习惯。

上述方法是解决偏移处理问题的好方法吗?

提前致谢。

4

1 回答 1

1

这个?

#include <stdio.h>

int main(void)
{
    int set1[] = {0 << 0, 8 << 0, 16 << 0, 32 << 0, 48 << 0};
    int set2[] = {0 << 1, 8 << 1, 16 << 1, 32 << 1, 48 << 1};
    int i;

    for (i = 0; i < 4; i++) {
        printf("%d %d\n", set1[i], set2[i]);
    }
    return 0;
}
于 2013-06-18T18:05:59.123 回答