好的,所以我试图用c中的三维int数组制作直方图。 这是我编辑数组的行;
buckets[(int)floor(x/splits)][(int)floor(y/splits)][(int)floor(z/splits)]++;
x,y,z在程序的早期生成(这是一个循环),分组被要求作为用户的输入。然后我尝试将这些数据放入直方图中,编译器给我一个非法指令。
histogram[(int)buckets[i][j][k]]++;
我很确定它就在这里,因为我把打印语句放在程序中,直到这一点才开始工作,而不是在后面。这是所有的相关代码。
ff=fopen(fname,"r");
int buckets[split][split][split];
splits = (double) 1/split;
for(i=0; i<split; i++){
fscanf(ff,"%lf",&x);
fscanf(ff,"%lf",&y);
fscanf(ff,"%lf",&z);
buckets[(int)floor(x/splits)][(int)floor(y/splits)][(int)floor(z/splits)]++;
fclose(ff);
}
int histogram[10];
for (i=0; i<split; i++) {
for (j=0; j<split; j++){
for(k=0;k<split;k++){
histogram[(int)buckets[i][j][k]]++;
}
}
}
答案 0 :(得分:1)
定义数组时:
int buckets[split][split][split];
您不会使用以下内容对其进行初始化:
memset(buckets, 0x00, sizeof(int) * split * split * split);
因此桶中的值不明。然后你增加这些数字,但是当你这样做时:
histogram[(int)buckets[i][j][k]]++;
buckets[i][j][k]
可以等于任何东西。解决方法是在数组声明后添加memset()。
答案 1 :(得分:0)
请在运行时分享变量的实际值(使用gdb) - split,x,y,z和split。
如果您最初看到正确的值并突然看到异常,那么您可能会遇到堆栈溢出。所以尝试使用动态内存分配(使用堆)。请尝试使用valgrind来检测任何内存泄漏。