C 函数 : why my variables changing values right after setting them?

标签 c function pointers

我正在构建一个将信息保存在像素矩阵(结构)上的程序。一个像素必须有它的颜色(另一个结构)颜色是一个具有三个整数的结构(red=vermelho,green=verde 和 blue=azul)。但是当我设置它们时,它们的值会在 for 结束后立即发生变化。 例如,如果我将值 250 放在像素的所有红色属性上,如果我在 for 完成后打印它们,它会以某种方式改变,如果我在 for 运行时打印它们,则值是正确的。

我也在看一个文件的红绿蓝值的信息,打印出来是对的。

波纹管是我正在使用的函数,我在函数中遇到了问题,从中可以清楚地看出,对于 for 中的所有像素,我得到“250 0 0”(正确的值),但值发生了变化有时在 clear 函数中的第二个是“250 0 0”、“0 250 0”和“250 250 0”。

我已经尝试打印所有变量,但在我将它们设置为第一个 for 之后,它们似乎以某种方式神奇地发生了变化。我在 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");
}

没有错误消息,只有错误的值。

最佳答案

当您为图像分配内存时,largura 的值是二维数组的第一个大小,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] 大小的数组。

但是当您稍后使用数组时,您会突然颠倒他们的角色

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;

不是相反。

关于C 函数 : why my variables changing values right after setting them?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58573641/

相关文章:

c函数将十六进制转换为十进制表示形式

c - 带破折号的十六进制的 scanf 格式化字符串

css - LESS css : trying to use the red, green, and blue函数获取rgb值然后插入渐变

sql - DO block 工作正常,但函数循环次数太多?

创建具有 AX.25 封装的 TUN 网络设备

c - 如何检查我的包装函数系统调用 - read() 是否正确?

c - 显示C—结构中所有汽车的最大气缸容量

C:指针和数组

c++ - C/C++ 多指针?

c++ - 复 vector 指针