马尔可夫链(Windows上的c代码失败)

时间:2016-07-15 07:57:34

标签: c markov-chains

我正在尝试从Kernighan的书“我的工作站上的编程实践”(Windows 7 + vs2015社区版)中获取这段代码

我收到一个奇怪的错误。

void generate(int nwords) {
    State *sp;
    Suffix *suf;

    char *prefix[NPREF];
    char *w = NULL;

    int i, nmatch;

    for (i = 0; i < NPREF; i++)
        prefix[i] = NONWORD;

    for (i = 0; i < nwords; i++) {
        sp = lookup(prefix, 0);
        nmatch = 0;

        for (suf = sp->suf; suf != NULL; suf = suf->next) {
            if (rand() % ++nmatch == 0) {
                w = suf->word;
            }
            if (nmatch == 0)
                printf("internal error: no suffix %d %s", i, prefix[0]);
            if (strcmp(w, NONWORD) == 0)
                break;

            printf("%s ", w);

            memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));

            prefix[NPREF - 1] = w;
        }   
    }
}

for(suf = sp-&gt; suf; suf!= NULL; suf = suf-&gt; next)

  

CompareCandCsharp.exe中0x000000013F5C1564处的未处理异常:   0xC0000005:访问冲突读取位置0x0000000000000010。

我的实施与此处描述的类似 - Working with arrays and reading text files

似乎算法有效 - 但在我的电脑上失败了。我无法为此找到满意的内容。你能否提出你的建议。

1 个答案:

答案 0 :(得分:0)

经过几个小时的调试后,我发现了预期方法中的一个小错误。

  for (suf = sp->suf; suf != NULL; suf = suf->next) {
        if (rand() % ++nmatch == 0) {
            w = suf->word;
        }

如果在这一行中没有括号,那么方法中的所有其他代码尝试多次设置w,当然它会导致内存错误=)。 Thanx在阅读之前将我的问题缩小了=))