gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:54:04 26 4
gpt4 key购买 nike

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

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

  • FIRST_TABLE 当输入为 2 时(因此 ROW_SIZE = 1 x 2 )
  • SECOND_TABLE 当输入为 3 时(因此 ROW_SIZE = 1 x 3)
  • THIRD_TABLE 当输入为 4 时(因此 ROW_SIZE = 1 x 4)
  • FOURTH_TABLE 当输入为 5 时(因此 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 被创建为具有自 Action 用域的 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 .

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

A lookup table is simply an initialized array that contains precalculated information. They are typically used to avoid performing complex (and hence time consuming) calculations.
...and more on tables From A tutorial on lookup tables in C.

考虑到这一点,我不知道打算如何使用您的查找表,但考虑到您的需求描述,其中包括不同大小的表,以及需要动态访问它们,下面说明了一种方法,其中使用 static const int 数组(不同大小)和指向数组的指针创建表集合而不是 #defines:int *[],其中大小 == 集合中表的数量,可以通过普通数组索引轻松访问。

下面的实现如上所述,并演示了一种可用于根据输入参数自动选择查找表的方法。

// 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

关于c - 根据输入参数自动选择查找表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51746137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com