#c #segmentation-fault
#c #ошибка сегментации
Вопрос:
Я новичок в C и пытаюсь записать свои выходные данные в файл. Кажется, что я получаю ошибку сегментации при попытке закрыть выходные файлы. Я выполнил те же шаги, что и в некоторых примерах, чтобы открыть файл и выделить память.
Заранее спасибо за вашу помощь. Это код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define pi 4*atan(1)
FILE *my_file_1; // Output file (*.txt)
FILE *my_file_2; // Output file (*.txt)
int main()
{
int nx, ny, npts;
int niter;
double dt, w, height, d_o, h, factork, dVol;
double rho_o, g, lamda, po, co, p1, p2, r; // Fluid Properties
double *x, *y, *u, *v, *du, *dv, *rho, *drho, *p, *m;
double en_x, en_y, dw, dwx, dwy, sum1, sum2, sum3;
int i, j, k;
//Parameters
height = 0.2; //Height
w = 0.1; //width
nx = 20; //Number of particles x-dir
ny = 40; //Number of particles y-dir
npts = nx*ny;// Total number of particles
d_o = w / nx; // Distance between particles
dt = 0.00002;
dVol = 4 * pow((d_o / 2), 2);
// boundary
double L,height_wall,*xw1,*xw2,*xb,*yw1,*yw2,*yb;
int nyw1,nyw2,nxb;
int nrows,np1,np2,npb;
L=0.8;
height_wall=0.4;
nrows=3;
nyw1=height_wall/d_o;
nyw2=height_wall/d_o;
nxb=L/d_o;
np1=nrows*nyw1;
np2=nrows*nyw2;
npb=nrows*nxb;
printf("%dn",npb);
// getchar();
h = 1.33*d_o; // Smoothing length
factork = 2; //Constant for kernell
//Fluid
rho_o = 1000;
g = 9.81;
lamda = 1;
po = 101325;
co = 30;
x = (double*)malloc(npts*sizeof(int));
y = (double*)malloc(npts*sizeof(int));
u = (double*)malloc(npts*sizeof(int));
v = (double*)malloc(npts*sizeof(int));
rho = (double*)malloc(npts*sizeof(int));
du = (double*)malloc(npts*sizeof(int));
dv = (double*)malloc(npts*sizeof(int));
drho = (double*)malloc(npts*sizeof(int));
p = (double*)malloc(npts*sizeof(int));
m = (double*)malloc(npts*sizeof(int));
//boundaries
xw1 = (double*)malloc(np1*sizeof(int));
yw1= (double*)malloc(np1*sizeof(int));
xw2 = (double*)malloc(np2*sizeof(int));
yw2= (double*)malloc(np2*sizeof(int));
xb = (double*)malloc(npb*sizeof(int));
yb= (double*)malloc(npb*sizeof(int));
my_file_1 = fopen("org.txt", "w");
my_file_2 = fopen("bound.txt", "w");
// Particles
for (i = 0; i<ny; i )
{
for (j = 0; j<nx; j )
{
x[nx*i j] = d_o / 2 j*d_o;
y[nx*(i) j] = d_o / 2 i*d_o;
// printf(" .18f .18fn",x[nx*i j],y[nx*(i) j]);
//printf("%7.4f %7.4fn ", x[nx*i j], y[nx*(i) j]);
fprintf(my_file_1, "%7.4f %7.4fn ", x[nx*i j], y[nx*(i) j]);
}
}
//Boundries
//Left wall
for (i = 0; i<nyw1; i )
{
for (j = 0; j<nrows; j )
{
xw1[nrows*i j] = -L/2 d_o / 2 j*d_o;
yw1[nrows*(i) j] = d_o / 2 i*d_o;
// printf(" .18f .18fn",x[nx*i j],y[nx*(i) j]);
//printf("%7.4f %7.4fn ", x[nx*i j], y[nx*(i) j]);
fprintf(my_file_2, "%7.4f %7.4fn ", xw1[nrows*i j], yw1[nrows*(i) j]);
}
}
//Right wall
for (i = 0; i<nyw2; i )
{
for (j = 0; j<nrows; j )
{
xw2[nrows*i j] = L/2-4*d_o 3*d_o / 2 j*d_o;
yw2[nrows*(i) j] = d_o / 2 i*d_o;
// printf(" .18f .18fn",x[nx*i j],y[nx*(i) j]);
//printf("%7.4f %7.4fn ", x[nx*i j], y[nx*(i) j]);
fprintf(my_file_2, "%7.4f %7.4fn ", xw2[nrows*i j], yw2[nrows*(i) j]);
}
}
//Bottom wall
for (i = 0; i<nrows; i )
{
for (j = 0; j<nxb; j )
{
xb[nxb*i j] = -L/2 d_o/2 j*d_o;
yb[nxb*i j] = -4*d_o / 2 i*d_o;
//printf("%d %dn",i,j);
printf("%d %dn",i,j);
printf(" .18f .18fn",xb[nxb*i j],yb[nxb*(i) j]);
//printf("%7.4f %7.4fn ", x[nx*i j], y[nx*(i) j]);
fprintf(my_file_2, "%7.4f %7.4fn ", xb[nxb*i j], yb[nxb*(i) j]);
}
}
fclose(my_file_1)
fclose(my_file_2)
}
Комментарии:
1. Почему вы используете malloc и используете sizeof int
2. Для начала,
x = (double*)malloc(npts*sizeof(int));
это большая ошибка, и 15 других подобных строк. Я предлагаю вам внимательно прочитать код, строка за строкой.3.
fopen()
может произойти сбой!!! Проверьте возвращаемое значениеfopen()
: если это такNULL
, то файл не открыт. См. cplusplus.com/reference/cstdio/fopen
Ответ №1:
Ниже приведена переработка вашего кода с исправленными выделениями памяти, а также исправлены ошибки, из-за которых ваш код не компилировался! И множество изменений стиля. Я также удалил весь неактивный код, что является хорошей идеей при отправке программ, чтобы люди могли сосредоточиться на проблемах. Я также завернул ваши fopen()
fclose()
вызовы and с проверкой ошибок, поэтому, если есть другая проблема, вы должны получить дополнительную информацию. Приведенный ниже код выполняется до завершения без ошибок:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define pi (4 * atan(1))
#define ORG_FILE_NAME "org.txt"
#define BOUND_FILE_NAME "bound.txt"
int main()
{
// Parameters
double w = 0.1; // Width
int nx = 20; // Number of particles x-dir
int ny = 40; // Number of particles y-dir
int npts = nx * ny; // Total number of particles
double d_o = w / nx; // Distance between particles
// Boundary
double L = 0.8;
double height_wall = 0.4;
int nrows = 3;
int nyw1 = height_wall / d_o;
int nyw2 = height_wall / d_o;
int nxb = L / d_o;
int np1 = nrows * nyw1;
int np2 = nrows * nyw2;
int npb = nrows * nxb;
printf("%dn", npb);
// Fluid
double *x = calloc(npts, sizeof(double));
double *y = calloc(npts, sizeof(double));
// Boundaries
double *xw1 = calloc(np1, sizeof(double));
double *yw1 = calloc(np1, sizeof(double));
double *xw2 = calloc(np2, sizeof(double));
double *yw2 = calloc(np2, sizeof(double));
double *xb = calloc(npb, sizeof(double));
double *yb = calloc(npb, sizeof(double));
FILE *my_file_1 = fopen(ORG_FILE_NAME, "w"); // Output file (*.txt)
if (my_file_1 == NULL)
{
perror(ORG_FILE_NAME);
return(EXIT_FAILURE);
}
FILE *my_file_2 = fopen(BOUND_FILE_NAME, "w"); // Output file (*.txt)
if (my_file_2 == NULL)
{
perror(BOUND_FILE_NAME);
return(EXIT_FAILURE);
}
// Particles
for (int i = 0; i < ny; i )
{
for (int j = 0; j < nx; j )
{
x[nx * i j] = d_o / 2 j * d_o;
y[nx * i j] = d_o / 2 i * d_o;
fprintf(my_file_1, "%7.4f %7.4fn", x[nx * i j], y[nx * i j]);
}
}
// Boundries
// Left wall
for (int i = 0; i < nyw1; i )
{
for (int j = 0; j < nrows; j )
{
xw1[nrows * i j] = -L / 2 d_o / 2 j * d_o;
yw1[nrows * i j] = d_o / 2 i * d_o;
fprintf(my_file_2, "%7.4f %7.4fn", xw1[nrows * i j], yw1[nrows * i j]);
}
}
// Right wall
for (int i = 0; i < nyw2; i )
{
for (int j = 0; j < nrows; j )
{
xw2[nrows * i j] = L / 2 - 4 * d_o 3 * d_o / 2 j * d_o;
yw2[nrows * i j] = d_o / 2 i * d_o;
fprintf(my_file_2, "%7.4f %7.4fn", xw2[nrows * i j], yw2[nrows * i j]);
}
}
// Bottom wall
for (int i = 0; i < nrows; i )
{
for (int j = 0; j < nxb; j )
{
xb[nxb * i j] = -L / 2 d_o / 2 j * d_o;
yb[nxb * i j] = -4 * d_o / 2 i * d_o;
fprintf(my_file_2, "%7.4f %7.4fn", xb[nxb * i j], yb[nxb * i j]);
}
}
if (fclose(my_file_1) != 0)
{
perror(ORG_FILE_NAME);
return(EXIT_FAILURE);
}
if (fclose(my_file_2) != 0)
{
perror(BOUND_FILE_NAME);
return(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
Комментарии:
1. ДА. Наконец, я вижу пример, в котором кто-то проверяет возвращаемое значение
fclose()
.2. Спасибо за помощь