最多只能打印数组的条目两次
Only able to print entry of an array at most twice
当我从命令行运行包含以下代码的函数时结果[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];
这样的行,那么你访问的值根本不在数组中。
或者更一般的:如果输入错误,程序就会崩溃。您必须确保没有超出数组容量的值被访问,这应该在访问它的行/循环中完成,而不是在其他地方。
在这种情况下,您必须确保结果容量至少为blocklength+1
相关文章:
- 我的字符串数组一次打印出前两个字符串
- 为什么我的串行串行在Arduino IDE上通过串行显示器进行两次打印
- 我正在计算的序列(Hailstone)需要打印一次时两次打印
- 为什么在打印消息时名称会打印两次?
- 为什么我的代码两次打印相同的命令行参数
- 如何防止字符在 for 循环中打印两次?C++
- 为什么这个程序打印"nine"两次?
- 为什么我的cout打印两次
- 为什么传入的字符串在打印两次以上时会有所不同
- C++ cout 打印两次在循环中做
- c++While循环打印couts两次
- 为什么继承值打印两次
- "print 1 to n"函数打印 1 两次
- 尝试从输入文件打印,但打印最后一个输入两次
- 最后一行打印两次(C++)
- c++输入验证打印两次
- 从输入中读取单词序列。使用"Quit"终止,按输入顺序打印,不要打印两次单词。
- 如果不使用 pthread_join(),为什么'cout'语句从特定线程打印两次(即使它是同步的)?
- 我如何打印4个不同字母组合成2个字母对的所有方式来填充4个位置,每个字母正好出现两次
- Printf由于某种原因打印两次,cout似乎没问题