目录
在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);