根据输入参数自动选择查找表

时间:2018-08-08 11:57:33

标签: c macros

我是C新手,我在头文件中存储了一些需要在C程序中使用的查找表。 例如,我正在使用

static int LookupTable[ROW_SIZE][COL_SIZE] = FIRST_TABLE;
static int LookupTable[ROW_SIZE][COL_SIZE] = SECOND_TABLE;
static int LookupTable[ROW_SIZE][COL_SIZE] = THIRD_TABLE;
static int LookupTable[ROW_SIZE][COL_SIZE] = FOURTH_TABLE;

我为ROW_SIZE和COL_SIZE定义了宏,其中COL_SIZE是固定的,而ROW_SIZE是可变的。

#define COL_SIZE    2     
#define ROW_SIZE    2       //<! 1 x input (where input = {2,3,4,5})

我需要根据输入值使用查找表。也就是说,使用:

  • 输入为2时FIRST_TABLE(因此ROW_SIZE = 1 x 2)
  • 当输入为3时SECOND_TABLE(因此ROW_SIZE = 1 x 3)
  • 输入为4时THIRD_TABLE(因此ROW_SIZE = 1 x 4)
  • 输入为5时,FOURTH_TABLE(因此ROW_SIZE = 1 x 5)

当前,我每次都会根据输入值并使用相应的查找表来手动更新ROW_SIZE,如下所示。

#include<stdio.h>
#define FIRST_TABLE \
{ \
{1,2},\
{3,4}\
}

#define SECOND_TABLE \
{ \
{1,2},\
{11,22},\
{3,4}\
}

#define THIRD_TABLE \
{ \
{1,2},\
{11,22},\
{21,31},\
{3,4}\
}

#define FOURTH_TABLE \
{ \
{1,2},\
{10,20},\
{30,40},\
{50,60},\
{3,4}\
}


#define ROW_SIZE    2       // 2->FIRST_TABLE, 3->SECOND_TABLE, 4-> THIRD_TABLE, 5->FOURTH_TABLE
#define COL_SIZE    2
int main()
{

    static int LookupTable[ROW_SIZE][COL_SIZE] = FIRST_TABLE;
    //static int LookupTable[ROW_SIZE][COL_SIZE] = SECOND_TABLE;
    //static int LookupTable[ROW_SIZE][COL_SIZE] = THIRD_TABLE;
    //static int LookupTable[ROW_SIZE][COL_SIZE] = FOURTH_TABLE;

    int i,j;

    for(i=0;i<ROW_SIZE;i++)
    {
        for(j=0;j<COL_SIZE;j++)
        {
            printf("%d\t",LookupTable[i][j]);
        }
        printf("\n");
    }
    return 0;
}

有人可以建议我如何定义ROW_SIZE并在知道输入值时自动选择查找表。例如,如果输入= 2,则应自动选择ROW_SIZE = 2并选择FIRST_TABLE。 请注意,“ input”值是来自不同源文件的外部参数。

1 个答案:

答案 0 :(得分:2)

两个宏都只能在运行时之前定义。也就是说,在编译时,定义宏的值已锁定。

要让您的宏产生一个变量值,请更改:

#define ROW_SIZE    250     //<! 25 x parameter (where parameter = {10,15,20,25,...,100})

收件人:

#define ROW_SIZE(x)    25*(x)     //<! 25 x parameter (where parameter = {10,15,20,25,...,100})

然后在调用代码中,应在调用宏的范围内定义x。在此示例中,x被创建为具有自动范围的int [4]数组。只要定义,它可以是全局的,也可以作为函数参数传递:

int i, x[4]={10,15,20,25};
for(i=0;i<4;i++)
{
    //select and use lookup
    LookupTable[ROW_SIZE(x[i])][COL_SIZE];// Each iteration is expanded to
                                          // LookupTable[25*x[i]][COL_SIZE];

    ...

有关更多信息,请参见 C macros tutorial

编辑 以解决评论中的请求:

  

查找表只是一个初始化的数组,其中包含   预先计算的信息。它们通常用于避免执行   复杂(因而费时)的计算。
  ...以及有关表 From A tutorial on lookup tables in C 的更多信息。

考虑到这一点,对于打算如何使用您的查找表,我太多了,但是给出了您的需求说明,其中包括大小不同的表以及需要动态访问它们,下面说明一种方法,其中使用static const int(大小可变)数组和指向数组的指针创建表的集合,而不是#defines,其中,int *[],其中size == 集合中表的数量,只需通过常规数组索引即可访问。

以下是如上所述实现的,并演示了可用于基于输入参数自动选择查找表的方法。

// define in header file 

//replaces your #define tables
static const int table1[1][2] = {1,2};
static const int table2[2][2] = {{1,2},{3,4}};
static const int table3[3][2] = {{1,2},{11,22},{3,4}};
static const int table4[4][2] = {{1,2},{11,22},{21,31},{3,4}};
static const int table5[5][2] = {{1,2},{10,20},{30,40},{50,60},{3,4}};

#define MAX_TABLES 5

//array of pointers to allow lookup table selection via array indexing.
//( static scope necessary if table is used in more than one .c file )
static int *table[MAX_TABLES] = {(int *)table1, (int *)table2, (int *)table3, (int *)table4, (int *)table5};


// end - define in header file

void access_table(int table);

int main(void)
{

    int i;
    for(i=0;i<MAX_TABLES;i++)
    {
        access_table(i);//select lookup tables based on input parameter ( i )   
    }
    getchar();
    return 0;

}

void access_table(int index) // view contents of the selected table
{
    //by definition all tables have rows  equal to table number and columns always == 2
    int loops = 2*index+2;
    int j;
    for(j=0;j<loops;j++)
    {
        printf("%d ", table[index][j]);
    }
    printf("\n");
}

产生以下输出:
enter image description here