5

サイズの異なる 2 つの構造体があり、それらを渡すことができる 1 つの関数が必要です。ただし、関数のパラメーターを定義して2つの異なる構造体を受け入れる方法がわかりません。

私の構造体は以下です

struct {
    int a;             // 2 byte
    int b;             // 2 byte
    int c;             // 2 byte
    int d;             // 2 byte
}  person1;                // 8 bytes


struct {
    int a;            // 2 byte
    DeviceAddress b;  // 8 bytes
    int c             // 2 bytes
    float d;      // 4 bytes
}  person2;               // 16 bytes

function print_struct(struct& ?????)
{
     actions here....
}


print_struct(person1);
print_struct(person2);
4

4 に答える 4

6

残念ながら、C の無関係な構造体に対する唯一の選択肢は、構造体へのポインタを型なし (つまり as void*) に渡し、次のように「横に」型を渡すことです。

struct person1_t {
    int a;             // 2 byte
    int b;             // 2 byte
    int c;             // 2 byte
    int d;             // 2 byte
}  person1;

struct person2_t {
    int a;            // 2 byte
    DeviceAddress b;  // 8 bytes
    int c             // 2 bytes
    float d;      // 4 bytes
}  person2;

void print_struct(void* ptr, int structKind) {
    switch (structKind) {
        case 1:
            struct person1 *p1 = (struct person1_t*)ptr;
            // Print p1->a, p1->b, and so on
            break;
        case 2:
            struct person2 *p2 = (struct person2_t*)ptr;
            // Print p2->a, p2->b, and so on
            break;
    }
}

print_struct(&person1, 1);
print_struct(&person2, 2);

ただし、この方法では、コンパイラが型チェックを行うことができないため、エラーが発生しやすくなります。

于 2013-01-14T18:22:51.843 に答える
3

それは本当に不可能です。2 つの構造体とある種の識別子を保持する共用体を作成できます。次に、ユニオンを渡し、識別子を使用して、どの構造体が含まれているかを判断します。

typedef struct sp1 {
    int a;             // 2 byte
    int b;             // 2 byte
    int c;             // 2 byte
    int d;             // 2 byte
}  person1_t;          // 8 bytes


typedef struct sp2 {
    int a;            // 2 byte
    DeviceAddress b;  // 8 bytes
    int c             // 2 bytes
    float d;          // 4 bytes
}  person2_t;         // 16 bytes

typedef union {
    person1_t person1;
    person2_t person2;
} people;

function print_struct(people *p, int id) // e.g. id == 1, struct is person1
{
    switch (id)
    {
         case 1: // Do person 1 things
         break;

         case 2: // Do person 2 things
         break;

         default: // Error
         break;
    }
}
于 2013-01-14T18:19:11.180 に答える
0

dasblinkenlight が述べたように、2 つの異なる構造体を関数に渡すことができるようにしたい場合はvoid *、ジェネリック ポインターを渡す方法が適していますが、そうするとタイプ セーフではなく、エラーが発生しやすいコードに簡単につながる可能性があります。 .

2 つの別々の構造体を持つことで、どのような機能を達成しようとしていますか? 代わりに、情報を単一の構造体に結合し、ゼロ以外の値をすべて出力する印刷関数を用意することを検討できますか?

おそらく最適ではないcコードを許してください。私は専門家とはほど遠いです。これは要点を説明するためのものです:)

typedef struct datastruct {
    int a;
    int b;
    float c;
} datastruct;

void printData(datastruct *d){

    printf("Data:\n")
    printf((d->a) ? "a=%d", a : "");
    printf((d->b) ? "b=%d", b : "");
    printf((d->c) ? "c=%.2f", c : "");
    printf("\n");
}

int main(void) {

    datastruct data = {0};
    /* now set values as needed */

    printData(&data);

    return 0;
}
于 2013-03-11T14:02:43.523 に答える
-2
typedef struct p1 {
    int a;             // 2 byte
    int b;             // 2 byte
    int c;             // 2 byte
    int d;             // 2 byte
} person1;                // 8 bytes


typedef struct p2{
    int a;            // 2 byte
    DeviceAddress b;  // 8 bytes
    int c             // 2 bytes
    float d;      // 4 bytes
} person2;               // 16 bytes

typedef enum ptypes {
    PERSON1,
    PERSON2
} person_type;

typedef union p1_or_p2 {
    person1 p1;
    person2 p2;
} person1_or_person2;

typedef struct p {
    person1_or_person2 person;
    person_type type;
} person;

// Creating a person struct variable:
person p;
person1 p1;
p1.a = 5;
p1.b = 2;
p.type = PERSON1;
p.person = (person1_or_person2) p1;

void print_struct(person p) {
     switch (p.type) {
        case PERSON1:
            // actions for person1 here....
              // you can access person1 like this:
                 p.person.p1;
        break;
        case PERSON2:
            // actions for person2 here....
              // you can access person2 like this:
                 p.person.p2;
        break;
     }
}
于 2013-01-14T18:20:07.260 に答える