社区
C语言
帖子详情
一个关于函数调用的问题
realduke2000
2007-07-13 02:34:27
func.h里函数列表,我想调用里面的函数.
现在问题是里面的函数是变化的,也就是说不知道里面的函数的名,参数等一些信息,
这些信息是从外面传进来的,传进来的信息可以自定义,比如:函数参数列表,参数总数,函数的序号,你甚至可以用宏定义将FUNC.H里面的函数重新命名,但是就是不确定他们都是什么...
应该怎么解决,不知道我说没说明白.
其实就是我要写一个测试别人程序的程序,这个程序就是调用别人的函数了什么的
...全文
251
15
打赏
收藏
一个关于函数调用的问题
func.h里函数列表,我想调用里面的函数. 现在问题是里面的函数是变化的,也就是说不知道里面的函数的名,参数等一些信息, 这些信息是从外面传进来的,传进来的信息可以自定义,比如:函数参数列表,参数总数,函数的序号,你甚至可以用宏定义将FUNC.H里面的函数重新命名,但是就是不确定他们都是什么... 应该怎么解决,不知道我说没说明白. 其实就是我要写一个测试别人程序的程序,这个程序就是调用别人的函数了什么的
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
realduke2000
2007-07-17
打赏
举报
回复
感觉cppunit/lite跟我需要的情况不一样,我需要的是根据测试用例调用函数,而不是一开始写好的测试用例....
不过好象也可以这么做...
realduke2000
2007-07-17
打赏
举报
回复
cppunitlite是什么收获?我看了CPPUNIT,主要是依靠宏替换在里面简略了不少自己写的麻烦...
但是C能实现么?
taodm
2007-07-17
打赏
举报
回复
建议你看cppunitlite,而不是cppunit。
realduke2000
2007-07-17
打赏
举报
回复
每次增加一个类型的函数,确实需要增加一个CALL函数,但是做不到CPPUNIT那么好,我应该去看看CPPUNIT是怎么实现的...
xiantongyuan
2007-07-17
打赏
举报
回复
那不需要给每个重新写一个测试程序吗
你能考虑哪么周全吗?
realduke2000
2007-07-17
打赏
举报
回复
重新写了一个,但是参数传递问题还没有解决...
希望有高人给指点一下
-----------------------------test.c------------------------------------------------
#include "call.h"
#include "funstru.h"
#include "mat.h"
int main()//参数列表和参数个数
{
unsigned char argv[10];
// int *argv=malloc(sizeof(int)*10),argc=-1,*p;
// p=argv;
int i_1=0,j_2=0,k_3=0;
//定义一个函数的序号结构
__fun_struct__ fs;
// do//模拟读入脚本驱动用例的内容
// {
// scanf("%d",p);
// argc++;
// }while(*p++!=-1);
while(1)
{
printf("输入类型、函数序号\n");
scanf("%d,%d",&fs.type_id,&fs.id);
point_to(fs);//将函数指针指向相应函数
switch(fs.type_id)//根据函数序号来确定调用那个函数
{
case 0:
call_void(pFUNC_0);
break;
case 1:
//j_2=call_int(pFUNC_1,argv[0],argv[1]);
j_2=call_int(pFUNC_1,2,4);
break;
case 2:
//k_3=call_int_int(pFUNC_2,argv[0],argv[1],argv[2]);break;
k_3=call_int_int(pFUNC_2,2,3,4);break;
default:printf("error!\n");break;
}
printf("\ni_1=%d,j_2=%d,k_3=%d\n",i_1,j_2,k_3);
}
return 0;
}
----------------------------------------------------------------------------------
-----------------------------mat.h------------------------------------------------
#ifndef MAT_H_
#define MAT_H_
#include "stdarg.h"
#include "stdio.h"
int add(int var1,int var2)//type_id=1,id=0;
{
return var1+var2;
}
int add3(int var1,int var2,int var3)//type_id=2,id=1;
{
return var1+var2+var3;
}
void print(void)//type_id=0,id=3;
{
printf("hello,world");
}
int sub(int var1,int var2)//type_id=1,id=4;
{
return var1-var2;
}
int func(int i,...)
{
return i;
}
--------------------------------------------------------------------------------
-----------------------------reg.h------------------------------------------------
#ifndef REG_H_
#define REG_H_
#include "mat.h"
#include "funstru.h"
/*
1.按要求将指针指向相应函数
*/
//定义很多种类型的函数指针
void (*pFUNC_0)(void);
int (*pFUNC_1)(int,int);
int (*pFUNC_2)(int,int,int);
//根据类型号和函数id将函数指针指向函数
int point_to(__fun_struct__ fs/*类型*/)
{
//将函数指针指向相应的函数
switch(fs.type_id)//先判断类型
{
case 0:
switch(fs.id)
{
case 3:
pFUNC_0=print;
break;
default:
printf("point--to case 0's default");
break;
}
case 1:
switch(fs.id)//再判断函数序号
{
case 0:
pFUNC_1=add;
break;
case 4:
pFUNC_1=sub;
break;
default:
printf("point_to--fs.id's default");
break;
}
break;
default:
printf("point_to's defaut");
break;
}
return 0;
}
#endif
------------------------------------------------------------------------------------
-----------------------------call.h------------------------------------------------
#ifndef CALL_H_
#define CALL_H_
#include "reg.h"
//定义很多类型的函数的调用函数
int call_void(void (*funp)(void))
{
funp();
return 0;
}
int call_int(int (*funp)(int,int),int var1,int var2)
{
return funp(var1,var2);
}
int call_int_int(int (*funp)(int,int,int),int var1,int var2,int var3)
{
return funp(var1,var2,var3);
}
#endif
----------------------------funstru.h--------------------------------------------
#ifndef FUNSTRU_H_
#define FUNSTRU_H_
typedef struct
{
//函数序号
unsigned char id;
//函数类型
unsigned char type_id;
//输入
unsigned char input[10];
}__TestCase__;
/*
#define FUNC_0(var1,...) add(var1,__VA_ARGS__)
#define FUNC_1(var1,...) add(var1,__VA_ARGS__)
#define FUNC_2(var1,...) add3(var1,__VA_ARGS__)
*/
#endif
-----------------------------------------------------------------------------
sdy3653232
2007-07-15
打赏
举报
回复
你是说通过外部探测知道内部构造么?
mymtom
2007-07-15
打赏
举报
回复
学习关注!
prgmBaggio
2007-07-14
打赏
举报
回复
如果你连文件里有什么函数都不知道,你怎么去调用呢?
guzhilei1986
2007-07-13
打赏
举报
回复
不明白。学习了。
realduke2000
2007-07-13
打赏
举报
回复
reg.h这个文件是每次改动函数需要改动的,这不就是不知道函数名,参数,但是还得调用么...
看来我的表达能力还有待提高啊
realduke2000
2007-07-13
打赏
举报
回复
我已经弄出来了,大家看看吧,就是这个意思
------------------------------mat.h-------------------------------------------------
#include "stdarg.h"
#include "stdio.h"
int add(int var1,int var2)
{
return var1+var2;
}
int add3(int var1,int var2,int var3)
{
return var1+var2+var3;
}
------------------------------------------------------------------------------------
-------------------------------reg.h------------------------------------------------
#include "mat.h"
#define FUNC_0(var1,...) add(var1,__VA_ARGS__)
#define FUNC_1(var1,...) add(var1,__VA_ARGS__)
------------------------------------------------------------------------------------
-----------------------------test.c-------------------------------------------------#include "reg.h"
int main()
{
int *argv=malloc( sizeof(int) * 10 ),argc=-1,*p;
int i_1=0,j_2=0,k_3=0;
p=argv;
do//读入脚本驱动用例的内容
{
scanf("%d",p);
argc++;
}while(*p++!=-1);
switch(argc)//根据参数和函数序号来确定调用那个函数
{
//case 1:i_1=FUNC_0(argv[0]);break;
case 2:j_2=FUNC_1(argv[0],argv[1]);break;
case 3:k_3=FUNC_2(argv[0],argv[1],argv[2]);break;
default:printf("error!\n");break;
}
printf("i_1=%d,j_2=%d,k_3=%d",i_1,j_2,k_3);
return 0;
}
------------------------------------------------------------------------------------
felixskycao
2007-07-13
打赏
举报
回复
不知道lz的意思
beyond907
2007-07-13
打赏
举报
回复
不明白!
taodm
2007-07-13
打赏
举报
回复
没看懂。
infrared-remote-candroid studiodemo
android studio下载
【新质生产力】新质生产力赋能智能制造数字化解决方案.pptx
【新质生产力】新质生产力赋能智能制造数字化解决方案.pptx
基于matlab实现的用于应用布格重力异常数据反演地下异常密度体.rar
基于matlab实现的用于应用布格重力异常数据反演地下异常密度体.rar
node-v8.10.0-linux-x64.tar.xz
Node.js,简称Node,是
一个
开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
基于Yolov5目标检测和deepsort目标跟踪无人机跟踪.zip
无人机最强算法源码,易于部署和学习交流使用
C语言
69,377
社区成员
243,076
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章