You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码编译报‘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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:45:35