使用枚举访问2D数组索引

时间:2019-05-08 13:53:36

标签: c multidimensional-array enums

我没有机会尝试这个,而我对C的理解充其量只是业余。我发现与这个问题最接近的是c ++,但处理的是固定的枚举值。

假设您有一个像这样动态分配的2D整数数组:

4x4

0 0 0 0
0 0 0 0         
0 0 0 0   
0 0 0 0

是否可以使用枚举为每个列和行分配动态名称,然后按名称访问这些行和列?

赞:

        apples   bread   carrot   dinosaur  
apples    0        0       0         0  
bread     0        0       0         0  
carrot    0        0       0         0   
dinosaur  0        0       0         0 

允许我做这样的事情:

matrix[apples][bread] += 1;

编辑 当我说“动态”时,我的意思是当在运行时编译一个没有固定大小的值时。因此,一次运行时矩阵可以是2x2或82x82,而enum的值可以是apple,bear或apple,bear,泰迪等。

3 个答案:

答案 0 :(得分:3)

C是a statically typed language,并且您不能在运行时将变量名添加到程序中。这也包括枚举。诸如std::map之类的哈希表可以用于您的目的,但是C没有提供这种类型,因此您必须自己实现它。

答案 1 :(得分:3)

是的,您可以使用枚举为每个索引创建符号常量:

enum { apples, carrot, bread, dinosaur };

您还可以使用常规变量:

const int apples   = 0;
const int carrot   = 1;
const int bread    = 2;
const int dinosaur = 3;

您还可以使用预处理器:

#define APPLES   0
#define CARROT   1
#define BREAD    2
#define DINOSAUR 3

不能要做的是在运行时创建所有这些东西。如果您决定在运行时 创建5x5数组,则也无法创建新的符号常量(通过enum,变量或宏)。那只能在编译时完成。

编辑

可以做的是创建某种关联数据结构(映射或查找表),该结构将字符串与整数值相关联,然后您可以执行以下操作……

Some_Map_Type map;
...
addIndex( map, "apples", 0 );
addIndex( map, "carrot", 1 );
addIndex( map, "bread", 2 );
addIndex( map, "dinosaur", 3 );
...
do_something_with( matrix[getIndex(map, "apples")][getIndex(map, "bread")] );

,然后在运行时提示输入新的索引名称和值,例如:

printf( "Gimme a new index: " );
scanf( "%s %d", name, &value ); // doing it this way *just* for brevity - don't actually do it like this
addIndex( map, name, value );
...
do_something_with( matrix[getIndex(map, name)][getIndex(map, "bread")] );

这对您来说可能值得也可能不值得。

答案 2 :(得分:1)

C中的Enum只不过是名称和整数之间的映射。所以你可以做类似的事情

enum Fruit{apple, orange, banana};
array[apple][banana] = 1;

但是,就像它的名称一样,您必须先枚举它,然后再使用它。因此,不可能在运行时添加一个。 不过,有些地图结构可能会起作用。