3

私が持っているとしましょう

struct my_type_t {
    int x;
    int y;
    int z;
};

struct my_array_t {
    struct my_type_t test;
    int otherstuff;
};

int main(void) {
    struct my_array_t arrayofstructs[200];
    somefunction(arrayofstructs);

    return 0;
}

void somefunction(struct my_array_t *arrayofstructs, somevariable) {
    for (int i; i < 200; i++) {
        //Do stuff to 
        arrayofstructs->test[i].somevariable;
    }
}

構造体の配列のそのメンバー (x、y、または z) を処理するように関数に指示するには、どのように somevariable を渡すことができますか?

ありがとう!

4

4 に答える 4

1

事実 1:arrayofstructsではなく 、合格する必要があり&arraystructsます。

あなたの問題に対処する方法は次のようになります:

void someFn(data_type *var , int somevar) {
  ...
  ...
  ...
  switch(somevar) {

  case <some_value>:
  some_task;
  break;

  ...
  ...
  ...
  } //End switch

  }

つまり、各メンバーに関連する識別子を渡し、選択構造を使用して入力識別子に従って特定のタスクを実行します。

簡単な例でsomevarは、整数にすることができ、整数の値が何に対応するかを知っている必要があります。

編集

または、次のことができます

struct mystr{
  int mem[3];
}

void someFn(struct mystr a, int somevar){ 

  //now access those with a[i].mem[somevar]
}

それは冗長性をクリアするのに役立ちます:)

于 2013-04-15T18:19:59.363 に答える
0

関数がそれらを区別できるように、いくつかの異なる値を使用するだけです。enum次のように、 、一部#defineの 、またはおそらく aを使用できますchar

void somefunction(struct my_array_t *arrayofstructs, char whichVar) {
    for (int i; i < 200; i++) {
        //Do stuff to 
        switch(whichVar){
            case 'x': arrayofstructs->test[i].x; break;
            case 'y': arrayofstructs->test[i].y; break;
            case 'z': arrayofstructs->test[i].z; break;
        }
    }
}

#defines またはenums を使用すると、値に意味のある名前を付けることができるため、一般的にはより良い方法と見なされることに注意してください。ここでのchar使い方は一例です。

マジック ナンバーとは何か、なぜそれが悪いのかを参照してください。

于 2013-04-15T18:21:44.080 に答える
0
enum FieldTypes
{
   FIELD_X,
   FIELD_Y,
   FIELD_Z
};

int main(void)
{
    struct my_array_t arrayofstructs[200];
    somefunction(arrayofstructs,FIELD_X);

    return 0;
}

void somefunction(struct my_array_t *arrayofstructs, FieldTypes somevariable) 
{
    switch( somevariable )
    {
        case FIELD_X:

           for (int i; i < 200; i++) 
           {
               //Do stuff to arrayofstructs->test[i].x; 
           }
           break;

        case FIELD_Y:

           for (int i; i < 200; i++) 
           {
               //Do stuff to arrayofstructs->test[i].y; 
           }
           break;

        case FIELD_Z:

           for (int i; i < 200; i++) 
           {
               //Do stuff to arrayofstructs->test[i].z;
           }
           break;
    }
}

意図が常に同じ操作を実行することであるが、渡された値に基づいて構造の別の要素に対して実行するだけの場合は、次のように実行できます...

void somefunction(struct my_array_t *arrayofstructs, FieldTypes somevariable) 
{
    for (int i; i < 200; i++) 
    {
        int* workingValue;

        switch( somevariable )
        {
            case FIELD_X: workingValue = &arrayofstructs->test[i].x;  break;
            case FIELD_Y: workingValue = &arrayofstructs->test[i].y;  break;
            case FIELD_Z: workingValue = &arrayofstructs->test[i].z;  break;
        }

        // do stuff to *workingValue -- no redundant code here
    }
}
于 2013-04-15T18:16:55.007 に答える