首页 > 解决方案 > 根据输入参数自动选择查找表

问题描述

我是一个 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})

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

目前,我每次都根据输入值手动更新 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 并在输入值已知时自动选择查找表。例如,如果 input = 2,它应该自动选择 ROW_SIZE = 2 并选择 FIRST_TABLE。 请注意,“输入”值是来自不同源文件的外部参数。

标签: cmacros

解决方案


照原样,您的两个宏只能在运行时之前定义。即在编译时,定义宏的值被锁定。

为了让您的宏产生变量值,请更改:

#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 宏教程

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

查找表只是一个包含预先计算的信息的初始化数组。它们通常用于避免执行复杂(因此耗时)的计算。
...以及更多关于表格的内容来自 A tutorial on lookup tables in C

考虑到这一点,我不知道打算如何使用查找表,但考虑到您的需求描述,其中包括不同大小的表,以及动态访问它们的需要,下面说明了一个方法,而不是#defines,使用数组创建表集合static const int,(不同大小)和指向数组的指针: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");
}

产生以下输出:
在此处输入图像描述


推荐阅读