我有一个大的全局数组,我在其中不断更改某些值,这些值在编译时用于不同目的需要更改表。基本上该表作为核心结构并且基于不同目的可以从其添加/移除附加值。 这些值有点像:
int global_array[] =
{
...
6, 6, 78, 9,
12,
13,5
19,
47, 768, 98, 89
...
};
我需要访问这些表中的一些核心结构值(在这里说“12”)。因此,在为不同目的进行编译时,有关值(“12”)的索引会发生变化。出于同样的原因,我无法将此表保留为结构。请记住,这是一个巨大的表格,由于某种原因,我们不会以统一的方式编写值(读取线性)。
因此,对于每个新目的,我必须手动计算值“12”的索引,这是乏味的。我想要一个面向未来的过程。
我想知道我是否可以使用类似的东西:
int global_array[] =
{
...
6, 6, 78, 9,
INDEX: 12,
13,5
19,
47, 768, 98, 89
...
};
并在运行时访问/修改值,如下所示:
*(uint8 *)INDEX = 20;
答案 0 :(得分:2)
您可以将该点周围的其他指针变量保留到特定条目。只要需要,您可以调整指针指向的数组条目。
示例:
#include <stdio.h>
int global[] = {1,2,3,4,5,6,7};
int *idx = &global[0];
int main() {
*idx = 20;
printf("%d\n", *idx);
return 0;
}
或者,您可以使用预处理器宏(如果引用的位置在编译时已知并且不会更改):
#include <stdio.h>
int global[] = {1,2,3,4,5,6,7};
#define INDEX (global[0])
int main() {
INDEX = 20;
printf("%d\n", INDEX);
return 0;
}
鉴于你只需要在程序启动时执行一次,也许你只需要一个为你计数的函数。
示例:
#include <stdio.h>
int global[] = {1,2,3,4,5,6,7};
int find_index(int value, int *array, size_t size) {
for (int i = 0; i < size; i++)
if (array[i] == value)
return i;
return -1;
}
int main() {
int value = 4;
int index = find_index(value, global, sizeof(global)/sizeof(*global));
printf("index of %d: %d\n", value, index);
return 0;
}
这是输出:
$ gcc tt.c -std=c99 && ./a.out
index of 4: 3
如果需要在应用程序的整个运行时间内跟踪大量条目的位置,则应考虑使用键值存储(例如,二进制搜索树)来跟踪值&#39;指数。然后,您应该使用封装更新和检索操作的特殊方法,这些方法还将调整存储在&#34; index&#34;中的索引。数据结构。
答案 1 :(得分:0)
来自ISO / IEC9899:
6.8.6.1 goto语句
约束
1 goto语句中的标识符应将名称命名为位于封闭函数中的某个位置。
goto语句不得从具有标识符的范围之外跳转 在该标识符范围内的可变修改类型。
由于全局aray不在封闭函数中,因此不允许这样做!
答案 2 :(得分:0)
C没有提供任何语法来做你想做的事。
解决这个问题的一种方法就是让你的工具完成计数,这样你就不必为每次改变计算一些东西。毕竟,机器擅长计算东西。例如,您可以在初始化程序中使用特殊注释标记有趣的帖子,即
int global_array[] =
{
6, 6, 78, 9,
12, /* INDEX12 */
13,5,
19,
47, 768, 98, 89
...
};
然后通过计算声明开头的逗号减1来找到数组元素的索引。将结果转换为-DINDEX12=42
的编译时宏,等等!您只需要了解声明的开始位置(将其置于单独的头文件中是简单的路径),然后运行,例如
$ awk '/global_array/,/INDEX12/ { commas += gsub(/,/, ",") }
END {print "-DINDEX12=" commas - 1}' file.h
-DINDEX12=4
这很容易扩展到处理任意数量的INDEXNNN
宏。请注意最后一个数组初始化程序(在您的代码段中没有逗号,但C 允许它...)的可能性。
将此预处理放在一个紧凑的Makefile
左侧作为练习。