如果RECIPE_TypeDef和U8的数据类型一样那你这么写还能接受,如果不一样你这么写就不规范了,虽然同一编译系统中地址的字节大小是一样的,但是包含的意义是不同的,对不同数据类型的地址进行一些操作得到结果是不同的。在c语言中还是强调在同种数据类型间进行数据操作,虽然现在也有很多能进行隐形数据转换,这也是减少隐藏bug的基本做法 |
hy47566398 发表于 2024-6-11 01:02 这么做意义就不大了,本意是“U8 xdata vbhHoldReg[]”定义一堆长数组用于支持MODBUS访问支持,RECIPE_TypeDef xdata *vsRecipe[10]只是一堆数据中的少部分,所以定义成不同类型还是很重要的。 |
U8 xdata vbhHoldReg[sizeof(RECIPE_TypeDef)*10U]; 改成: RECIPE_TypeDef xdata vbhHoldReg[10]; RECIPE_TypeDef *vsRecipe = &vbhHoldReg; 访问: 第5个和第10个元素: (vsRecipe + 4)->whTimeDry = 1; (vsRecipe + 9)->whTimeDry = 2; x = vsRecipe + 4; y = vsRecipe + 9; |
这就是了,vbhHoldReg存储的的是10个 RECIPE_TypeDef 大小的数据(某些场合也可看作是10个 RECIPE_TypeDef 的数组),vsRecipe是10个 RECIPE_TypeDef xdata * 的数组,两个数组元素类型都不同,出错是正常。还有“RECIPE_TypeDef xdata *vsRecipe[10] = &vbhHoldReg[0];”这句能编译通过? |
littlespider 发表于 2024-6-9 08:32 U8 xdata vbhHoldReg[sizeof(RECIPE_TypeDef)*10U]; 数组类型是unsigned char. |
xxxevery 发表于 2024-6-8 22:29 恭喜你,答错了,正好相反,可以跟踪一下debug窗口。 |
30.19 KB, 下载次数: 1
keilDEMO
“*vsRecipe[10] = &vbhHoldReg[0]; ”vsRecipe是个指针数组(元素类型是:RECIPE_TypeDef xdata*),不清楚你的 vbhHoldReg是不也是指针数组。总之: vsRecipe[2] = vbhHoldReg[2],*(vsRecipe[2]) != vbhHoldReg[2] 如果 vbhHoldReg 的元素类型是 RECIPE_TypeDef xdata 的话,猜你可能需要的是 RECIPE_TypeDef xdata *vsRecipe = &vbhHoldReg[0]; 或者 RECIPE_TypeDef xdata *vsRecipe = vbhHoldReg; |
你只要搞清楚vsRecipe是数组不是指针,就应该明白表达二用法有问题 |