社区
C语言
帖子详情
一个关于函数调用的问题
realduke2000
2007-07-13 02:34:27
func.h里函数列表,我想调用里面的函数.
现在问题是里面的函数是变化的,也就是说不知道里面的函数的名,参数等一些信息,
这些信息是从外面传进来的,传进来的信息可以自定义,比如:函数参数列表,参数总数,函数的序号,你甚至可以用宏定义将FUNC.H里面的函数重新命名,但是就是不确定他们都是什么...
应该怎么解决,不知道我说没说明白.
其实就是我要写一个测试别人程序的程序,这个程序就是调用别人的函数了什么的
...全文
267
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章答案
Android安全机制 PPT版本
Android应用程序是运行在
一个
沙箱中。这个沙箱是基于Linux内核提供的用户ID(UID)和用户组ID(GID)来实现的。Android应用程序在安装的过程中,安装服务PackageManagerService会为它们分配
一个
唯一的UID和GID,以及根据应用程序所申请的权限,赋予其它的GID。有了这些UID和GID之后,应用程序就只能限访问特定的文件,一般就是只能访问自己创建的文件。此外,Android应用程序在调用敏感的API时,系统检查它在安装的时候会没有申请相应的权限。如果没有申请的话,那么访问也会被拒绝。对于有root权限的应用程序,则不受上述沙箱限制。此外,有root权限的应用程序,还可以通过Linux的ptrace注入到其它应用程序进程,以及系统进程,进行各种
函数调用
拦截。
Dalvik虚拟机 PPT版
Android应用程序是运行在Dalvik虚拟机里面的,并且每
一个
应用程序对应有
一个
单独的Dalvik虚拟机实例。Android应用程序中的Dalvik虚拟机实例实际上是从Zygote进程的地址空间拷贝而来的,这样就可以加快Android应用程序的启动速度。Dalvik虚拟机与Java虚拟机共享有差不多的特性,例如,它们都是解释执行,并且支持即时编译(JIT)、垃圾收集(GC)、Java本地方法调用(JNI)和Java远程调试协议(JDWP)等,差别在于两者执行的指令集是不一样的,并且前者的指令集是基本寄存器的,而后者的指令集是基于堆栈的。这个PPT讲Dalvik虚拟机的内存管理、垃圾收集、即时编译、Java本地调用、进程和线程管理等。理解Dalvik虚拟机的上述实现细节,有助于在运行时修改程序的行为,例如,拦截Java函数的调用。
c++
一个
构造函数 调用 另
一个
构造函数
c++
一个
构造函数 调用 另
一个
构造函数 你看到的这个文章来自于http://www.cnblogs.com/ayanmw 由于最近写的代码 发现有点异常,值怎么是错误的呢?明明修改了的。 经过调试,发现原来 是构造函数里面的
问题
。 搜索:c++
一个
构造函数 调用 另
一个
构造函数 发现,原来这就是
一个
普遍的
问题
,编译器也木有给警告,其实语法完全合理,如果是java的
Python函数必须先定义、后调用(
函数调用
函数例外)
java开发者在定义类中的方法时,不会关心方法的定义相对于调用语句的位置。 但是python中需要注意:函数必须先定义、后调用(
函数调用
函数例外)。 如下为示例说明: 1、python函数的应用一般需要:先定义、后调用: 2、如果函数定义在调用之后,执行将报错: 3、函数中调用函数不受此限制: 4、但是语句对
函数调用
,必须在
函数调用
之后,包括直接调用的
函数调用
的其他函数也必...
C语言
70,037
社区成员
243,243
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章