我有这个结构:
typedef struct {
void (*func)(instruction);
union {
double db;
char ch;
};
} instruction;
在我的源文件中,我有一系列这些说明。我的问题是,我将如何遍历该数组并执行每个结构的函数?
我以为我知道怎么做,但是指令函数有一个参数是一个指令的事实似乎会导致问题。因此,这不起作用:
int i;
for (i = 0; i <= instr_count; i++) {
(*instr[i].func) (instr[i]);
}
instr是指令数组。
这是填充数组的函数。数组本身在文件的顶部声明。
void read_instructions()
{
char* str;
char *instruct;
int n;
char c;
instruction next = {0};
while (!feof(datafile)) {
// Fetch the next string
// if (push or pop), get the next argument
// create instructiwn and add to instruction array
str = get_next_string();
instruct = strtok (str, " ");
if (strncmp (instruct, "P", 1) == 0) {
char *arg = strtok (NULL, " ");
if (strncmp (str, "PUSH", 4) == 0) {
next.func = pushFunc;
}
else {
next.func = popFunc;
}
n = arg[0];
if (n > 64 || n < 71)
next.ch = n;
else {
double n;
scanf ("%lf", arg, n);
next.db = n;
}
instr[instr_count] = next;
instr_count++;
}
else {
c = instruct[0];
switch (c) {
case 'A' :
next.func = addFunc;
break;
case 'S' :
next.func = subFunc;
break;
case 'M' :
next.func = multFunc;
break;
case 'D' :
next.func = divFunc;
break;
default :
break;
}
instr[instr_count] = next;
instr_count++;
}
}
fclose (datafile);
}
作为一个快速解释,此代码采用“中间代码”文件,确定指令,并为每个包含正确函数指针的指令构造。
运行代码会给我这个运行时错误:
“Interpreter.exe中0x00000000处的未处理异常:0xC0000005: 访问冲突。“(使用VS 2010编译)。
答案 0 :(得分:1)
根据instr
是instruction
还是instruction *
的数组,您需要
instr[i].func(&instr[i]);
或
instr[i]->func(instr[i]);
我怀疑你想要第一个(instruction
数组),就像你将要编译的那样(在大多数编译器上都有警告);你只会为函数中的参数获取垃圾。
你得到的异常表明这不是你的问题,但是你可能在数组中有一个带有NULL func
指针的指令。
修改
看起来你正在制作经典while(!feof(input))
错误 - 每当你看到它时,它几乎总是错误的。
问题是,在你读完输入的最后一行之后,feof
仍将返回false - 直到你试图读取PAST结束输入时才会返回true EOF结果。因此,在输入代码结束后,您将获得一个额外的循环迭代,并显示空白行,这可能会导致您看到崩溃。
您可能想要的是while (!(str = get_next_string()))
或while (!(str = fgets(buffer, sizeof(buffer), datafile)))
答案 1 :(得分:0)
在不查看其余代码的情况下很难判断,但错误(0x00000000
)中列出的地址意味着数组中的一个函数指针为NULL
。
您可以在浏览阵列之前验证阵列是否已正确初始化了吗?