9015|29

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

C语言动态调用方法 [复制链接]

可能需求讲的比较复杂....

如何动态选择执行一条,或者是如何动态的调用一个方法???
不知道有什么技巧吗?





  1. #define FRAME0 {语句...}
  2. #define FRAME1 {语句...}
  3. #define FRAME2 {语句...}
  4. #define FRAME3 {P0=0x0f;P1=0x0f;语句...}
  5. #define FRAME4 {P0=0x0f;语句...}
  6. int time[5]={1,2,1,2,3};

  7. for(int i=0;i
  8. {
  9.    time[i];///这里可以指定i调用int类型
  10.    FRAME0////这里怎么办?如果i=0则执行FRAME0
  11. ///如果i=1则执行FRAME1,,i=2则执行FRAME2////这个宏调用怎么实现???动态的根据i值调用宏  
  12. }


复制代码




此帖出自编程基础论坛

最新回复

如果不是在中断中运行且运行时间没有超过定时器间隔时间,就不会影响定时。  详情 回复 发表于 2009-12-14 20:22
点赞 关注
 

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

  1. 这样是也许可以解决...
  2. 用一个方法,直接传入i值,怎么样???呵呵
  3. void(int methodName)
  4. {
  5.        if(methodName=0)
  6.        {FRAME0;}
  7. if(methodName=1)
  8.        {FRAME1;}

  9. if(methodName=2")
  10.        {FRAME2;}
  11. .....................

  12. }
复制代码


主要是我不想修改for循环里面的代码...

  1. for(int i=0;i
  2. {
  3.    time[i];///这里可以指定i调用int类型
  4.    FRAME0////这里怎么办?如果i=0则执行FRAME0 ///如果i=1则执行FRAME1,,i=2则执行FRAME2////这个宏调用怎么实现???动态的根据i值调用宏  
  5. }

复制代码
此帖出自编程基础论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
先友情帮顶下,明天再看
此帖出自编程基础论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 xblue3 的回复:
C/C++ code
这样是也许可以解决...
用一个方法,直接传入i值,怎么样???呵呵void(int methodName)
{if(methodName=0)
       {FRAME0;}if(methodName=1)
       {FRAME1;}if(methodName=2")       {FRAME2;}
.....................

}

主要是我不想修改for循环里面的代码...
C/C++ codefor(int i=0;i {
   time;///这里可以指定i调用int类型   FRAME0////这里怎么办?如果i=0则执行FRAME0///如果i=1则执行FRAME1,,i=2则执行FRAME2////这个宏调用怎么实现???动态的根据i值调用宏}


直接对i进行switch就是了噻



  1. #define Frame(indexM) \
  2. { \
  3.     switch (indexM) \
  4.     { \
  5.         case 0: \
  6.             FRAME0; \
  7.             break; \

  8.         case 1: \
  9.             FRAME1; \
  10.             break; \

  11.         default: \
  12.             break; \
  13.     } \
  14. }
复制代码


只是不管怎么样调用这些代码最终还是修改了for循环体内的代码了的, 所以说用哪种方法来都可以, 不管是用一个函数还是用一个宏函数, 就看楼主怎么权衡了。
此帖出自编程基础论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
此路不通~~~!


老老实实用if 或 switch去做吧.
此帖出自编程基础论坛
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

6
 
你用for语句是不行的  那样四次循环执行的内容是一样的

只能用四个if 或者switch 来把四种情况分开 这是最简单的方法
此帖出自编程基础论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼主 好好分析下FOR 与if 、switch,问题就OK了。
此帖出自编程基础论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
switch分支语句就已经可以解决楼主的需求了。难道还想用那个臭名昭著的goto?
此帖出自编程基础论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
函数指针数组,不需要宏函数。
大致如下:


  1. void Func1()
  2. {
  3. //具体的实现
  4. }

  5. void Func2()
  6. {
  7. //具体的实现
  8. }

  9. ...

  10. void FuncN()
  11. {
  12. //具体的实现
  13. }

  14. typedef void (*FUNC)();

  15. const FUNC g_FuncTable[] = {Func1, Func2, Func3, ..., FuncN};

  16. unsigned char TableSize = sizeof(g_FuncTable) / sizeof(g_FuncTable[0]);
  17. unsigned char i = 0;

  18. for(i = 0; i < TableSize; i++)
  19. {
  20.    (*FuncTable[i])();
  21. }
复制代码
此帖出自编程基础论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 jiqiang01234 的回复:
函数指针数组,不需要宏函数。
大致如下:
C/C++ codevoid Func1()
{//具体的实现}void Func2()
{//具体的实现}

...void FuncN()
{//具体的实现}

typedefvoid (*FUNC)();const FUNC g_FuncTable[]= {Func1, Func2, Func3, ..., FuncN};

unsignedchar TableSize=sizeof(g_FuncTable)/sizeof(g_FuncTable[0]);
unsignedchar i=0;for(i=0; i< TableSize; i++)
{
   (*FuncTable)();
}


jiqiang01234 兄...真是太谢谢您了...你这个方法才是我要的.哈哈
昨天晚上看了你的定时器,实在是高深!
有没有IM啊?惠赐一个,谢谢...
此帖出自编程基础论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 

  1. #define FRAME0 {语句...}
  2. #define FRAME1 {语句...}
  3. #define FRAME2 {语句...}
  4. #define FRAME3 {P0=0x0f;P1=0x0f;语句...}
  5. #define FRAME4 {P0=0x0f;语句...}
复制代码

可以保留我的宏吗?一定要定义成方法吗?里面全是P0=0x0f;P1=0x0f;
这些方法都是差不多一样的格式,就是数据不一样...
此帖出自编程基础论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

12
 
对了,我是89S51的芯片,可以用吗?有警告哦..

Build target 'Target 1'
compiling main.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?TEST?MAIN
Program Size: data=34.0 xdata=0 code=584
"mead_c" - 0 Error(s), 1 Warning(s).
此帖出自编程基础论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 xblue3 的回复:
对了,我是89S51的芯片,可以用吗?有警告哦..

Build target 'Target 1'
compiling main.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
? ? SEGMENT: ?PR?TEST?MAIN
Program Size: data=34.0 xdata=0 code=584
"mead_c" - 0 Error(s), 1 Warning(s).

函数指针在c51中使用得非常谨慎,因为有可能被OVERLAY(覆盖),具体的说明你可以看一下keil的帮助,在BL51 User's Guide->Data Overlaying一节。不过你放心,在rom中存放的的函数指针,不存在overlay的情况。所以,编译器的警告在此情况下不影响。
此帖出自编程基础论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 10 楼 xblue3 的回复:
#define FRAME0 {语句...}#define FRAME1 {语句...}#define FRAME2 {语句...}#define FRAME3 {P0=0x0f;P1=0x0f;语句...}#define FRAME4 {P0=0x0f;语句...}
可以保留我的宏吗?一定要定义成方法吗?里面全是P0=0x0f;P1=0x0f;
这些方法都是差不多一样的格式,就是数据不一样...


为何一定要用宏来实现动态选择?没有参数的函数调用,也仅仅比宏多了跳转和返回指令,你的程序如此需要效率,连这点时间都需要节省吗?
更根本的一点是,“宏”是在编译期就确定的,而你的想法是想在运行期动态选择,这是本质的矛盾。因此,根本无法实现把“宏”在运行期进行动态选择。
此帖出自编程基础论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

15
 
Really appreciate U....
THX very much, Hero.
此帖出自编程基础论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

16
 
其实也不是动态调用,我是用代码生成器生成这个C语言的.
想在定时器,逻辑业务那块尽量的简化,
所以把数据都集中到最前面来...
用方法实现也可以,我用代码生成器生成<方法>的代码就好了.

不过不知道用宏,可以实现吗?只是好奇...呵呵.我对C语言懂的太少了.

非常感谢jiqiang01234, lots of thanks.

Best Wishes, and good luck...
此帖出自编程基础论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

17
 
呵呵,又学到新东西了
此帖出自编程基础论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

18
 
平时从来没有用过函数指针,请问一下jiqiang01234:
如果这些函数队列里面返回值不同
unsigned int Func1();
unsigned char* Func2();
..........
要什么写?谢谢!
此帖出自编程基础论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

19
 
长见识了!
此帖出自编程基础论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 15 楼 xblue3 的回复:
其实也不是动态调用,我是用代码生成器生成这个C语言的.
想在定时器,逻辑业务那块尽量的简化,
所以把数据都集中到最前面来...
用方法实现也可以,我用代码生成器生成 <方法>的代码就好了.

keil的代码生成器?第一次听说,长见识了,不学习不行啊。
此帖出自编程基础论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条
电源解决方案和技术 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表