我是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并在知道输入值时自动选择查找表。例如,如果输入= 2,则应自动选择ROW_SIZE = 2并选择FIRST_TABLE。 请注意,“ input”值是来自不同源文件的外部参数。
答案 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");
}