最多只能打印数组的条目两次

Only able to print entry of an array at most twice

当我 运行 包含具有以下代码的函数的可执行文件从命令行 result[1] 仅在程序崩溃前打印两次 (" * .exe 已停止工作"),即使 blocklength 设置为 25。

当我 运行 双击完全相同的可执行文件时,程序崩溃而没有打印任何内容。 (但它 运行s 直到 for 循环之前)

result是一个类型为double,长度为blocklength的数组,传递给函数作为参数。

for (int i = 0; i < blocklength; i++) {
    cout << result[1] << endl;
}

当我使用 GNU 项目调试器 (GDB) 逐步执行程序时,它打印了 result[1] 25 次并且没有崩溃。

显然,原始的 for 循环不仅仅是一遍又一遍地打印相同的值,但我将问题缩小到这一点,现在完全陷入困境和困惑。

非常感谢任何帮助或意见。

这里是完整代码,result在主函数中定义为double* result = new double[blocklength]并立即传递给函数:

void entropy(char* input, int l_input, double* result, int blocklength, char order)
{
    int l_counter = pow(order, blocklength);
    int* counter = new int[l_counter];
    double prob = 0;
    int max_counter = 1;
    int* temp = new int[l_input];

    for (int i = 0; i < l_input; i++) {
        temp[i] = 0;
    }

    for (int s = 1; s <= blocklength; s++)
    {
        max_counter *= order;

        // reset counter
        for (int i = 0; i < max_counter; i++) {
            counter[i] = 0;
        }

        // init result
        result[s] = 0;


        for (int b = 0; b < l_input + 1 - s; b++) {
            temp[b] = order * temp[b] + input[b - 1 + s];
            counter[temp[b]]++;
        }

        for (int b = 0; b < max_counter; b++) {
            prob =  counter[b] / (double)(l_input - s + 1);
            if (prob != 0)
            {
                result[s - 1] = result[s - 1] + fabs(prob * log(prob));
            }
        }

        std::cout << "Block " << s << " okay" << std::endl;
    }

    cout << "sum done" << endl;

    for (int i = 0; i < blocklength; i++)
    {
        cout << result[1] << endl;
    }

    std::cout << "Entroyp done!" << std::endl;
}

您的代码有两处似乎有问题。 结果[s]初始化后不是read/written。

result[s] = 0; 

访问的是结果[s-1]。

result[s - 1] = result[s - 1] + fabs(prob * log(prob));

这意味着 result[0] 永远不会被设置为 0。这也意味着 result[blocklength] = 0 将被分配但永远不会被使用。

如果您的代码中有像 int* result = new int[blocklength]; 这样的行,那么您访问的值根本不在您的数组中。有效索引介于 0 和 arrayLenght-1 之间。

或更一般的: 如果您的输入错误,您的程序就会崩溃。您必须确保没有访问超出数组容量的值,这应该在访问它的 line/loop 中完成,而不是在其他地方。

在这种情况下,您必须确保结果容量至少为 blocklength+1。