управление памятью в C, 2D float array - PullRequest
0 голосов
/ 19 февраля 2019

Я очень неопытен с 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;
}

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Хотя это не та проблема, которую вы описываете, одна проблема в том, что вы не инициализируете 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++) {
0 голосов
/ 19 февраля 2019

Сначала настройте минимальное и максимальное значения цикла;

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 секунды. введите описание изображения здесь

0 голосов
/ 19 февраля 2019

Во время расчета dTdt вы используете T[i-1][j] и T[i-1][j].Если я максимальный (0 или 500), это превышает пределы массива.То же самое верно для j.Таким образом, вы используете неинициализированную память.Вам нужно зациклить форму от 1 до 499 и по-разному трактовать границу в зависимости от проблемы, которую вы пытаетесь решить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...