我是新人,最近按老师要求写了个小代码,如下图,但有个bug在网上搜了好久没找到解决方法,麻烦大神看一下,这里面杨氏模量ys设置为1的时候,程序运行正常,当设置为10的时候就会显示读取位置发生访问冲突
#include<stdio.h>
#include<math.h>
double SIG[200][4] = { 0 };
double xxp[200][4] = { 0 };
double ptime[8000][4] = { 0 };
double LOC[400] = { 0 };
double xp[200] = { 0 };
double MP[200] = { 0 };
double ssp[200] = { 0 };
double hhh[200] = { 0 };
double snp[200] = { 0 };
double dssp[200] = { 0 };
double dsnp[200] = { 0 };
double vg[400] = { 0 };
double vp[200] = { 0 };
double dvp[200] = { 0 };
double fext[400] = { 0 };
double vpbar[200] = { 0 };
double f[400] = { 0 };
int NC[200] = { 0 };
double xc[200] = { 0 };
double tt[80001] = { 0 };
double xx[200] = { 0 };
int main()
{
int i, j, NB, NS, fbc, ntime, NE = 200;
int nppc = 1;
double dt, tfinal, fbn, rho = 1.0;
double ys = 10000.;
printf("ys=%lf\n", ys);
NE = NE * 1;
double c, c1 = 0, c2 = 0, A = 1., L = 50.;
c = sqrt(ys / rho);
printf("c=%lf\n", c);
NS = floor(NE / 5) + 2;
fbc = NS;
fbn = 1.;
NB = NE + NS;
dt = 0.1 * L / NE / c;
printf("dt=%f\n", dt);
tfinal = 40.0 * L / c;
printf("tfinal=%f\n", tfinal);
ntime = round(tfinal / dt) + 1;
printf("ntime=%d\n", ntime);
int nntime = round(ntime / 10);
printf("nntime=%d\n",nntime );
int npfc = nppc * NE - 1;
int n1 = round(ntime * 1 / 4), n2 = round(ntime * 1.2 / 4), n3 = round(ntime * 3 / 4), n4 = ntime;
int NN = round(2.0 * NE);
double le = L / NE;
printf("NN=%d\n", NN);
for (i = 0; i < NN; i++)
{
LOC[i] = i * le;
/*printf("LOC[%d]=%lf\n", i, LOC[i]);*/
}
printf("nppc*NE=%d\n", nppc * NE);
for (i = 0; i < nppc * NE; i++)
{
xp[i] = (NS - 1. + 0.5 / nppc + i / nppc) * le;
/*printf("xp[%d]=%lf\n", i, xp[i]);*/
}
for (i = 0; i < nppc * NE; i++)
{
MP[i] = rho * A * le / nppc;
/*printf("MP[%d]=%lf\n", i, MP[i]);*/
}
double t = 0.0, nb = 1.0, lp = 0.5 / nppc * le;
int n = 1, b0 = -800;
while (t <= tfinal / 1 + 1.0e-6)
{
double MVG[400] = { 0 };
double MG[400] = { 0 };
double fint[400] = { 0 };
double fb[400] = { 0 };
double b = b0 * nb * t / tfinal;
/*printf("b=%f\n", b);*/
for (i = 0; i < nppc * NE; i++)
{
NC[i] = floor(xp[i] / le) + 1;
/*printf("NC[%d]-1=%d\n", i, NC[i]-1);
printf("LOC[NC[%d]-1]=%lf\n", i, LOC[NC[i] - 1]);*/
/*printf("floor(xp[%d]/le)+1=%\n", i, floor(xp[i]/le)+1);*/
xc[i] = (xp[i] - LOC[NC[i]-1]) / le;
/*printf("xp[%d]=%lf,NC[%d]=%d,LOC[%d]=%lf,le=%lf,xp[%d]-LOC[%d]=%lf,(xp[%d]-LOC[%d])/le=%lf\n", i, xp[i], i, NC[i],NC[i]-1, LOC[NC[i]-1],le,i,NC[i]-1,xp[i]-LOC[NC[i]-1],i,NC[i]-1,(xp[i] - LOC[NC[i] - 1]) / le);
/*printf("LOC[%d]=%lf\n", NC[i]-1, LOC[NC[i] - 1]);*/
/*printf("%lf", xc[1]);*/
/*printf("LOC[NC[%d]-1]=%lf\n", i, LOC[NC[i] - 1]);*/
}
for (i = 0; i < nppc * NE; i++)
{
MG[NC[i] - 1] = MG[NC[i] - 1] + MP[i] * (1 - xc[i]);
MG[NC[i]] = MG[NC[i]] + MP[i] * xc[i];
MVG[NC[i] - 1] = MVG[NC[i] - 1] + MP[i] * vp[i] * (1 - xc[i]);
MVG[NC[i]] = MVG[NC[i]] + MP[i] * vp[i] * xc[i];
fint[NC[i] - 1] = fint[NC[i] - 1] + MP[i] / rho * ssp[i] / le;
fint[NC[i]] = fint[NC[i]] - MP[i] / rho * ssp[i] / le;
}
fext[NB - 1] = fbn;
for (i = 0; i < NN; i++)
{
f[i] = fint[i] + fext[i] + fb[i];
}
f[fbc - 1] = 0.0;
for (i = 0; i < NN; i++)
{
MVG[i] = MVG[i] + f[i] * dt;
}
MVG[fbc - 1] = 0.0;
for (i = 0; i < nppc * NE; i++)
{
dvp[i] = f[NC[i] - 1] * (1 - xc[i]) * dt / MG[NC[i] - 1] + f[NC[i]] * xc[i] * dt / MG[NC[i]];
vpbar[i] = MVG[NC[i] - 1] * (1 - xc[i]) / MG[NC[i] - 1] + MVG[NC[i]] * xc[i] / MG[NC[i]];
}
for (i = 0; i < nppc * NE; i++)
{
vp[i] = vp[i] + dvp[i];
xp[i] = xp[i] + vpbar[i] * dt;
}
for (i = 0; i < NN; i++)
{
MVG[i] = 0;
}
for (i = 0; i < nppc * NE; i++)
{
MVG[NC[i] - 1] = MVG[NC[i] - 1] + MP[i] * vp[i] * (1 - xc[i]);
MVG[NC[i]] = MVG[NC[i]] + MP[i] * vp[i] * xc[i];
}
for (i = 0; i < nppc * NE; i++)
{
vg[NC[i] - 1] = MVG[NC[i] - 1] / MG[NC[i] - 1];
vg[NC[i]] = MVG[NC[i]] / MG[NC[i]];
}
vg[fbc - 1] = 0.0;
for (i = 0; i < nppc * NE; i++)
{
dsnp[i] = (-vg[NC[i] - 1]) + vg[NC[i]] / le * dt;
}
for (i = 0; i < nppc * NE; i++)
{
snp[i] = snp[i] + dsnp[i];
}
for (i = 0; i < nppc * NE; i++)
{
ssp[i] = snp[i]*ys;
}
if (n == n1)
{
for (i = 0; i < nppc * NE; i++)
{
SIG[i][0] = ssp[i];
xxp[i][0] = xp[i];
}
}
if (n == n2)
{
for (i = 0; i < nppc * NE; i++)
{
SIG[i][1] = ssp[i];
xxp[i][1] = xp[i];
}
}
if (n == n3)
{
for (i = 0; i < nppc * NE; i++)
{
SIG[i][2] = ssp[i];
xxp[i][2] = xp[i];
}
}
if (n == n4)
{
for (i = 0; i < nppc * NE; i++)
{
SIG[i][3] = ssp[i];
xxp[i][3] = xp[i];
}
}
int nnt = floor(n / 10);
if (n == nnt * 10)
{
ptime[nnt - 1][0] = t;
ptime[nnt - 1][1] = xc[npfc - 1];
ptime[nnt - 1][2] = xc[nppc*NE-1];
ptime[nnt - 1][3] = ssp[npfc - 1];
}
if (n == 1000)
{
for (i = 0; i < nppc * NE; i++)
{
hhh[i] = ssp[i];
}
}
n = n + 1;
t = t + dt;
}
for (i = 0; i < ntime; i++)
{
tt[i] = tfinal / (double)(ntime - 1) * i;
}
for (i = 0; i < NE; i++)
{
xx[i] = L / (NE - 1) * i;
}
double xc[200] = { 0 };
double yc[200] = { 0 };
double Length = L * (1 + rho * b0 * L / 2 / ys);
double Error = 0;
double W = -rho * b0 * L;
for (i = 0; i < NE * nppc; i++)
{
xc[i] = (i + 0.5) / nppc * Length / NE;
yc[i] = ys * (sqrt(2 * rho * b0 * (Length - xc[i]) / ys + 1) - 1);
Error = Error + fabs(yc[i] / 4 - SIG[i][0]) * 2 * lp / W / Length;
printf("Error=%lf\n", Error);
}
printf("Error=%lf", Error);
return 0;
}
如有解决,不胜感激!
在报错的地方调试下,看看是不是数组内存越界的问题。
注意数组的下标范围是0 ~ 长度-1