#include <stdlib.h> #include <stdio.h> #include <math.h> FILE *output; int numx = 100; int numy = 100; int numz = 100; int numt = 20000; int i = 0, j = 0, k = 0, m = 0; double x = 0.0, y = 0.0, z = 0.0, t = 0.0; double space_step = 20 / (numx); double time_step = 0.002; double C_coef = time_step / pow(space_step,2); void boundary(){ double C[numx][numy][numz]; for(k = 0; k < numz; k++){ for(i = 0; i < numx; i++){ C[i][0][k] = 0.1; C[i][numy-1][k] = 0.1; C[0][i][k] = 0.1; C[numx-1][i][k] = 0.1; for(j = 0; j < numy; j++){ C[i][j][numz-1] = 0.1;} } } } int main (){ double C[numx][numy][numz]; double New_C[numx][numy][numz]; double C_diffuse; output = fopen("C_3d.txt", "w"); for(i = 0; i < numx; i++) for(j = 0; j < numy; j++) for(k = 0; k < numz; k++){ C[i][j][k] = 0; C[numx/2][numy/2][0] = 100; } for(m = 0; m < numt; m++){ for(i = 1; i < numx-1; i++) for(j = 1; j < numy-1; j++) for(k = 1; k < numz-1; k++){ C_diffuse = C_coef * (C[i+1][j][k] + C[i-1][j][k] +\ C[i][j+1][k] + C[i][j-1][k] +\ C[i][j][k+1] + C[i][j][k-1] - 6 * C[i][j][k]); New_C[i][j][k] = C[i][j][k] + C_diffuse; } for(i = 1; i < numx-1; i++) for(j = 1; j < numy-1; j++) for(k = 1; k < numz-1; k++){ C[i][j][k] = New_C[i][j][k]; } boundary(); C[numx/2][numy/2][0] = 100; } for(i = 0; i < numx; i++) for(j = 0; j < numy; j++) for(k = 0; k < numz; k++){ x = i * space_step; y = j * space_step; z = k * space_step; t = m * time_step; fprintf(output, "%f\t%f\t%f\t%f\t%f\n", t, x, y, z, C[i][j][k]); } fflush(output); fclose(output); return 0; }
算是一个比较简单的三维扩散计算,为什么运行时会显示程序停止工作?
是溢出了吗?
小白一个,还请各位指点一下。(本人用codeblocks编写的程序)
解决方案
10
double C[numx][numy][numz];中8*100*100*100是不是有点大了,是约8M空间吗?(呵呵,不太清楚,是不是这样计算的)如是的话,局部变量申请这大,运行时,肯定过不了吧
10
出错时点中断,通过调用堆栈、变量窗口等观察分析出错原因,必要时单步跟踪程序运行,特别注意检查能否越界
20
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
代码功能归根结底不是别人帮本人看或讲解或注释出来的;而是被本人静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生本人领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
代码功能归根结底不是别人帮本人看或讲解或注释出来的;而是被本人静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生本人领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
70
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。