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 値を 1 つの変数に保存し、Index 値を別の変数に保存する必要があります。

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

実際には、その関数を呼び出して、2 つの変数 MAX とインデックス値を返す必要があるため、これら 2 つの値を異なる変数に格納したいと考えています。

関数が 2 つの値を返せないことはわかっています。

検索したところ、構造体を使用するか、関数を作成して引数をポインターで処理できることがわかりました。以下に示すように、構造体で試しました。

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 を 1 つの変数に格納し、vp.p を別の変数に格納する方法を考えています。

構造体の記述に何か問題がある場合は、私に提案してください。または2つの値を返す他の最も簡単な方法。

これを行う方法を教えてください。

4

4 に答える 4

3

関数からa を返すことstructは、複数の値を返す 2 つの方法の中で最も一般的ではありません。ポインターの使用はより一般的です。

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;
}
于 2012-11-06T21:47:42.067 に答える
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);

    ...
}
于 2012-11-06T21:58:11.920 に答える
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;
}
于 2012-11-06T21:58:32.083 に答える
0

これは、いくつかの異なる方法で解決できます。

1. 2 つの値を含む構造体を定義し、その構造体を返します。

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

幸運を!

于 2012-11-06T21:56:21.423 に答える