<分区>
当我从命令行运行包含具有以下代码的函数的可执行文件时,result[1] 仅在程序崩溃前打印两次(“*.exe 已停止工作”),即使blocklength 设置为 25。
当我双击运行完全相同的可执行文件时,程序崩溃而没有打印任何内容。 (但它一直运行到 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;
}