社区
C语言
帖子详情
一个关于函数调用的问题
realduke2000
2007-07-13 02:34:27
func.h里函数列表,我想调用里面的函数.
现在问题是里面的函数是变化的,也就是说不知道里面的函数的名,参数等一些信息,
这些信息是从外面传进来的,传进来的信息可以自定义,比如:函数参数列表,参数总数,函数的序号,你甚至可以用宏定义将FUNC.H里面的函数重新命名,但是就是不确定他们都是什么...
应该怎么解决,不知道我说没说明白.
其实就是我要写一个测试别人程序的程序,这个程序就是调用别人的函数了什么的
...全文
263
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
打赏
举报
回复
没看懂。
c++ primer第五版第6章答案
c++ primer第五版第6章答案
最全的C和C++语言笔试面试题汇总
最全的C和C++语言笔试面试题汇总,我大四时候找工作时候他帮上了很多忙,里面的题目经常考到。希望对大家有帮助。
Socket编程例子
Socket编程例子
Dalvik虚拟机 PPT版
Android应用程序是运行在Dalvik虚拟机里面的,并且每
一个
应用程序对应有
一个
单独的Dalvik虚拟机实例。Android应用程序中的Dalvik虚拟机实例实际上是从Zygote进程的地址空间拷贝而来的,这样就可以加快Android应用程序的启动速度。Dalvik虚拟机与Java虚拟机共享有差不多的特性,例如,它们都是解释执行,并且支持即时编译(JIT)、垃圾收集(GC)、Java本地方法调用(JNI)和Java远程调试协议(JDWP)等,差别在于两者执行的指令集是不一样的,并且前者的指令集是基本寄存器的,而后者的指令集是基于堆栈的。这个PPT讲Dalvik虚拟机的内存管理、垃圾收集、即时编译、Java本地调用、进程和线程管理等。理解Dalvik虚拟机的上述实现细节,有助于在运行时修改程序的行为,例如,拦截Java函数的调用。
python
一个
函数调用
另
一个
函数的参数_python 如何在
一个
函数里通过传参数调用其他函数?...
Python中函数参数的传递是通过“赋值”来传递的。但这条规则只回答了函数参数传递的“战略
问题
”,并没有回答“战术
问题
”,也就说没有回答怎么赋值的
问题
。函数参数的使用可以分为两个方面,一是函数参数如何定义,二是函数在调用时的参数如何解析的。而后者又是由前者决定的。函数参数的定义有四种形式:1. F(arg1,arg2,...)2. F(arg2=,arg3=...)3. F(*arg1)4. F(...
C语言
70,034
社区成员
243,244
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章