2012-11-06 175 views
1

我对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,如下所示。

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)中调用这个“struct”,以及如何将vp.v存储在一个变量中,并将vp.p存储在另一个变量中。

如果在编写struct时出现任何错误,请告诉我。或者返回两个值的任何其他最简单的方法。

请帮助我如何做到这一点。

+5

您的意思是'Maxphase()''来返回vp'? – chrisaycock

+0

@chrisaycock是的,现在你可以看看我编辑。我正在返回vp,但是如何在case'1'中调用这个结构并将这两个值vp.v存储在某个变量中,并将vp.p存储在另一个变量中。 – PRV

回答

3

从函数中返回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; 
} 
+0

Maxphase函数返回错误的值。现在它返回最后的读取值,而不是最大值。 –

+0

@BartvanIngenSchenau上述代码中的错误是什么。 – PRV

+0

@BartvanIngenSchenau你是对的,我认为理所当然的OP声明版本与全球工作正常。这现在已经修复。 – dasblinkenlight

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); 
} 

祝你好运!

+0

这被标记为C. – Lundin

+0

相信我或没有,它花了一整天的时间来理解它。正在谷歌搜索“标签C”,但无法理解。现在硬币掉了...(我不是英语母语的人) – pbhd

+0

在这个网页上的文本搜索会显示答案:) – Lundin

1

我会从函数返回相位 - 函数名称是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); 

    ... 
} 
1
#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; 
}