我没有机会尝试这个,而我对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,泰迪等。
答案 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;
但是,就像它的名称一样,您必须先枚举它,然后再使用它。因此,不可能在运行时添加一个。 不过,有些地图结构可能会起作用。