【发布时间】:2011-03-11 18:11:41
【问题描述】:
我在 C 中运行模拟,需要存储 3 个 100x100 矩阵 ~1000 次。当我不将数据写入文件时,我的程序运行得很好。但是当我运行我的程序并写入数据时,在大约 250 个时间步之后出现分段错误。我不明白为什么。
我的保存功能是这样的
void saveData(Simulation* sim, int number) {
sprintf(pathname_vx, "data/xvel%d.dat", number);
sprintf(pathname_vy, "data/yvel%d.dat", number);
sprintf(pathname_rho, "data/rho%d.dat", number);
FILE* vx_File = fopen(pathname_vx, "w");
FILE* vy_File = fopen(pathname_vy, "w");
FILE* rho_File = fopen(pathname_rho, "w");
int iX, iY;
double ux, uy, rho;
for (iY=0; iY<sim->ly; ++iY) {
for (iX=0; iX<sim->lx; ++iX) {
computeMacros(sim->lattice[iX][iY].fPop, &rho, &ux, &uy);
fprintf(vx_File, "%f ", ux);
fprintf(vy_File, "%f ", uy);
fprintf(rho_File, "%f ", rho);
}
fprintf(vx_File, "\n");
fprintf(vy_File, "\n");
fprintf(rho_File, "\n");
}
fclose(vx_File);
fclose(vx_File);
fclose(vy_File);
}
其中 'Simulation' 是一个包含 3 个不同变量 'rho'、'ux'、'uy' 的格子(100x100 矩阵)的结构。 'number' 参数只是一个用于正确命名文件的计数变量。
gdb 说了以下内容,但对我帮助不大。
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000010
0x00007fff87c6ebec in __vfprintf ()
我在编程方面没有那么丰富的经验,所以我想有更好的方法可以将数据写入文件。任何试图澄清为什么我的方法不起作用的尝试都受到高度赞赏。
谢谢
乔恩
【问题讨论】:
-
你能告诉我们究竟是哪条线路出了问题吗?
-
感谢大家的意见。正如 Elecric Wig 指出的那样,我的 fclose 语句中有一个明显的错误。抱歉问了一个愚蠢的问题。 j
标签: c gdb segmentation-fault printf