我对C非常缺乏经验,必须将其用于探索热传递的一门课程中。
我收到(0xC0000005)返回码的各种错误。我知道这是一种尝试访问内存的尝试,并且可能无法在某处正确分配内存,但是我无法弄清楚。
任何想法都需要改变吗?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(){
/* constant alpha squared, the area of the domain */
const float alphSqrd = 0.01;
const float deltX, deltY = 0.0002;
const float timeStep = 0.0000009;
const int maxTimeSteps = 1000;
int h, i, j;
/* 2D Array of Temperature Values */
float T [500][500];
float dTdt;
/* initialise temperature values */
printf("Initialising 2D array...\n");
for (i=0; i<500; i++){
for (j=0; j<500; j++){
if (150<=i && i<350 && 150<=j && j<350){
T[i][j] = 50;
} else {
T[i][j] = 20;
}
}
}
printf("Updating values...\n");
for (h=0; h<maxTimeSteps; h++){
for (i=0; i<500; i++){
for (j=0; j<500; j++){
dTdt = alphSqrd*(((T[i+1][j]-2*T[i][j]+T[i-1][j])/(deltX*deltX))+((T[i][j+1]-2*T[i][j]+T[i][j-1])/(deltY*deltY)));
T[i][j] = T[i][j] + dTdt * timeStep;
printf("%f ",T[i][j]);
}
printf("\n");
}
}
return 0;
}
答案 0 :(得分:3)
在dTdt
计算期间,您正在使用T[i-1][j]
和T[i-1][j]
。如果i最大(0或500),则超出数组限制。 j也是如此。
因此,您将使用未初始化的内存。您需要将形式1
循环到499
,并根据要解决的问题来区别对待边界。
答案 1 :(得分:3)
尽管这不是您要描述的问题,但一个问题是您没有初始化deltX
。代替这个
const float deltX, deltY = 0.0002;
您想要
const float deltX = 0.0002 , deltY = 0.0002;
除此之外,您还有超出范围的问题。如果您要访问索引i - 1
和i + 1
,则无法在0
个元素的数组上从499
到500
循环。>
如果我像这样调整循环,它将对我有用:
for (i = 1; i < 499; i++) {
for (j = 1; j < 499; j++) {
答案 2 :(得分:0)
首先调整循环的最小值和最大值;
for (i=1; i<499; i++){
for (j=1; j<499; j++){
您应该在printf()
处添加注释行。 stdout
需要花费大量时间。
for (h=0; h<maxTimeSteps; h++){
for (i=1; i<499; i++){
for (j=1; j<499; j++){
dTdt = alphSqrd*(((T[i+1][j]-2*T[i][j]+T[i-1][j])/(deltX*deltX))+((T[i][j+1]-2*T[i][j]+T[i][j-1])/(deltY*deltY)));
T[i][j] = T[i][j] + dTdt * timeStep;
//printf("%f ",T[i][j]);
}
//printf("\n");
}
}
我在虚拟Linux上编译了这段代码,花了将近3秒钟。 enter image description here