[英]Returning values from function
我对C编程非常陌生。 我写了休闲代码
float value; //golbal variable
unsigned int data; //golbal variable
void Maxphase(void)
{
float MAX = 0.0;
unsigned int i,index;
for (i=0;i<=360;i++)
{
phaseset(i);
data = readvalue();
value = voltage(data);
if(value>MAX) //find max value
{
MAX = value; //max voltage
index = i;
}
}
printf("Max Voltage Value:%f\r\n", MAX);
printf("Related index Value:%d\r\n", index);
}
上面的代码可以正常工作,并打印最大电压和索引。 我想从此函数返回值“ Max”和“ index”,我必须将Max值保存在一个变量中,将索引值保存在其他变量中。
void runCom(void){
c=getchar();
switch(c){
case '1':
Maxphase();
Vin= (I want to store MAX value of that function)
p1= ( I want to store Index of that function)
break;
default:
break;
}
}
实际上,我想调用该函数,并且它必须返回两个变量MAX和索引值,因此我想将这两个值存储在不同的变量中。
我知道函数不能返回两个值。
我进行了搜索,发现有可能使用struct或使函数能够处理带有指针的参数。 我尝试使用struct,如下所示。
typedef struct {
float v;
unsigned int p;
}volphase;
我已经在头文件中声明了这个结构。 我在所有要调用的文件中都包含此头文件。
volphase Maxphase()
{
volphase vp;
float MAX = 0.0;
unsigned int i,index;
for (i=0;i<=360;i++)
{
phaseset(i);
data = readvalue();
value = voltage(data);
if(value>MAX) //find max value
{
MAX = value; //max voltage
index = i;
}
}
vp.v=MAX;
vp.p=index;
return vp;
}
这写在“ bvr.c”文件中。 但是我正在考虑如何在case'1'(main.c)中调用此“结构”,以及如何将vp.v存储在一个变量中并将vp.p存储在另一个变量中。
如果结构写错了,请提出建议。 或其他任何最简单的方法将返回两个值。
请帮我怎么做。
从函数返回struct
是返回多个值的两种方法中最少的一种。 使用指针更为常见:
void Maxphase(float *max, unsigned int *index)
{
*max = 0.0;
float value;
unsigned int i, data;
for (i=0;i<=360;i++)
{
phaseset(i);
data = readvalue();
value = voltage(mux1);
if(value > *max) //find max value
{
*max = value; //max voltage
*index = i;
}
}
printf("Max Voltage Value:%f\r\n", *max);
printf("Related index Value:%d\r\n", *index);
}
这是调用此函数的方式:
int main() {
float max;
unsigned idx;
Maxphase(&max, &idx);
printf("Max Voltage Value:%f\r\n", max);
printf("Related index Value:%d\r\n", idx);
return 0;
}
我将从函数返回相位-函数名称为MaxPhase,这意味着它返回最大相位值。 可以使用指针返回找到最大值的索引。
请注意, data
值未使用,而mux1
未定义。 还要注意,我使用idx
代替了index
因为后者有时已经在标准库中定义了(尽管可能不是在您的库中定义的)。
float MaxPhase(int * maxindex)
{
float max = 0.0;
int idx = -1;
for (int i=0; i<=360; i++) {
phaseset(i);
unsigned int data = readvalue();
float value = voltage(mux1);
if (value > max) {
max = value;
idx = i;
}
}
*maxindex = idx;
return max;
}
void caller(void)
{
int idx = 0;
float phase = MaxPhase(&idx);
printf("Max Voltage Value:%f\n", phase);
printf("Related index Value:%d\n", idx);
...
}
#include <stdio.h>
struct lol
{
float val;
int ind;
};
void olol(struct lol *lol1)
{
lol1->val = 5;
lol1->ind = 3;
}
int main(void) {
struct lol mylol = {0,0};
olol(&mylol);
printf("lololol %f %d \n", mylol.val, mylol.ind);
printf("lol\n");
return 0;
}
您可以通过几种不同的方式解决此问题:
1.定义一个包含两个值的结构并返回该结构。
#include <stdlib.h>
struct Values {
int v1, v2;
};
struct Values *get2Values () {
struct Values *x=(struct Values*)malloc (sizeof (struct Values));
x->v1=1;
x->v2=1231;
return x;
}
瞧,如果不正确对待返回的值,就会发生内存泄漏。
2.使用指针作为值将要到达的参数,例如,指针:
void get2Values (int *v1, int *v2) {
*v1=1;
*v2=131231;
}
int main () {
int a1, a2;
get2Values (&a1, &a2);
}
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.