C指针错误->;表达式必须是可修改的左值

C指针错误->;表达式必须是可修改的左值,c,pointers,struct,C,Pointers,Struct,我无法通过操纵另一个结构对象的数据成员并获得错误来设置结构对象的数据成员:表达式必须是可修改的左值 我已经看到了这个特定错误代码的所有答案,但没有得到任何令人满意的结果 图像结构的定义如下: typedef struct{ int w,h,c; float *data; }image; 此图像结构包含数据,作为指向浮点值的指针,浮点值包含特定图像的像素值。 现在的任务是将所有像素更改为灰度。 我们有一个表示为Y'=0.299R'+0.587G'+0

我无法通过操纵另一个结构对象的数据成员并获得错误来设置结构对象的数据成员:表达式必须是可修改的左值

我已经看到了这个特定错误代码的所有答案,但没有得到任何令人满意的结果

图像结构的定义如下:

typedef struct{
    int w,h,c;            
    float *data;   
}image;
此图像结构包含数据,作为指向浮点值的指针,浮点值包含特定图像的像素值。 现在的任务是将所有像素更改为灰度。 我们有一个表示为Y'=0.299R'+0.587G'+0.114B'的标准,或者对于所有3个通道中的每个像素值,我必须取这个加权平均值

我将RGB值更改为灰度的功能如下:

image rgb_to_grayscale(image im)
{
    assert(im.c == 3);
    image gray = make_image(im.w, im.h, 1);        // Creates a image struct with *data containing 
                                                   // 1 Channel

    // Creating pointers to struct
    image * ptr_gray , * ptr_im;

    // Point to the address of the struct objects
    // Gray Image
    ptr_gray = &gray; 
    float * gray_data = ptr_gray->data;
    float(*gray_data_matrix) [im.w][im.h] = gray_data;

    // Point to the address of the struct objects
    // Given Image
    ptr_im = &im; 
    float * im_data = ptr_im->data;
    float(*im_data_matrix) [im.w][im.h] = im_data;

    // Now we have the weighted mean like:
    //Y' = 0.299 R' + 0.587 G' + .114 B'

    // So for a given *data I have to calculate the value over the whole 3-D Matrix

    float red_matrix[im.h][im.w];
    float green_matrix[im.h][im.w];
    float blue_matrix[im.h][im.w];

    int k =0;
    for(int i= 0; i< im.h ; i++){
        for(int j = 0; j < im.w ; j++){
            while(k<im.c)){
                if(k == 0){
                    red_matrix[i][j] = *(*(*(im_data_matrix +k) + i) + j)*0.299 ;
                }
                if(k == 1){
                    green_matrix[i][j] =   *(*(*(im_data_matrix +k) + i) + j)*0.587;
                }
                if(k == 2){
                    blue_matrix[i][j] = *(*(*(im_data_matrix +k) + i) + j)*0.114;
                }

            }
            *(*(gray_data_matrix+i)+j) = *(*(red_matrix + i)+j) + 
                                            *(*(green_matrix + i)+j) + 
                                                *(*(blue_matrix + i)+j);
    k++;
        }

    }

    return gray;
}
错误是:表达式必须是可修改的左值。
如何解决此错误???

对我来说,问题在于您使用的数据结构。特别是
float(*gray\u data\u matrix)[im.w][im.h]=gray\u数据中变量
gray\u matrix
的定义。它不是用标准的gcc编译的,我不明白您在这里试图定义什么

您可以简单地移动RGB图像
im.data
像素,并在每次迭代时进行加权平均计算

类似这样的事情(我没有测试!):

for(inti=0;i
通过使用[],灰色数据矩阵[j][i]=红色矩阵[i][j]+绿色矩阵[i][j]+蓝色矩阵[i][j];同样在循环中,im_data_matrix[k][i][j],为什么要对RGB使用浮点值?通常,RGB由3 x 8位字节组成。然后,RGB可以存储为24位的长整数。在每个循环开始时,必须将变量
k
归零。在您的情况下,while循环将只执行一次完整的迭代。提供一个函数有助于查找错误,因为读者不需要挖掘不相关的代码。所有灰值计算和所有循环都与关于表达式类型的编译器错误无关。创建MCVE的过程也可以让您自己更清楚地了解问题。您实际上不需要将
红色矩阵
绿色矩阵
蓝色矩阵
作为二维阵列,因为您一次只处理一个像素。简单的标量变量就可以了。行
float(*gray\u data\u matrix)[im.w][im.h]=gray\u data不编译。这是怎么回事?
*(*(gray_data_matrix+j)+i) = *(*(red_matrix + i)+j) + 
                                            *(*(green_matrix + i)+j) + 
                                                *(*(blue_matrix + i)+j);
for(int i= 0; i< im.h ; i++){
        for(int j = 0; j < im.w ; j++){
               gray.data[i][j] =   im.data[0][i][j]*0.299 
                                 + im.data[1][i][j]* xxx
                                 + im.data[2][i][j]* xxx;
        }
}