下午求助了几位年轻的C++村民:
我用C++和COM都出现了数据指针和函数指针不规范或不标准转换的警告.
在VC++下没问题,但在DSP的CCS3.1环境下就出现了警告.
我用所有C++或C的强制转换都未果,甚至用中间变量折腾一次也不行~~~
H文件:
typedef long HRESULT;
typedef interface IHotAsmArrayCom IHotAsmArrayCom;
typedef struct IHotAsmArrayComVtbl
{
void (*comASMArray)(void);//定义数组可执行汇编的函数指针
int (*comintASMArray)(void);//定义数组可执行汇编的函数指针
void (*comASMArrayInt)(int);//定义数组可执行汇编的函数指针
int (*comintASMArrayInt)(int);//定义数组可执行汇编的函数指针
}IHotAsmArrayComVtbl;
interface IHotAsmArrayCom
{
struct IHotAsmArrayComVtbl *lpVtbl;
};
extern void HotCOMDemo(void);
C文件:
void HotCOMDemo(void)
{
TI_IREG __ASMCodeArray[]=
{//下面的"数据"实际为汇编代码
__asm_push__(ASMCODE_REGS_AR6),
__asm_push__(ASMCODE_REGS_AR7),
__asm_frame__(-15),
__asm_char_SetACC__(0x88),
__asm_frame__(15),
__asm_pop__(ASMCODE_REGS_AR7),
__asm_pop__(ASMCODE_REGS_AR6),
__asm_return__(),
};
TI_IREG __intASMCodeArray[]=
{//下面的"数据"实际为汇编代码
__asm_push__(ASMCODE_REGS_AR6),
__asm_push__(ASMCODE_REGS_AR7),
__asm_frame__(-15),
__asm_char_SetACC__(0x88),
__asm_frame__(15),
__asm_pop__(ASMCODE_REGS_AR7),
__asm_pop__(ASMCODE_REGS_AR6),
__asm_return__(),
};
TI_IREG __ASMCodeArrayInt[]=
{//下面的"数据"实际为汇编代码
__asm_push__(ASMCODE_REGS_AR6),
__asm_push__(ASMCODE_REGS_AR7),
__asm_frame__(-15),
__asm_char_SetACC__(0x88),
__asm_frame__(15),
__asm_pop__(ASMCODE_REGS_AR7),
__asm_pop__(ASMCODE_REGS_AR6),
__asm_return__(),
};
TI_IREG __intASMCodeArrayInt[]=
{//下面的"数据"实际为汇编代码
__asm_push__(ASMCODE_REGS_AR6),
__asm_push__(ASMCODE_REGS_AR7),
__asm_frame__(-15),
__asm_char_SetACC__(0x88),
__asm_frame__(15),
__asm_pop__(ASMCODE_REGS_AR7),
__asm_pop__(ASMCODE_REGS_AR6),
__asm_return__(),
};
TI_IREG result, parameter = 0x1234;
//申请COM接口指针
IHotAsmArrayCom *AsmArrayCom = new (IHotAsmArrayCom*)[sizeof(IHotAsmArrayCom)];
//挂接汇编数组代码到COM接口
AsmArrayCom->lpVtbl->comASMArray = (ASMCodeArray_FPtr)__ASMCodeArray;
AsmArrayCom->lpVtbl->comintASMArray = (intASMCodeArray_FPtr)__intASMCodeArray;
AsmArrayCom->lpVtbl->comASMArrayInt = (ASMCodeArrayInt_FPtr)__ASMCodeArrayInt;
AsmArrayCom->lpVtbl->comintASMArrayInt = (intASMCodeArrayInt_FPtr)__intASMCodeArrayInt;
//通过COM访问汇编数组中的汇编代码
AsmArrayCom->lpVtbl->comASMArray();
result = AsmArrayCom->lpVtbl->comintASMArray();
AsmArrayCom->lpVtbl->comASMArrayInt(0x1234);
result = AsmArrayCom->lpVtbl->comintASMArrayInt(0x1234);
delete AsmArrayCom;
}
再一种:
H文件:
typedef void (*ASMCodeArray_FPtr)(void);//定义数组可执行汇编的函数指针
typedef int (*intASMCodeArray_FPtr)(void);//定义数组可执行汇编的函数指针
typedef void (*ASMCodeArrayInt_FPtr)(int);//定义数组可执行汇编的函数指针
typedef int (*intASMCodeArrayInt_FPtr)(int);//定义数组可执行汇编的函数指针
extern void HotASMDemo(void);
C文件:
void ASMObj::ArrayProcess(ASMCodeArray_FPtr process)
{
process();//
}
__TI_IREG ASMObj::ArrayFunction(intASMCodeArray_FPtr function)
{
return function();
}
void ASMObj::ArrayProcess(ASMCodeArrayInt_FPtr process, __TI_IREG arg)
{
process(arg);//
}
__TI_IREG ASMObj::ArrayFunction(intASMCodeArrayInt_FPtr function, __TI_IREG arg)
{
return function(arg);
}
void HotASMDemo(void)
{
TI_IREG __ASMCodeArray[]=
{//下面的"数据"实际为汇编代码
__asm_pushACC__(),
__asm_char_SetACC__(0x88),
__asm_popACC__(),
__asm_return__(),
};
TI_IREG __intASMCodeArray[]=
{//下面的"数据"实际为汇编代码
__asm_char_SetACC__(0x88),
__asm_return__(),
};
TI_IREG __ASMCodeArrayInt[]=
{//下面的"数据"实际为汇编代码
__asm_char_SetACC__(0x88),
__asm_return__(),
};
TI_IREG __intASMCodeArrayInt[]=
{//下面的"数据"实际为汇编代码
__asm_char_SetACC__(0x88),
__asm_return__(),
};
TI_IREG result, parameter = 0x1234;
ASM.ArrayProcess((ASMCodeArray_FPtr)(__ASMCodeArray));
result = ASM.ArrayFunction((intASMCodeArray_FPtr)__intASMCodeArray);
ASM.ArrayProcess((ASMCodeArrayInt_FPtr)__ASMCodeArrayInt, parameter);
result = ASM.ArrayFunction((intASMCodeArrayInt_FPtr)__intASMCodeArrayInt, parameter);
} |
|