0

したがって、アクセスするすべてのプロパティが同じになる 2 つの異なる構造体があります。また、関数もあり、who's 引数は、2 つのいずれかを受け入れることができるようにしたいと考えています。例:

typedef struct{
    int whatnot = 14;
    int thing[11];
} TH_CONFIG;

typedef struct{
    int whatnot = 3;
    int thing[5];
} TH_CONFIG_2;

*_CONFIG var;

void fun(*_CONFIG input)
{
    input.whatnot = 5;
}

int main(){
    fun(var);
}

void を typecast または何かの型として使用する必要があるのではないかと考えているかもしれませんが、私の検索では、関数ポインター、テンプレート、および C# に関する情報しか得られませんでした。

編集: *_CONFIG は構文的に正しいことを意味するものではなく、そこで何をすべきかわからないことを意味しますが、_CONFIG タイプであるはずです

4

2 に答える 2

2

可能な解決策。

  1. 両方に長さ11の配列を使用するだけです。OSの最後の6バイトが本当に不足しましたか?
  2. 動的配列にします。
  3. アセンブリで書き込むだけで、Cの高レベル性は明らかに気になりません。
  4. テンプレートやポリモーフィズムをサポートするC++などの言語を使用してください。
  5. struct気になるあなたの議論を渡すだけです。

    void fun(int * whatnot){* whatnot = 5; }

    int main(){fun(&myStruct.whatnot); 0を返します。}

  6. 準オブジェクト指向デザインを考慮に入れます。

    struct {int whatnot; } typedef Common;

    structTH_CONFIG_1{共通共通; intthing [11]; };

    structTH_CONFIG_2{共通共通; intthing [5]; }

しかし、あなたが主張するなら...

void fun(void* input) {
    ( (int)(*input) ) = 5;
}

また...

void fun(void* input) {
    ( (TH_CONFIG*) input)->whatnot = 5; // may have been a TH_CONFIG_2, but who cares?
}

注:これは、どのCショップでもコードレビューに合格しません。

于 2013-03-11T13:51:36.940 に答える
1

任意のポインター型を使用してキャストできます。

アクセスしているすべてのプロパティが同じである場合、一方が他方の拡張であると推測しています (プロパティは構造体の先頭から同じオフセットを持つ必要があるため)。その場合、次のパターンを使用することをお勧めします。

struct base {
  int foo;
  char **strings;
};

struct extended {
  struct base super;
  double other_stuff;
};

superは の先頭にあるので、 toを問題なくstruct extendedキャストできます。もちろん、代わりに同じフィールドを最初に繰り返すことでそれを行うこともできますが、そうすると自分自身を繰り返すことになります。struct extended *struct base *struct extended

于 2013-03-11T13:55:41.953 に答える