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

Only able to print entry of an array at most twice

本文关键字:两次 打印 数组      更新时间:2023-10-16

当我从命令行运行包含以下代码的函数时结果[1]在程序崩溃之前只打印两次(" *.exe已停止工作"),即使块长度设置为25。

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

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

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

当我使用GNU项目调试器(GDB)一步一步地通过程序时,它打印出结果[1] 25次并且没有崩溃。

显然,原来的for循环不仅仅是一遍又一遍地打印相同的值,但我把问题缩小到这个,现在我完全卡住了,很困惑。

我将非常感谢任何帮助或输入。

下面是完整的代码,result在main函数中定义为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]初始化后不读写

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到arraylength -1之间。

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

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