c - 根据输入参数自动选择查找表
问题描述
我是一个 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 并在输入值已知时自动选择查找表。例如,如果 input = 2,它应该自动选择 ROW_SIZE = 2 并选择 FIRST_TABLE。 请注意,“输入”值是来自不同源文件的外部参数。
解决方案
照原样,您的两个宏只能在运行时之前定义。即在编译时,定义宏的值被锁定。
为了让您的宏产生变量值,请更改:
#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");
}
推荐阅读
- django - 在 django rest framewrok 中获取文件参数(大小,文件名)
- amazon-web-services - AWS Kinesis Firehose 转换 Lambda 权限
- docker - 如何在 Bitbucket Pipelines 中运行的 Docker 容器中使用 sbt 和 ivy2 缓存
- django - 如何将更改保存到 docker
- selenium - 如何在不使用 Headless 的情况下在 Jenkins 上运行我的自动化(测试)
- python - 如何控制根节点中惰性约束的数量?
- reporting-services - 如何始终显示每个月的第二个日期?
- java - 将一个 JKS 文件导入另一个会导致 java.security.UnrecoverableKeyException:无法恢复密钥
- string - SpringBoot @RequestParam MultipartFile 将在字符串连接中翻译@RequestParam String
- c# - 可以在没有构造函数中引用的情况下实例化已注册的注入类吗?