1

我有这个结构:

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 编译)。

4

2 回答 2

1

根据是否instrinstructionor的数组instruction *,您想要

instr[i].func(&instr[i]);

或者

instr[i]->func(instr[i]);

我怀疑您想要第一个(数组instruction),因为您将为此编译(在大多数编译器上带有警告);你只会得到函数中参数的垃圾。

但是,您得到的异常表明这不是您的问题——您func的数组中可能有一条带有 NULL 指针的指令。

编辑

看起来你正在犯经典while(!feof(input))错误——每当你看到这个,它几乎总是错的。

问题是,在您读取输入的最后一行之后,feof仍然会返回 false - 在您尝试读取 PAST 输入的结尾并收到 EOF 结果之前,它不会返回 true。因此,您将在输入代码结束后获得带有空行的循环的额外迭代,这可能会导致您看到的崩溃。

你可能想要的是类似的while (!(str = get_next_string()))东西while (!(str = fgets(buffer, sizeof(buffer), datafile)))

于 2012-07-09T03:03:24.737 回答
0

如果不查看其余代码很难判断,但错误 ( 0x00000000) 中列出的地址意味着数组中的函数指针之一是NULL.

您能否在遍历之前验证您的数组是否已正确初始化?

于 2012-07-09T02:56:00.550 回答