0

typedef struct box の複数のインスタンスがあるため、box box1、box box2 などです。構造体のメンバーは、長さ、幅、高さなどです。

typedef struct 
{
    int width;
    int height;
} box;

box box1;
box box2;

各ボックス インスタンスのすべての幅メンバーで動作する関数を作成するにはどうすればよいですか? 私の混乱は、box のすべてのインスタンスで機能する typedef 構造体メンバーへのポインターを渡す方法です。box1.width のような特定のインスタンス メンバーにポインターを渡す方法は知っていますが、.width を渡してから実行する方法は知っています。

box1.width=value;
box2.width=value;
box3.width=value;

関数内?

4

5 に答える 5

3

多くの個別のインスタンスではなく、配列の使用を検討することをお勧めします。

typedef struct 
{
    int width;
    int height;
} Box;

Box boxes[3];                   // array of 3 boxes

for (b = 0; b < 3; b++)         // set `width` field of all boxes to `value`
    boxes[b].width = value;

または、何らかの理由でいくつかの異なるボックス変数を本当に反復したい場合は、代わりにポインターの配列を初期化できます。

 Box box1;  // 3 separate Box variables
 Box box2;
 Box box3;

 Box *boxes[3] = { &box1, &box2, &box3 };
                                 // array of pointers to box1, box2, box3

 for (b = 0; b < 3; b++)         // set `width` field of all boxes to `value`
    boxes[b]->width = value;
于 2013-06-25T21:38:44.110 に答える
1

widthポインターをアタッチできる typedef (または構造体) のフィールドのようなものはありません。フィールドは、そのタイプの具体的なオブジェクトにのみ物理的に存在します。したがって、構造体へのポインタを持つことはできませんwidthbox1.widthなどへのポインターのみを持つことができますbox2.width

width既存のすべてのオブジェクトで変更される関数を何らかの方法で作成することはできません。より正確には、そのタイプの既存のすべてのオブジェクトを魔法のように列挙しwidth、それらのフィールドを変更する関数を作成することはできません。どのオブジェクトを変更したいかを関数に伝えるのは、あなたの責任です。

いずれにせよ、あなたは何をしようとしていますか?


設定する特定のフィールドで実行時にパラメーター化される「セッター」関数を作成しようとしている場合は、オフセットを介して C で実行できます。例えば

void set_value(box *box, size_t offset, int value) {
  *(int *) ((char *) box + offset) = value;
}

box box1;
box box2;
box box3;

void set_values(size_t offset, int value)
{
   set_value(&box1, offset, value);
   set_value(&box2, offset, value);
   set_value(&box3, offset, value);
}

通話中

set_values(offset_of(box, width), 42);

の幅を と に設定しbox1box2呼び出しbox342

set_values(offset_of(box, height), -5);

これらのオブジェクトの高さを に設定します-5

しかし、繰り返しになりますが、変更する必要があるオブジェクトを関数が認識していることを確認するのは、ユーザーの責任です。上記の例では、それらをファイル スコープ変数として宣言しただけです。実際のケースでは、一般的には不可能です。

于 2013-06-25T21:44:38.867 に答える
0

メンバーへのポインターを求めているようですが、これらは C++ の機能です (offsetof厳密なエイリアシングの問題が発生する可能性がありますが、エミュレートできます)。特定のインスタンスを指定せずに、のすべてのインスタンスに.width影響する を求めている場合を除きます。その場合、答えはありません。これは次のようになります。box

// C++ ahead

struct box
{
    int width;
    int height;
};

box boxes[3];

void setGlobalBoxesValue(int value, int box::*member)
{
    for(unsigned int i = 0; i < sizeof(boxes)/sizeof(boxes[0]); ++i)
        boxes[i].*member = value;
}

int main(int, char**)
{
    setGlobalBoxesValue(4, &box::width);
    setGlobalBoxesValue(3, &box::height);
    return 0;
}

邪悪な Coffsetofバリアント:

// C emulation (not typesafe)

#include <stddef.h>
#include <string.h>

typedef struct
{
    int width;
    int height;
} box;

box boxes[3];

void setGlobalBoxesValue(int value, size_t memberOffset)
{
    for(unsigned int i = 0; i < sizeof(boxes)/sizeof(boxes[0]); ++i)
        memcpy((char*)(boxes+i) + memberOffset, &value, sizeof(value));
}

int main(int, char**)
{
    setGlobalBoxesValue(4, offsetof(box, width));
    setGlobalBoxesValue(3, offsetof(box, height));
    return 0;
}

ボックスの複数のインスタンスに同じ操作を適用したいだけの場合は、それらを配列に入れて、配列 (メモリ内に分散している場合はポインターの配列) をループします。

于 2013-06-25T21:39:26.780 に答える
0

widthフィールド自体を関数に渡すことはできません。ただし、構造体内でオフセットを渡すことはできます。これは「汚い」トリックであり、低レベルのプログラミングで使用されることがありますが、正当な理由がない限り使用することはお勧めしません。

別のオプションは、マクロを使用することです。これもおそらく悪い考えですが、方法は次のとおりです。

#define assign(field, value) \
    do { \
        box1.field = value; \
        box2.field = value; \
        box3.field = value; \
    } while (0) 

次のように使用します。

assign(width, 5);

事前にボックスがわからない場合は、ここで提案されているアレイ ソリューションと組み合わせることができます。

于 2013-06-25T21:52:13.927 に答える
0

私はあなたの質問を理解しているかどうか確信が持てませんが、

各ボックス インスタンスのすべての幅メンバーで動作する関数を作成するにはどうすればよいですか? 私の混乱は、box のすべてのインスタンスで機能する typedef 構造体メンバーへのポインターを渡す方法です。box1.width のような特定のインスタンス メンバーにポインターを渡す方法は知っていますが、.width を渡してから実行する方法は知っています。

typedef を引数として取る関数を作成することで、構造体の幅にアクセスできます

void foo(box* p)
{
  p->width  .. do something
...
} 

または、ボックスの配列を渡すことを意味する場合

void foo(box* p, int count)
{ 
  for (int i = 0; i < count; ++i)
  {
     p[i]->width .. do something
    ...
  }
}
于 2013-06-25T21:58:07.173 に答える