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

如何在C语言中用同一函数实现返回值与传引用并合并函数

合并速率获取函数的可行方案

你的两个函数核心逻辑完全一致,都是对runningrate做truncf转换后强转为uint16_t,只是返回结果的方式不同——一个通过指针输出,一个直接返回值。可以通过以下两种方式合并,同时覆盖两种使用场景:

方案一:保留单一返回值函数,适配两种场景

只保留直接返回值的函数,在需要填充CAN缓冲区时,直接将返回值赋值给指针指向的变量即可:

static float runningrate;

uint16_t GetRate(void) {
    return (uint16_t)truncf(runningrate);
}

场景用法:

  • 打印到控制台:直接使用返回值
    printf("Current rate: %u\n", GetRate());
    
  • 填充CAN缓冲区:将返回值赋值给目标指针
    void fill_can_buffer(uint16_t* rate) {
        if (rate != NULL) {
            *rate = GetRate();
        }
    }
    

这种方式最简洁,完全消除了代码冗余,且两种场景的调用逻辑清晰直观。

方案二:实现同时支持两种输出方式的函数

如果希望用一个函数同时支持“直接返回”和“指针输出”两种模式,可以设计带可选指针参数的函数:

static float runningrate;

uint16_t GetRate(uint16_t* out_rate) {
    uint16_t calculated_rate = (uint16_t)truncf(runningrate);
    // 如果传入有效指针,就把计算结果写入指针指向的地址
    if (out_rate != NULL) {
        *out_rate = calculated_rate;
    }
    // 同时返回计算结果
    return calculated_rate;
}

场景用法:

  • 打印到控制台:传入NULL忽略指针输出,直接用返回值
    printf("Current rate: %u\n", GetRate(NULL));
    
  • 填充CAN缓冲区:传入目标缓冲区的指针
    uint16_t can_buffer_val;
    GetRate(&can_buffer_val);
    // 此时can_buffer_val已被填充好,可用于CAN发送
    

这种方案保留了两种输出方式的灵活性,同时只维护一份计算逻辑,后续修改逻辑时只需改动一处。

内容的提问来源于stack exchange,提问作者ro88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:05:17