C 分段错误,我不知道原因
实际上,我尝试生成并填充随机矩阵,并将其保存为纯文本txt,但当我尝试生成1000多个文件时出现了问题,这些文件相当于工作目录中的2000个文件 我想知道原因和解决办法 我使用C 分段错误,我不知道原因,c,segmentation-fault,stdio,C,Segmentation Fault,Stdio,实际上,我尝试生成并填充随机矩阵,并将其保存为纯文本txt,但当我尝试生成1000多个文件时出现了问题,这些文件相当于工作目录中的2000个文件 我想知道原因和解决办法 我使用gcc code.c编译此代码,并使用/a.out运行可能更改第25行中生成的矩阵编号: cant = 1000; // THIS GENERATE 1000 FILES OF CURRENT MATRIX. 代码c: 解决方案=D 谢谢Chistopher和Vallabh 我认为对我来说,这个错误是一个疏忽 关闭(p
gcc code.c
编译此代码,并使用/a.out运行代码>可能更改第25行中生成的矩阵编号:
cant = 1000; // THIS GENERATE 1000 FILES OF CURRENT MATRIX.
代码c:
解决方案=D
谢谢Chistopher和Vallabh
我认为对我来说,这个错误是一个疏忽
关闭(puntero_f);
关闭(puntero_b)
非常感谢您的解释,我想在对文件有了更清晰的概念之后,我会有它们的
最终被理解为邮政编码,所以我把解决方案留给那些将来可能有用的人
非常感谢;)
#包括
#包括
#包括
#包括
//我们可以通过预处理使记忆有效
#定义F(i,j)F[i*col+j]
#定义B(i,j)B[i*col+j]
浮动随机浮动(浮动最小值,浮动最大值){
返回((浮动)rand()/(浮动)rand_MAX);
}
int i、j、T步骤、fil、col、CONT;
int main(int argc,char*argv[]){
字符名称[50];/=”;
字符名为[50];/=”;
文件*puntero_f;
文件*puntero_b;
fil=2;
col=2;
铁路超高=1000;
int tam=fil*col;
float*F=calloc(tam,sizeof(float));
float*B=calloc(tam,sizeof(float));
//srand((无符号)时间(NULL));
int-archi=0;
对于(tstep=0;tstep而言,问题在于对()的调用
open()/close()使用文件描述符,这些描述符是int
fopen()/fclose()处理文件*
您的代码中的问题是poitner可以转换为int,因此代码可以编译,但结果是崩溃!我使用fclose()编译了您的代码,它工作得非常好。您不应该将fopen()
与close()
或open()
与fclose()
在代码中使用fclose()
fopen()
如@christopherclose()/open()
处理文件描述符,而fopen()/fclose()处理文件描述符
处理文件
指针。除非我们看到您的实际源代码,否则我们无法提供帮助。您发布的内容将无法编译。它至少缺少两个#include
指令以及Dato
和随机浮动
的声明。如果Dato
是一个函数,则调用不能出现在a assignment.复制并粘贴编译到问题中的实际代码。2个问题:您是否尝试过使用fclose()而不是close()?您确认磁盘上有足够的空间了吗?seg错误的确切文本通常有有用的信息。@KeithThompson函数调用可以出现在赋值的左侧,只要它返回可赋值的内容。在这种情况下,我猜它会返回对输入数组中某个特定浮点的引用。但是如果Dato
中有一个错误,它返回了一个野生引用,这可以解释崩溃的原因。@Christophe:我刚刚注意到gcc实际上没有警告close
调用,除非您要求它发出警告(这很不幸)。根据“gnu89”/“gnu90”的规则默认情况下,它执行的方言为close
。使用-std=c99
或-std=gnu99
编译时确实会产生警告。但问题中的代码可能会得到许多其他警告(有些是因为缺少必须在原始代码中的代码,但OP没有显示给我们)。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
// Usando Preprocesado para manejar las matrices y tener acceso eficiente a memoria
#define F(i,j) F[i*col +j]
#define B(i,j) B[i*col +j]
float randfloat(float min, float max){
return ((float) rand() / (float) RAND_MAX);
}
int i, j, tstep, fil, col, cant;
int main(int argc, char *argv[]){
char nombre_b[50] ; //= "";
char nombre_f[50] ; //= "";
FILE *puntero_f;
FILE *puntero_b;
fil = 2;
col = 2;
cant = 1000;
int tam = fil*col;
float *F = calloc(tam,sizeof(float));
float *B = calloc(tam,sizeof(float));
//srand((unsigned)time(NULL));
int archi = 0;
for (tstep=0; tstep<cant; tstep++){
sprintf(nombre_f, "Forward%d.txt", tstep);
sprintf(nombre_b, "Backward%d.txt", tstep);
puntero_f = fopen(nombre_f, "a+");
puntero_b = fopen(nombre_b, "a+");
for(i = 0; i<fil; i++){
for(j = 0; j<col; j++){
F(i,j) = randfloat(0.0f, 1.0f);
B(i,j) = randfloat(0.0f, 1.0f);
if(tstep==archi){
fprintf(puntero_f,"%f ", F(i,j));
fprintf(puntero_b,"%f ", B(i,j));
}
}
if(tstep==archi){
fprintf(puntero_f,"\n");
fprintf(puntero_b,"\n");
}
}
archi++;
fclose(puntero_f);
fclose(puntero_b);
}
return 0;
}