我对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;
}
虽然这不是你所描述的问题,但一个问题是你没有初始化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++) {
在你的dTdt
计算期间,你使用的是T[i-1][j]
和T[i-1][j]
。如果i是最大值(0或500),则超出阵列限制。同样适用于j。因此,您使用未初始化的内存。您需要将1
循环到499
并根据您尝试解决的问题区别对待边界。
首先调整循环最小值和最大值;
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