Функция C: почему мои переменные меняют значения сразу после их установки? - PullRequest
1 голос
/ 26 октября 2019

Я создаю программу, которая сохраняет информацию в матрице пикселей (структура). Пиксель должен иметь свой цвет (другую структуру), цвет - это структура с тремя целыми числами (красный = vermelho, зеленый = verde и синий = azul). Но когда я их устанавливаю, их значение меняется сразу после окончания for. Например, если я поместил значение 250 во все красные атрибуты пикселей, это каким-то образом изменится, если я напечатаю их после того, как for закончится, если я напечатаю их, пока for работает, значения правильные.

I 'Я также читаю информацию о значениях красного, зеленого и синего значений файла, но я напечатал их, и они правы.

Ниже приведены функции, которые я использую, и у меня естьпроблемы в функции, понятные из этого, я получаю «250 0 0» (правильное значение) для всех пикселей внутри for, но значения меняются иногда на «250 0 0», «0 250 0» и «250 250 0"во втором для внутренней функции очистки.

Я попытался напечатать все переменные, но кажется, что они каким-то волшебным образом меняются после того, как я установил их в первом для. Я не очень опытный в C, поэтому я действительно потерян прямо сейчас.

typedef struct cor{
    int vermelho;
    int verde;
    int azul;
} Cor;

typedef struct pixel{
    Cor cordopixel;
} Pixel;

typedef struct imagem{
    Pixel **pintura;
    int largura;
    int altura;
} Imagem;

void image(FILE *pont_arq, Imagem *desenho){
    int i, j, k;
    fscanf(pont_arq, "%d %d", &i, &j);
    desenho->altura = j; //value equals 400
    desenho->largura = i; //value equals 600
    printf("Cria imagem %dx%d\n", i, j);
    desenho->pintura = calloc(i, sizeof(Pixel*));
    for (k = 0; k < i; ++k){
        desenho->pintura[k] = calloc(j, sizeof(Pixel));
    }
    printf("Saiu\n");
}

int* lerIntArquivo(FILE *pont_arq, int inicio, int vezes, int val[]){
    if(vezes==inicio-1){
        fscanf(pont_arq, "%d", &val[inicio]);
        return val;
    }else{
        fscanf(pont_arq, "%d", &val[inicio]);
        lerIntArquivo(pont_arq, inicio+1,vezes, val);
    }
}

void clear(FILE *pont_arq, Imagem *desenho){
    int val[3], i, j;
    lerIntArquivo(pont_arq, 0, 3, val);
    printf("Cria imagem");
    printf("%d %d %d\n",val[0],val[1], val[2]); //val[0]=250 val[1]=0 val[2]=0
    //this for is printing the right values
    for (i = 0; i < desenho->altura; ++i){
        for (j = 0; j < desenho->largura; ++j){
            printf("%d %d\n",i,j);
            desenho->pintura[i][j].cordopixel.vermelho = val[0];//setting the values
            desenho->pintura[i][j].cordopixel.verde = val[1];//setting the values
            desenho->pintura[i][j].cordopixel.azul = val[2];//setting the values
            printf("%d ", desenho->pintura[i][j].cordopixel.vermelho);
            printf("%d ", desenho->pintura[i][j].cordopixel.verde);
            printf("%d\n", desenho->pintura[i][j].cordopixel.azul);

        }
    }
    //this for is not printing the right values
    for (i = 0; i < desenho->altura; ++i){
        for (j = 0; j < desenho->largura; ++j){
            printf("%d ", desenho->pintura[i][j].cordopixel.vermelho);
            printf("%d ", desenho->pintura[i][j].cordopixel.verde);
            printf("%d\n", desenho->pintura[i][j].cordopixel.azul);
        }

    }
    printf("\n");
}

Там не было никаких сообщений об ошибках, только неправильные значения.

1 Ответ

2 голосов
/ 26 октября 2019

Когда вы выделяете память для вашего изображения, значение largura является первым размером 2D-массива, а значение altura является его вторым размером

desenho->altura = j;
desenho->largura = i;
...
desenho->pintura = calloc(i, sizeof(Pixel*));
for (k = 0; k < i; ++k){
    desenho->pintura[k] = calloc(j, sizeof(Pixel));
}

Т.е. вы создаете массив[largura][altura] size.

Но когда вы последний раз работаете с массивом, вы неожиданно меняете их роли

for (i = 0; i < desenho->altura; ++i){
  for (j = 0; j < desenho->largura; ++j){
    ...
    desenho->pintura[i][j]

Т.е. вы обращаетесь к нему как к массиву [altura][largura], что неверно.

На каком-то этапе вам удалось поменять значения. Скорее всего, когда вы выделяете память изображений, она должна была быть

desenho->altura = i;
desenho->largura = j;

, а не наоборот.

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