Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C函数:为什么我的变量在设置后立即改变值?_C_Function_Pointers - Fatal编程技术网

C函数:为什么我的变量在设置后立即改变值?

C函数:为什么我的变量在设置后立即改变值?,c,function,pointers,C,Function,Pointers,我正在构建一个程序,将信息保存在像素矩阵(结构)上。像素必须有自己的颜色(另一个结构)。颜色是一个包含三个整数的结构(红色=vermelho,绿色=verde,蓝色=azul)。但当我设置它们时,它们的值会在for结束后立即发生变化。 例如,如果我将值250放在像素的所有红色属性上,那么如果我在For完成后打印它们,如果我在For运行时打印它们,那么这些值是正确的,那么会发生某种变化 我也在读取文件中红色、绿色和蓝色值的信息,但是我打印了它们,它们是正确的 下面是我正在使用的函数,我在函数cle

我正在构建一个程序,将信息保存在像素矩阵(结构)上。像素必须有自己的颜色(另一个结构)。颜色是一个包含三个整数的结构(红色=vermelho,绿色=verde,蓝色=azul)。但当我设置它们时,它们的值会在for结束后立即发生变化。 例如,如果我将值250放在像素的所有红色属性上,那么如果我在For完成后打印它们,如果我在For运行时打印它们,那么这些值是正确的,那么会发生某种变化

我也在读取文件中红色、绿色和蓝色值的信息,但是我打印了它们,它们是正确的

下面是我正在使用的函数,我在函数clear中遇到了问题,从中我得到了for中所有像素的“25000”(正确值),但在clear函数中,第二个像素的值有时会更改为“25000”、“02500”和“250250”

我试着打印所有的变量,但在我第一次设置它们之后,它们似乎神奇地改变了。我在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");
}
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;