请教的内容如下:
先定义一个结构体:
typedef struct {
void (*CalcCRC16)(void*);
void (*Check)(void*);
void (*WriteoneMemory)(void*);
void (*ReadMemory)(void*);
void (*WriteMultiMemory)(void*);
void (*SendStart)(void*);
……
}MODBUS
然后定义一个宏:
#define MODBUS_DEFAULTS { \
(void(*)(void*)) ModbusCalcCRC16,\
(void(*)(void*)) ModbusCheck,\
(void(*)(void*)) ModbusWriteOneMemory,\
(void(*)(void*)) ModbusReadMemory,\
(void(*)(void*)) ModbusWriteMultiMemory,\
(void(*)(void*)) ModbusSendStart\
}
在主程序中要将这个宏初始化给这个结构体,
请问(void(*)(void*)) 这么多的void和*, 它们的含义到底是什么啊?
如果前面的结构体是这样的,下面的初始化又要如何啊?请高手指点
typedef struct {
void (*CalcCRC16)(void);
void (*Check)(void);
void (*WriteoneMemory)(void);
void (*ReadMemory)(void);
void (*WriteMultiMemory)(void);
void (*SendStart)(void);
请高手指点,谢谢!
Young Hu:
typedef struct {
void (*CalcCRC16)(void*);
void (*Check)(void*);
void (*WriteoneMemory)(void*);
void (*ReadMemory)(void*);
void (*WriteMultiMemory)(void*);
void (*SendStart)(void*);
……
}MODBUS
里面全是函数地址。。
#define MODBUS_DEFAULTS { \
(void(*)(void*)) ModbusCalcCRC16,\
(void(*)(void*)) ModbusCheck,\
(void(*)(void*)) ModbusWriteOneMemory,\
(void(*)(void*)) ModbusReadMemory,\
(void(*)(void*)) ModbusWriteMultiMemory,\
(void(*)(void*)) ModbusSendStart\
}
将函数名(地址)强制类型转换为(void(*)(void*))型的。
初始化,将您写好的函数void (*SendStart)(void*)的名字sendstart赋值过去就可以了。
请教的内容如下:
先定义一个结构体:
typedef struct {
void (*CalcCRC16)(void*);
void (*Check)(void*);
void (*WriteoneMemory)(void*);
void (*ReadMemory)(void*);
void (*WriteMultiMemory)(void*);
void (*SendStart)(void*);
……
}MODBUS
然后定义一个宏:
#define MODBUS_DEFAULTS { \
(void(*)(void*)) ModbusCalcCRC16,\
(void(*)(void*)) ModbusCheck,\
(void(*)(void*)) ModbusWriteOneMemory,\
(void(*)(void*)) ModbusReadMemory,\
(void(*)(void*)) ModbusWriteMultiMemory,\
(void(*)(void*)) ModbusSendStart\
}
在主程序中要将这个宏初始化给这个结构体,
请问(void(*)(void*)) 这么多的void和*, 它们的含义到底是什么啊?
如果前面的结构体是这样的,下面的初始化又要如何啊?请高手指点
typedef struct {
void (*CalcCRC16)(void);
void (*Check)(void);
void (*WriteoneMemory)(void);
void (*ReadMemory)(void);
void (*WriteMultiMemory)(void);
void (*SendStart)(void);
请高手指点,谢谢!
yanzhen fu:
回复 Young Hu:
请问(void(*)(void*))是什么类型,能分析一下吗?如果我定义的是这样的指针:void(*SendStart)(int,int)的话,我又要如何去定义这个初始化强制类型转换呢?为什C语言中查不到相关的说明呢?
请教的内容如下:
先定义一个结构体:
typedef struct {
void (*CalcCRC16)(void*);
void (*Check)(void*);
void (*WriteoneMemory)(void*);
void (*ReadMemory)(void*);
void (*WriteMultiMemory)(void*);
void (*SendStart)(void*);
……
}MODBUS
然后定义一个宏:
#define MODBUS_DEFAULTS { \
(void(*)(void*)) ModbusCalcCRC16,\
(void(*)(void*)) ModbusCheck,\
(void(*)(void*)) ModbusWriteOneMemory,\
(void(*)(void*)) ModbusReadMemory,\
(void(*)(void*)) ModbusWriteMultiMemory,\
(void(*)(void*)) ModbusSendStart\
}
在主程序中要将这个宏初始化给这个结构体,
请问(void(*)(void*)) 这么多的void和*, 它们的含义到底是什么啊?
如果前面的结构体是这样的,下面的初始化又要如何啊?请高手指点
typedef struct {
void (*CalcCRC16)(void);
void (*Check)(void);
void (*WriteoneMemory)(void);
void (*ReadMemory)(void);
void (*WriteMultiMemory)(void);
void (*SendStart)(void);
请高手指点,谢谢!
Young Hu:
回复 yanzhen fu:
这是C语言的问题了,估计在一些专门介绍指针的数据中会介绍。不过可以自己分析嘛。
首先,void*可以指向任何类型的数据,比如float, char等等,这样就增加了函数的灵活性。
(void(*)(void*))类型的函数,传入参数为指向任何类型数据的指针,返回参数为指向任何类型数据的指针。
举个例子
(void(*)(void*))SendStart可以这么去定义
void* SendStart(void*a)
{
….//做处理
return a;
}
调用时:
int a;
int *p;
p=SendStart(&a);
或者
char a;
char *p;
p=SendStart(&a);
void(*SendStart)(int,int)是错的。
请教的内容如下:
先定义一个结构体:
typedef struct {
void (*CalcCRC16)(void*);
void (*Check)(void*);
void (*WriteoneMemory)(void*);
void (*ReadMemory)(void*);
void (*WriteMultiMemory)(void*);
void (*SendStart)(void*);
……
}MODBUS
然后定义一个宏:
#define MODBUS_DEFAULTS { \
(void(*)(void*)) ModbusCalcCRC16,\
(void(*)(void*)) ModbusCheck,\
(void(*)(void*)) ModbusWriteOneMemory,\
(void(*)(void*)) ModbusReadMemory,\
(void(*)(void*)) ModbusWriteMultiMemory,\
(void(*)(void*)) ModbusSendStart\
}
在主程序中要将这个宏初始化给这个结构体,
请问(void(*)(void*)) 这么多的void和*, 它们的含义到底是什么啊?
如果前面的结构体是这样的,下面的初始化又要如何啊?请高手指点
typedef struct {
void (*CalcCRC16)(void);
void (*Check)(void);
void (*WriteoneMemory)(void);
void (*ReadMemory)(void);
void (*WriteMultiMemory)(void);
void (*SendStart)(void);
请高手指点,谢谢!
yanzhen fu:
回复 Young Hu:
为什么说void(*SendStart)(int,int)是错的呢,这可是函数指针的定义方法啊。后面形参只给出类型,不用参数,
前面说的参数是任意类型指针和返回值是任意类型指针我明白了,谢谢!
请教的内容如下:
先定义一个结构体:
typedef struct {
void (*CalcCRC16)(void*);
void (*Check)(void*);
void (*WriteoneMemory)(void*);
void (*ReadMemory)(void*);
void (*WriteMultiMemory)(void*);
void (*SendStart)(void*);
……
}MODBUS
然后定义一个宏:
#define MODBUS_DEFAULTS { \
(void(*)(void*)) ModbusCalcCRC16,\
(void(*)(void*)) ModbusCheck,\
(void(*)(void*)) ModbusWriteOneMemory,\
(void(*)(void*)) ModbusReadMemory,\
(void(*)(void*)) ModbusWriteMultiMemory,\
(void(*)(void*)) ModbusSendStart\
}
在主程序中要将这个宏初始化给这个结构体,
请问(void(*)(void*)) 这么多的void和*, 它们的含义到底是什么啊?
如果前面的结构体是这样的,下面的初始化又要如何啊?请高手指点
typedef struct {
void (*CalcCRC16)(void);
void (*Check)(void);
void (*WriteoneMemory)(void);
void (*ReadMemory)(void);
void (*WriteMultiMemory)(void);
void (*SendStart)(void);
请高手指点,谢谢!
yanzhen fu:
回复 yanzhen fu:
我现在要问的是,如果我前面定义了一个带型参的参函数时,在初始化时,我又要怎样去定义一个函数指针?谢谢!