作者ranshell (Ran)
看板C_and_CPP
标题Re: [问题] 阵列的内容是函数指标
时间Mon Oct 12 15:38:30 2009
※ 引述《VictorTom (鬼翼&娃娃鱼)》之铭言:
: ※ 引述《tyc5116 (累人啊....)》之铭言:
: : 恩....V大提供的方法我看的不是很懂....XDDD
: : 有点复杂,一时间还看不太出来...
: : 我目前做的东西是类似控制机台的人机介面,根据输入的指令不同
: : 他要驱动的机台动作或机台种类也不同
: : 可能版上相同背景的人不多,我换个方式来说
: : 一般我们在写程式前须要有流程图,再根据流程图写出所有的程式
: : 而目前想做到的是,让使用者在PC上画出流程图,便能产生相对应的程式码
: : 大概有这样的意思,而目前的对象是机器,所以会有我原来问的那种问题..
: : 大概就是这样吧....
: 使用func ptr array会遇到一个问题, 你的参数型态要一样才能宣告array...
: (如果小弟这个观念错了, 就不用理会後面的文章了....^^||)
: 那麽要让它宣告时是一样型态, 可是内容又照你实作的做, 就是强转型....
: Ex1: funcp[0]内部其实是处理两个int....
: main()
: {
: int x, y; // 给适当值.
: (*func[0])((void*)&x, (void*)&y);
: }
: func[0]指到的func实体....
: funcInt(void* para1, void* para2)
: {
: int x = *(int*)para1, y = *(int*)para2;
: 内容....
: }
: Ex2: funcp[1]内部其实是处理两个double....
: main()
: {
: double x, y;
: (*func[1])((void*)&x, (void*)&y);
: }
: func[1]指到的func实体....
: funcDouble(void* para1, void *para2)
: {
: double x = *(double*)para1, y = *(double*)para2;
: 内容....
: }
: Ex3: funcp[2]要混搭风....
: main()
: {
: char x;
: float y[10];
: (*func[2])((void*)&x, (void*)y);
: }
: func[2]....
: funcMix(void* para1, void *para2)
: {
: char x = *(char*) para1;
: float y = (float*) para2;
: }
: 所以你会发现, 其实不同index里如果不同型态, code会满恶心的....
: caller与callee之间的sync完全是programmer(也就是你)要顾好的....
: 如果连回传型态都不同, 就要传入第三个参数来写回传值了....
: 如果连参数的数量都不同........我觉得你要换一个策略写code....XD
: 如果不同func其实只有传入型态不同, 用func overloading就够了....
: 你可以写一堆func名字都一样, Ex:
: func(int x, int y)
: func(double x, double y)
: func(char x, float *y)....etc
: template的用法有待板上其他强者补完, 小弟C++不熟Orz
: 以上, 因为是随手打的没有测过, 有漏误的也请板上大大指正<(_ _)>
: ==
: 所以你要写flow chart -> code的automatic code generator??
嗯 可以考虑试试这种方式
typedef struct {
enum _PASS_TYPE type;
union {
struct pass_data_a;
struct pass_data_b;
.....
}pass_data;
} pass;
int main(void) {
pass test;
pass.type = _PASS_TYPE_A;
pass.pass_data.pass_data_a = ...;
return 0;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.250.140.195
1F:推 tyc5116:抱歉,这个程式码看的懂,但和原来的问题我连不起来...@@ 10/12 19:41
2F:→ VictorTom:就是用union把最大可能传的参数用pass这个结构包起来, 10/12 19:43
3F:→ VictorTom:然後搭配.type与.pass_data来存放参数吧; "搞刚"一点也 10/12 19:44
4F:→ VictorTom:可以搞个linked-list自己做不定常度的参数出来XD 10/12 19:44
5F:→ VictorTom:PS. 他这样的写法, 你传的参数就统一是pass那个型态了. 10/12 19:45
6F:→ VictorTom: 所以你的func ptr array就可以运作了, 当然, 每个 10/12 19:46
7F:→ VictorTom: array的内容你还是要caller/callee自己去刻/解析:) 10/12 19:46