我正在构建一个将信息保存在像素矩阵(结构)上的程序。一个像素必须有它的颜色(另一个结构)颜色是一个具有三个整数的结构(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/