2011-03-11 31 views
1

我在C中运行模拟,需要存储3个100x100矩阵〜1000次。当我不将数据写入文件时,我的程序运行得很好。但是,当我运行我的程序并写入数据时,经过250个时间步后,出现分段错误。我不明白为什么。fprintf问题

我保存函数看起来像这样

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); 
} 

其中 '模拟' 是含有晶格(100×100矩阵)与3个不同的变量的RHO'一个结构, 'UX', 'UY'。 '数字'参数只是一个计数变量,用于正确命名文件。

gdb说以下,但它并没有多大帮助。

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000010 
0x00007fff87c6ebec in __vfprintf() 

我在编程方面没有那么丰富的经验,所以我想有更好的方法将数据写入文件。任何试图澄清为什么我的方法不起作用的高度赞赏。

感谢

乔恩

+0

你能告诉我们究竟哪一条线给了麻烦吗? – BlackBear 2011-03-11 18:14:03

+0

感谢大家的输入。正如Elecric Wig指出的,我在我的fclose声明中有一个明显的错误。对不起,问一个愚蠢的问题。 012 – jonalm 2011-03-12 00:55:26

回答

6

看起来像是关闭了vx_File两次,并且完全没有关闭rho_File。这意味着你将每次迭代打开rho_File,并且每次都使用一个文件描述符。

我想程序会失败,你用完文件描述符。 (由于这发生在第250次迭代,我猜你的限制是256)。一旦你不在文件描述符中,其中一个fopen()调用将返回NULL。由于您不检查fopen()的返回值,因此当您尝试将fwrite写入NULL句柄时会发生崩溃。

+0

hehe。非常感谢你指出了愚蠢的错误。你让我今天一整天都感觉很好。 – jonalm 2011-03-12 00:39:11

4

看起来像一个空指针引用。您需要检查fopen()的结果以确保它成功(非NULL结果)。

0

在gdb中,你可以尝试一个`bt'命令吗? 这将显示故障功能的堆栈跟踪。 它对你说什么?

0

也许当您创建这些千个100x100矩阵(或者正在发生的任何事情)时,您会用尽内存。然后,您可能会得到一个不完整的sim->lattice,其中可能包含NULL指针。

您是否检查malloc()调用是否成功?如果他们不能分配内存,则返回NULL