OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10199|回复: 13

大侠请进,请求一个问题,关于函数的再定义,不知道可行不

[复制链接]

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2012-8-17 21:03:49 | 显示全部楼层 |阅读模式
最近进行GUI的移植,但是给的函数里面有一些限制,譬如GUI_ClearRect(x0,y0,x1,y1);函数清除一个矩形区域,但是GUI使用手册上有限制,说是矩形的终点X1,Y1坐标都必须大于起点X0,Y0的坐标值,否则无法绘出该矩形,试验之后确实不可以,F12了之后,发现在
void LCD_FillRect(int x0, int y0, int x1, int y1) {
  /* Perform clipping and check if there is something to do */
CLIP_X();
if (x1<x0)
return;
CLIP_Y();
if (y1<y0)
return;
  /* Call driver to draw */
  LCDDEV_L0_FillRect(x0,y0,x1,y1);
}
函数中对x0,x1的值进行了判断,如果不满足条件就直接退出,这里我想修改一下,修改成自己的代码


但是为了又不想在他的代码上直接修改,就想新建一个.C文件,在这个.C文件里面重新定义这些函数,名字仍用成一样的,就相当于C语言中的预处理标识符#undef,

如果以前定义过这个函数,就把这个函数的定义取消掉,同时再定义一遍,但是编辑器又不会报错,说重复定义

譬如预处理命令一样:

#define A  a        //定义过这个函数

#undef A            //把这个函数的定义取消掉

#define A            //再定义一遍

仿照上面的,不知道对于一个函数的定义可不可以这样……探讨一下,欢迎拍砖,呵呵
























































努力,前进。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-17 21:08:02 | 显示全部楼层
回复【楼主位】5498折戟沉沙:
---------------------------------
应该是可以的.
不过不建议去改动.
ucGUI可能环环相扣,你改了这里,其他函数调用如果得不到正确的响应,结果就是越跑越乱...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-8-17 21:14:52 | 显示全部楼层
自己写一个函数,调整矩形后再调用  LCD_FillRect

修改别人的源码我也觉得是不可取的,因为别人的代码不是由你自己维护的,如果哪一天人家升级了代码或者修改了内部一些BUG,就比较麻烦了。除非你是想把人家的吸收进来变成自己的库。

想增加灵活性可以自己写一些函数进行再封装。

不过就这个问题, x1>x0, y1>y0 在 VC 的画图函数里面也是这样的,见怪不怪了。
https://github.com/roxma
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-8-17 21:21:05 | 显示全部楼层
回复【3楼】Pony279:
---------------------------------
我跟踪了一下,它画矩形,是通过画线实现的,画线又是连续画点实现的,这样在画点的时候就有的时候是从上往下画竖线,从左往右画横线,所以它在这儿加了一个判断,但是如果它考虑到这方面的话,自己调整一下岂不是更好,为什么要return呢,想不明白


不过这种对函数重新定义的方法可行不??有这样的操作吗??
努力,前进。
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-8-17 21:22:15 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
嗯,我也想到了这个,所以想自己写一个函数

不过从理论角度出发,这种对函数重新定义的情况,能实现吗?
努力,前进。
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-8-17 21:31:35 | 显示全部楼层
回复【3楼】Pony279:
---------------------------------
你说的再封装是不是自己写一写函数,然后用到的时候用自己的函数来实现???

那么现在有一个问题,有的时候时间长了自己也会忘记有的函数是否被自己修改过,可不可以这样修改一下程序,在程序编译的时候如果调用了一些我们自己不想调用的函数,就提示一个警告之类的,不知道可以不?
努力,前进。
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-8-17 21:36:41 | 显示全部楼层
一种方法是把原来的函数定义为 [弱符号],不过还是得在原来的 .c 里面加点东西。
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-8-17 21:41:20 | 显示全部楼层
“在程序编译的时候如果调用了一些我们自己不想调用的函数,就提示一个警告之类的”

在现在有C语言的链接机制下,这个估计是做不到的,要么直接用宏定义把那个函数名定义为空。
没必要考虑那么多,一个好的库都必须配有文档的,忘记了也无所谓。
https://github.com/roxma
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-8-18 13:00:41 | 显示全部楼层
回复【8楼】Pony279:
---------------------------------
今天早上忽然想到一种方法,我用宏定义的方法,把他GUI中的函数名字给定义成我新函数的名字,

如此简单实现了功能

稍微演示一下

#define GUI_SetBkColor GUI_SetBkColor_myself

这样当我调用GUI_SetBkColor 函数时,就自动调用了我GUI_SetBkColor_myself这个函数,呵呵呵







努力,前进。
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-8-18 13:01:47 | 显示全部楼层
有的函数如果感觉不爽的话,就这样宏定义一下,把我自己的函数写成一个.C文件,这样既没有修改它本身的库,而且以后移植的时候只需要把这个.C文件移植过去就可以了,呵呵呵
努力,前进。
回复 支持 反对

使用道具 举报

27

主题

147

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2012-8-11
在线时间
0 小时
发表于 2012-8-18 13:24:17 | 显示全部楼层
好主意~~
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-8-18 13:28:14 | 显示全部楼层
回复【11楼】Alexinx:
---------------------------------
呵呵
努力,前进。
回复 支持 反对

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-3-18
在线时间
2 小时
发表于 2012-8-18 22:21:38 | 显示全部楼层
感觉做个函数指针更好些,比如说原始的函数是
void Func();

现在你想用你的函数代替这个函数,你可以在该函数所在的文件中定义一个函数指针
void (*Func)();
把原来的函数改个名字,比如FuncA()
把Func指向你自己的函数就行了
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-8-19 14:44:49 | 显示全部楼层
我是不想修改它的函数,才这样弄的了
努力,前进。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 10:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表