如何按图中要求去理解这个C语言代码并给出注释和理解文字




#include<stdio.h>
#define SIZE_X 3
#define SIZE_Y 3
struct point_2d
{
    int x;
    int y;
};
struct Image
{
    int data_[SIZE_Y][SIZE_X];
    int size_x_;
    int size_y_;
    int default_value_;
    void(*image_)(Image*,int);
    void(*set_value)(Image*,point_2d,int);
    int(*get_value)(Image*,point_2d);
    void(*image_print)(Image*);
};
void image(Image* img,int default_value);
void set_value(Image* img,point_2d pt,int value);
int get_value(Image* img,point_2d pt);
void image_print(Image* img);
int main(){
    Image img{};
    img.image_=image;
    img.image_(&img,0);
    img.image_print(&img);
    img.set_value(&img,point_2d{2,1},1);
    img.image_print(&img);
    printf("(%d,%d)= %d\n",2,1, img.get_value(&img,point_2d{2,1}));

}
void set_value(Image* img,point_2d pt,int value){
    if(pt.x>img->size_x_||pt.x<0||pt.y>img->size_y_||pt.y<0){
        printf("pt error!\n");
        return;
    }
    img->data_[pt.y][pt.x]=value;
}
/*!
 *
 * @param img 你的描述
 * @param pt 你的描述
 * @return 你的描述
 * @note 你的描述
 */
int get_value(Image* img,point_2d pt)
{
    if(pt.x>img->size_x_||pt.x<0||pt.y>img->size_y_||pt.y<0)
    {
        printf("pt error!\n");
        return -1;
    }
    return img->data_[pt.y][pt.x];
}
void image_print(Image* img)
{
    printf("size_x = %d,size_y = %d \n",img->size_x_,img->size_y_);
    printf("data is: \n");
    for (int y=0;y<img->size_y_;y++)
    {
        for(int x=0;x<img->size_x_;x++)
            printf(" %d", get_value(img,point_2d{x,y}));
        printf("\n");
    }
    printf("\n");
}

void image(Image* img,int default_value)
{
    img->default_value_=default_value;
    img->size_y_=sizeof(img->data_)/sizeof(img->data_[0]);
    img->size_x_=sizeof(img->data_[0])/sizeof(img->data_[0][0]);
    img->get_value=get_value;
    img->set_value=set_value;
    img->image_print=image_print;
    for (int y=0;y<img->size_y_;y++)
        for(int x=0;x<img->size_x_;x++)
            img->set_value(img,point_2d{x,y},img->default_value_);
}

img

函数功能注释如下:

#include<stdio.h>
#define SIZE_X 3
#define SIZE_Y 3
struct point_2d
{
    int x;
    int y;
};
struct Image
{
    int data_[SIZE_Y][SIZE_X];
    int size_x_;
    int size_y_;
    int default_value_;
    //这部分都是函数指针
    void (*image_)(Image*, int);
    void (*set_value)(Image*, point_2d, int);
    int(*get_value)(Image*, point_2d);
    void(*image_print)(Image*);
};
//声明函数
void image(Image* img, int default_value);
void set_value(Image* img, point_2d pt, int value);
int get_value(Image* img, point_2d pt);
void image_print(Image* img);
int main() {
    Image img{};//声明Image类型的img实例
    img.image_ = image; //设置img实例的函数指针
    img.image_(&img, 0); //相当于image(&img,0);初始化img实例
    img.image_print(&img);//打印img图像的值
    img.set_value(&img, point_2d{ 2,1 }, 1); //设置img图像在点(2,1)处的值为1
    img.image_print(&img); //打印img图像的值
    printf("(%d,%d)= %d\n", 2, 1, img.get_value(&img, point_2d{ 2,1 }));

}
/*!
*
@param img 需要操作的图像指针
@param pt 需要修改数据的点坐标
@param value 点上需要更新的数据
@return@note 将img图像上点pt位置的值更改为value
*/
void set_value(Image* img, point_2d pt, int value) {
    //判断点pt的坐标是否在img图像范围内,如果不在,退出
    if (pt.x > img->size_x_ || pt.x<0 || pt.y>img->size_y_ || pt.y < 0) {
        printf("pt error!\n");
        return;
    }
    img->data_[pt.y][pt.x] = value; //将img图像上点pt位置的值更改为value
}
/*!
*
@param img 需要操作的图像指针
@param pt 需要获取数据的图像上的点坐标
@return img图像上点pt所在的值
@note 获取img图像上点pt处的值
*/
int get_value(Image* img, point_2d pt)
{
    //判断点pt的坐标是否在img图像范围内,如果不在,返回-1
    if (pt.x > img->size_x_ || pt.x<0 || pt.y>img->size_y_ || pt.y < 0)
    {
        printf("pt error!\n");
        return -1;
    }
    return img->data_[pt.y][pt.x];//返回img图像上点pt处的值
}

/*!
*
@param img 需要操作的图像指针
@return@note 显示整个图像的值
*/
void image_print(Image* img)
{
    printf("size_x = %d,size_y = %d \n", img->size_x_, img->size_y_);
    printf("data is: \n");
    //双层for循环遍历img图像
    for (int y = 0; y < img->size_y_; y++)
    {
        for (int x = 0; x < img->size_x_; x++)
            printf(" %d", get_value(img, point_2d{ x,y }));
        printf("\n");
    }
    printf("\n");
}

/*!
*
@param img 图像指针
@param default_value 默认大熊啊
@return@note 初始化图像实例
*/
void image(Image* img, int default_value)
{
    //用img初始化Image的各元素
    img->default_value_ = default_value;
    img->size_y_ = sizeof(img->data_) / sizeof(img->data_[0]);
    img->size_x_ = sizeof(img->data_[0]) / sizeof(img->data_[0][0]);
    img->get_value = get_value;
    img->set_value = set_value;
    img->image_print = image_print;
    //双层for循环赋值
    for (int y = 0; y < img->size_y_; y++)
        for (int x = 0; x < img->size_x_; x++)
            img->set_value(img, point_2d{ x,y }, img->default_value_);
}

注释如下:

#include<stdio.h>
#define SIZE_X 3
#define SIZE_Y 3
//定义一个坐标点位结构体 
struct point_2d
{
    int x;
    int y;
};
//定义图像结构体 
struct Image
{
    int data_[SIZE_Y][SIZE_X];
    int size_x_;
    int size_y_;
    int default_value_;
    void(*image_)(Image*,int);
    void(*set_value)(Image*,point_2d,int);
    int(*get_value)(Image*,point_2d);
    void(*image_print)(Image*);
};
//函数声明部分(函数实现在main方法下面,需要在main方法上面声明) 
void image(Image* img,int default_value);
void set_value(Image* img,point_2d pt,int value);
int get_value(Image* img,point_2d pt);
void image_print(Image* img);
int main(){
    //定义Image的实例对象 
    Image img{}; 
    //初始化img对象中的image属性为函数指针 
    img.image_=image;
    //调用void(*image_)(Image*,int); 方法
    img.image_(&img,0);
    // 调用 void(*image_print)(Image*);方法 
    img.image_print(&img);
    //调用 void(*set_value)(Image*,point_2d,int);方法 
    img.set_value(&img,point_2d{2,1},1);
    // 调用 void(*image_print)(Image*);方法 
    img.image_print(&img);
    //输出当前image的坐标点位 
    printf("(%d,%d)= %d\n",2,1, img.get_value(&img,point_2d{2,1}));
 
}
 
/*!
 *
 * @param img 参数为图像指针对象
 * @param pt 点位对象 
 * @param value int类型的值  
 * @note 给图像上pt点位设置value值,如果pt点位不在图像点位范围内,则输出“pt error“ 
 */
void set_value(Image* img,point_2d pt,int value){
    //判断当前 点位x的是否大于图像对应x的值,当前点位y是否大于图像对应y的值
    //目的是用来判断当前pt点位坐标是否在图像坐标范围内,如果在则添加到data中。 
    if(pt.x>img->size_x_||pt.x<0||pt.y>img->size_y_||pt.y<0){
        printf("pt error!\n");
        return;
    }
    img->data_[pt.y][pt.x]=value;
}
/*!
 *
 * @param img 图像指针对象 
 * @param pt 点位对象 
 * @return 返回图像上pt点位所对应的值 
 * @note 得到图像上pt点位对应的值,如果pt点位不在图像点位范围内,则输出“pt error”,并返回-1 
 */
int get_value(Image* img,point_2d pt)
{
    //目的是用来判断当前pt点位坐标是否在图像坐标范围内,如果不在说明当前pt是异常的点位 
    if(pt.x>img->size_x_||pt.x<0||pt.y>img->size_y_||pt.y<0)
    {
        printf("pt error!\n");
        return -1;
    }
    return img->data_[pt.y][pt.x];
}
 
/*
打印图像上的所有pt点位对应的值 
*/
void image_print(Image* img)
{
    //输出图像的x、y大小 
    printf("size_x = %d,size_y = %d \n",img->size_x_,img->size_y_);
    printf("data is: \n");
    //输出所有的pt点位对应的值 
    for (int y=0;y<img->size_y_;y++)
    {
        for(int x=0;x<img->size_x_;x++)
            printf(" %d", get_value(img,point_2d{x,y}));
        printf("\n");
    }
    printf("\n");
}
 
//构造函数,用来初始化img对象 
void image(Image* img,int default_value)
{
    img->default_value_=default_value;
    img->size_y_=sizeof(img->data_)/sizeof(img->data_[0]);
    img->size_x_=sizeof(img->data_[0])/sizeof(img->data_[0][0]);
    img->get_value=get_value;
    img->set_value=set_value;
    img->image_print=image_print;
    for (int y=0;y<img->size_y_;y++)
        for(int x=0;x<img->size_x_;x++)
            img->set_value(img,point_2d{x,y},img->default_value_);
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632