函数如何返回多个返回值

       

目录

1、使用指针

2、使用结构体


        在C语言中,虽然函数本身不能直接返回多个值,但可以通过几种方法来模拟这种行为。最常用的方法是通过指针结构体来返回多个值。

1、使用指针

        函数的参数定义为指针类型,然后在函数内部修改这些指针所指向的值。这样,当函数返回时,这些值已经被修改,并且可以通过原始指针访问。

#include <stdio.h>  
  
// 使用指针返回两个整数值  
void getTwoInts(int *a, int *b) 
{  
    *a = 10;  
    *b = 20;  
}  
  
int main()
 {  
    int x, y;  
    getTwoInts(&x, &y);  
    printf("(%d, %d)\n", x, y); // 输出: (10, 20)  
    return 0;  
}

但是需要多个返回值时,显然使用指针显得就比较麻烦。

2、使用结构体

        使用结构体可以完美的解决返回多个返回值的问题。

简单的举个例:

// 定义一个结构体来包含多个返回值  
typedef struct {
    int first;
    int second;
    float third;
    char ch;

} IntPair;

// 函数返回一个结构体 
IntPair getPair() 
{
    IntPair p;
    p.first = 1;
    p.second = 2;
    p.third = 3.14;
    p.ch = 'w';
    return p;
}

int main() 
{
    IntPair p = getPair();
    printf("(%d, %d, %.2f, %c)\n", p.first, p.second, p.third, p.ch ); // 输出: (1, 2, 3.14, w)  
    return 0;
}

在M4中的实际使用:

光敏、毒气和芯片内部温度传感器都进行转换,ADC1要有三个转换,封装一个函数返回三个转换后的数据。

ADC.h

结构体的定义--->若跨文件使用需要声明全局变量extern

#ifndef _ADC_H
#define _ADC_H

#include "stm32f4xx.h"
typedef struct adc
{
	u16 adc_light;//光敏
	u16 adc_gas;//毒气
	float adc_temp;//温度
	
}ADC_t;


#endif 

ADC.c

结构体的赋值--->函数的返回值需要定义为结构体类型,返回的是结构体变量

/*
函数名:get_3sensor_data
函数功能:光敏&毒气&温度传感器获取数据函数
返回值:void
形参:void
函数说明:
*/
ADC_t get_3sensor_data(void)
{
	 ADC_t data;
	 u16 temp;
	
	//开始转换
	ADC1->CR2 |= (1 << 30);//开始转换规则通道

	//等待转换完成  光敏
	while(!(ADC1->SR & (1 << 1)));
	//获取转换数据
	data.adc_light  = ADC1->DR;
	
	//等待转换完成   毒气
	while(!(ADC1->SR & (1 << 1)));
	//获取转换数据
	data.adc_gas   = ADC1->DR;
	
	//等待转换完成   温度
	while(!(ADC1->SR & (1 << 1)));
	//获取转换数据
	temp = ADC1->DR;
	data.adc_temp = (temp * (3.3/4096)*1000 - 760) / 2.5 + 25;
	
	return data;
}

main.c

结构体的引用--->结构体变量来接收返回值

        ADC_t data = get_3sensor_data();//引用

        //光敏检测
        data.adc_light  = 100 - data.adc_light / 4096.0 * 100;
        if(data.adc_light <= 30)         {ALL_LED_ON();}
        else                             {ALL_LED_OFF();}
        printf("光照强度:%d%%\r\n",data.adc_light);
        
        //毒气检测
        data.adc_gas = data.adc_gas / 4096.0 * 100;
        if(data.adc_gas >= 30)            {Beep_ON;}
        else                              {Beep_OFF;}
        printf("毒气浓度:%d%%\r\n",data.adc_gas);
        
        //芯片内部温度
        printf("芯片内部温度:%.1f℃\r\n",data.adc_temp);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值