代码编译报‘invalid type argument of unary '*' (have 'int')’错误原因排查
问题分析与修复
编译错误的直接原因
你代码里的arr0[s] = *array[s];这行是明显的语法错误:
- 函数参数
uint8_t array[]在C语言中会被自动转换为uint8_t *array,array[s]本身等价于*(array + s),已经是uint8_t类型的数值,完全不需要再加*解引用。 - Dev-C++使用的编译器对语法检查比较宽松,放过了这个错误;但STM32CubeIDE用的GCC编译器规则更严格,直接报错说你给一元
*操作符传了int类型的参数——因为array[s]是数值,不是指针,不能用*操作。
把这行改成下面这样就能解决编译错误:
arr0[s] = array[s];
代码里的其他潜在问题
除了编译错误,原代码还有两个明显的问题:
- 使用
pow(2, s)计算2的幂:pow是浮点数运算函数,不仅计算效率低,还可能因为浮点数精度误差导致结果错误(比如当s较大时,pow(2,23)可能无法精确表示为整数)。 - 没必要额外创建
outputData数组存储每一位的掩码结果,直接通过位运算累加结果可以大幅简化代码,提升效率。
优化后的简洁代码
如果只是要完成“把三个8位寄存器转成24位整数”的需求,最简洁高效的写法是直接用位运算拼接:
uint32_t bin2Int(uint8_t array[]) { uint32_t IntResult = 0; // array[0]是最高8位,左移16位;array[1]左移8位;array[2]是最低8位 IntResult |= (uint32_t)array[0] << 16; IntResult |= (uint32_t)array[1] << 8; IntResult |= array[2]; return IntResult; }
如果一定要保留逐位处理的逻辑(比如需要验证每一位的状态),可以改成下面这样,避免浮点数运算:
uint32_t bin2Int(uint8_t array[]) { uint32_t IntResult = 0; uint8_t mask = 0x80; // 处理最高8位(array[0]) for(uint8_t i = 0; i < 8; i++){ if(array[0] & mask){ IntResult |= 1U << (23 - i); } mask >>= 1; } mask = 0x80; // 处理中间8位(array[1]) for(uint8_t i = 0; i < 8; i++){ if(array[1] & mask){ IntResult |= 1U << (15 - i); } mask >>= 1; } mask = 0x80; // 处理最低8位(array[2]) for(uint8_t i = 0; i < 8; i++){ if(array[2] & mask){ IntResult |= 1U << (7 - i); } mask >>= 1; } return IntResult; }
内容的提问来源于stack exchange,提问作者Idix
相关产品推荐
相关产品推荐

