qq_73895884 2022-10-10 07:44 采纳率: 76.9%
浏览 50
已结题

如何按图中要求去理解这个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

  • 写回答

3条回答 默认 最新

  • 关注

    函数功能注释如下:

    #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_);
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月18日
  • 已采纳回答 10月10日
  • 修改了问题 10月10日
  • 创建了问题 10月10日

悬赏问题

  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法