d****i 发帖数: 4809 | 1 C里定义一个函数,用generic pointer void*作为调入参数,如下
void function(void *a, int N)
其中a是一个array,N是array的长度,怎么可以在function中对array a[]进行操作呢
,如果预先不知道calling function中传进来的是int array还是double array还是其
他array? 是否需要另外传进来一个关于array类型的参数? |
a****l 发帖数: 8211 | 2 现在很多的语言不准你做这种事,根本原因就是因为很多人想不通为什么C准许你做这种
事,然后没想通就依样画葫芦照着做,然后就是地球爆炸了.
【在 d****i 的大作中提到】 : C里定义一个函数,用generic pointer void*作为调入参数,如下 : void function(void *a, int N) : 其中a是一个array,N是array的长度,怎么可以在function中对array a[]进行操作呢 : ,如果预先不知道calling function中传进来的是int array还是double array还是其 : 他array? 是否需要另外传进来一个关于array类型的参数?
|
p***o 发帖数: 1252 | 3 也不是不准做,C有macro, C++有template,java有generics
【在 a****l 的大作中提到】 : 现在很多的语言不准你做这种事,根本原因就是因为很多人想不通为什么C准许你做这种 : 事,然后没想通就依样画葫芦照着做,然后就是地球爆炸了.
|
d****i 发帖数: 4809 | 4 C里面是怎么做的呢?比如上例中的void *a,如果不传类型的话,在函数中怎么知道
array的类型?
【在 p***o 的大作中提到】 : 也不是不准做,C有macro, C++有template,java有generics
|
d****p 发帖数: 685 | 5 He mentioned macro for C.
Sth like:
#define PROCESS_ARRAY(T,p,n) {\
T* p2 = p;\
int i;\
for (i = 0; i < n; ++i)\
printf("%d", p2[i];\
}
in your code...
typedef int MyType;
MyType a[] = {1,2,3};
PROCESS_ARRAY(MyType, a, sizeof(a)/sizeof(MyType))
【在 d****i 的大作中提到】 : C里面是怎么做的呢?比如上例中的void *a,如果不传类型的话,在函数中怎么知道 : array的类型?
|
p***o 发帖数: 1252 | 6 嗯,差不多,就是BS在C++ D&E里谈到的原始的template。另外也可以把
函数指针用进去,就像qsort这个C库函数那样。不过用C写费力不讨好,
用C++方便很多。
【在 d****p 的大作中提到】 : He mentioned macro for C. : Sth like: : #define PROCESS_ARRAY(T,p,n) {\ : T* p2 = p;\ : int i;\ : for (i = 0; i < n; ++i)\ : printf("%d", p2[i];\ : } : in your code... : typedef int MyType;
|
d****i 发帖数: 4809 | 7 qsort这个函数的参数中还是有size_t size这样的参数来表示输入array的元素大小,
但是象我一开始举的例子那样没有表示每个元素大小的参数
void function(void *a, int N)
{
int i;
for(i=0;i
printf("%a",a[i]);
}
这样做是错的,因为void pointer不可以被dereferencing,必须cast成相应的类型才可
以,在没有传入size_t size的情况下怎么做呢?(假设不能用Macro)
【在 p***o 的大作中提到】 : 嗯,差不多,就是BS在C++ D&E里谈到的原始的template。另外也可以把 : 函数指针用进去,就像qsort这个C库函数那样。不过用C写费力不讨好, : 用C++方便很多。
|
d****p 发帖数: 685 | 8 这样可能无解。
【在 d****i 的大作中提到】 : qsort这个函数的参数中还是有size_t size这样的参数来表示输入array的元素大小, : 但是象我一开始举的例子那样没有表示每个元素大小的参数 : void function(void *a, int N) : { : int i; : for(i=0;i: printf("%a",a[i]); : } : 这样做是错的,因为void pointer不可以被dereferencing,必须cast成相应的类型才可 : 以,在没有传入size_t size的情况下怎么做呢?(假设不能用Macro)
|
d****p 发帖数: 685 | 9 多说一句个人体会。
宏可以主要用来省敲字:我很爱用##操作符。不过要干净还是多用模板吧。如果考虑函
数指针,不如考虑函数对象体更C++一些。
【在 p***o 的大作中提到】 : 嗯,差不多,就是BS在C++ D&E里谈到的原始的template。另外也可以把 : 函数指针用进去,就像qsort这个C库函数那样。不过用C写费力不讨好, : 用C++方便很多。
|
p***o 发帖数: 1252 | 10 有时候人不让你用C++,只好用宏+函数指针了 ...
【在 d****p 的大作中提到】 : 多说一句个人体会。 : 宏可以主要用来省敲字:我很爱用##操作符。不过要干净还是多用模板吧。如果考虑函 : 数指针,不如考虑函数对象体更C++一些。
|
|
|
t*******t 发帖数: 105 | 11 java genrics 对于int double 能work吗?
【在 p***o 的大作中提到】 : 也不是不准做,C有macro, C++有template,java有generics
|
p***o 发帖数: 1252 | 12 我不懂java,看过一些早先的介绍里要拿个类box一下。
【在 t*******t 的大作中提到】 : java genrics 对于int double 能work吗?
|
g*****g 发帖数: 34805 | 13 It's autobox/unbox.
【在 p***o 的大作中提到】 : 我不懂java,看过一些早先的介绍里要拿个类box一下。
|
w*********l 发帖数: 1337 | 14 谁说用C费力不讨好?
【在 p***o 的大作中提到】 : 嗯,差不多,就是BS在C++ D&E里谈到的原始的template。另外也可以把 : 函数指针用进去,就像qsort这个C库函数那样。不过用C写费力不讨好, : 用C++方便很多。
|
G****A 发帖数: 4160 | 15 C不知道, c++里好像template是专门来做这儿事的。
template
void function(Any &a, int N)
{
...
...
}
【在 d****i 的大作中提到】 : C里定义一个函数,用generic pointer void*作为调入参数,如下 : void function(void *a, int N) : 其中a是一个array,N是array的长度,怎么可以在function中对array a[]进行操作呢 : ,如果预先不知道calling function中传进来的是int array还是double array还是其 : 他array? 是否需要另外传进来一个关于array类型的参数?
|
a****l 发帖数: 8211 | 16 this is totally different from LZ's case. Day and night difference.
【在 G****A 的大作中提到】 : C不知道, c++里好像template是专门来做这儿事的。 : template : void function(Any &a, int N) : { : ... : ... : }
|
G****A 发帖数: 4160 | 17 en,看错了
【在 a****l 的大作中提到】 : this is totally different from LZ's case. Day and night difference.
|