C函数:为什么我的变量在设置后立即改变值?
我正在构建一个程序,将信息保存在像素矩阵(结构)上。像素必须有自己的颜色(另一个结构)。颜色是一个包含三个整数的结构(红色=vermelho,绿色=verde,蓝色=azul)。但当我设置它们时,它们的值会在for结束后立即发生变化。 例如,如果我将值250放在像素的所有红色属性上,那么如果我在For完成后打印它们,如果我在For运行时打印它们,那么这些值是正确的,那么会发生某种变化 我也在读取文件中红色、绿色和蓝色值的信息,但是我打印了它们,它们是正确的 下面是我正在使用的函数,我在函数clear中遇到了问题,从中我得到了for中所有像素的“25000”(正确值),但在clear函数中,第二个像素的值有时会更改为“25000”、“02500”和“250250” 我试着打印所有的变量,但在我第一次设置它们之后,它们似乎神奇地改变了。我在C方面没有太多经验,所以我现在真的迷路了C函数:为什么我的变量在设置后立即改变值?,c,function,pointers,C,Function,Pointers,我正在构建一个程序,将信息保存在像素矩阵(结构)上。像素必须有自己的颜色(另一个结构)。颜色是一个包含三个整数的结构(红色=vermelho,绿色=verde,蓝色=azul)。但当我设置它们时,它们的值会在for结束后立即发生变化。 例如,如果我将值250放在像素的所有红色属性上,那么如果我在For完成后打印它们,如果我在For运行时打印它们,那么这些值是正确的,那么会发生某种变化 我也在读取文件中红色、绿色和蓝色值的信息,但是我打印了它们,它们是正确的 下面是我正在使用的函数,我在函数cle
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");
}
typedef结构cor{
维梅略国际酒店;
佛得角国际酒店;
内蓝;
}Cor;
typedef结构像素{
可的松素;
}像素;
类型定义结构映像{
像素**pintura;
国际拉古拉;
阿尔图拉国际酒店;
}Imagem;
无效图像(文件*pont_arq,图像M*desenho){
int i,j,k;
fscanf(pont_arq、%d%d、&i和j);
desenho->altura=j;//值等于400
desenho->largura=i;//值等于600
printf(“Cria图像M%dx%d\n”,i,j);
desenho->pintura=calloc(i,sizeof(像素*);
对于(k=0;kpintura[k]=calloc(j,sizeof(像素));
}
printf(“Saiu\n”);
}
int*Leintarquivo(文件*pont_arq,int inicio,int vezes,int val[]){
如果(vezes==inicio-1){
fscanf(pont_arq、%d、&val[inicio]);
返回val;
}否则{
fscanf(pont_arq、%d、&val[inicio]);
勒林塔尔基沃(阿尔克桥、伊尼西奥+1、维兹、瓦尔);
}
}
无效清除(文件*pont_arq,图像*desenho){
int-val[3],i,j;
勒林塔基沃(阿尔克桥,0,3,瓦尔);
printf(“Cria imagem”);
printf(“%d%d%d\n”,val[0],val[1],val[2]);//val[0]=250 val[1]=0 val[2]=0
//这用于打印正确的值
对于(i=0;ialtura;++i){
对于(j=0;jlargura;++j){
printf(“%d%d\n”,i,j);
desenho->pintura[i][j].cordopixel.vermelho=val[0];//设置值
desenho->pintura[i][j].cordopixel.verde=val[1];//设置值
desenho->pintura[i][j].cordopixel.azul=val[2];//设置值
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);
}
}
//此的未打印正确的值
对于(i=0;ialtura;++i){
对于(j=0;jlargura;++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
的值是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));
}
也就是说,您以[altura][largura]
数组的形式访问它,这是不正确的
在某个步骤中,您成功地交换了这些值。最有可能的是,当您分配映像内存时,它应该是
desenho->altura = i;
desenho->largura = j;
不是相反。告诉我们你是如何分配的
Imagem*desenho
。只是编辑了问题并添加了函数名为image,如果你还需要什么,就说我将添加:)非常感谢你,兄弟,我更改了altura和largura的值,但没有更改calloc块内的值,现在它工作得很好。:)
desenho->altura = i;
desenho->largura = j;