2

これに関連する他の多くのSO投稿を調べましたが、誰も私を助けることができませんでした。したがって、次の構造体を定義しています。

 typedef struct
    {
    int created;
    double data;
    int timeLeft;
    int destination;
}dataPacket;

typedef struct
{
    dataPacket *array;
    int currIndex;
    int firstIndex;
    int nextTick;
    int maxLength;
    int length;
    int stime;
    int total;


}packetBuffer;

typedef struct{
    int mac;
    struct wire *lconnection;
    struct wire *rconnection;
    int numRecieved;
    struct packetBuffer *buffer;
    int i;
    int backoff;
}node;

typedef struct{
    float length;
    float speed;
    int busy;
    struct dataPacket *currPacket;
    struct node *lnode;
    struct node *rnode;
}wire;

そして、私は次の関数を使おうとしています:

    int sendPacket(node *n, int tick)
{
    if(n->buffer->length > 0)
    {
        if(n->backoff <= 0)
        {
            if (n->lconnection->busy != 0 || n->lconnection->busy != 0)
            {
                n->i++;
                n->backoff = (512/W * genrand()*(pow(2,n->i)-1))/TICK_LENGTH;
            }
            else
            {
                n->lconnection->busy = 1;
                n->rconnection->busy = 1;
                n->lconnection->currPacket = n->buffer[n->buffer->currIndex];
                n->rconnection->currPacket = n->buffer[n->buffer->currIndex];
            }
        }
        else
        {
            n->backoff--;
        }
    }
}

buffer、lconnection、またはrconnectionのメンバーにアクセスしようとするたびに、タイトルに記載されているエラーが発生します。

4

2 に答える 2

5
struct packetBuffer *buffer;

タイプを定義しましたpacketBuffer(それ以外の場合は匿名の構造体のtypedef)。

定義していませんstruct packetBuffer

既存の型がない場合struct packetBuffer、コンパイラは、後で完了すると想定して、それを不完全な型として扱います。宣言

struct packetBuffer *buffer;

bufferは完全に合法ですが、タイプが表示されていない限り、逆参照することはできませんstruct packetBuffer

structキーワードをドロップするだけです。

(私の個人的な好みは、を削除しtypedef、一貫して構造体タイプをとして参照することstruct whateverですが、それはスタイルと好みの問題です。)

于 2013-03-11T18:12:26.807 に答える
1

以下:

typedef struct { int x; char *y; ... } my_struct;

匿名構造の識別子を作成します。構造がそれ自体のインスタンスを参照するためには、それが「匿名」であってはなりません。

typedef struct my_struct {
    int x;
    char *y;
    struct my_struct *link
    ....
} my_struct_t;

これは、これmy_struct_tがタイプstruct my_structであり、単なる匿名の構造体ではないことを意味します。また、struct my_struct独自の構造定義内で使用できることに注意してください。これは匿名の構造体では不可能です。

最後の複雑さとして、my_structinstruct my_structは。とは異なる「名前空間」にありmy_struct_tます。これは、次のようなコードで物事を単純化(または混乱)させるために使用されることがあります。

typedef struct my_struct {
    int x;
    char *y;
    struct my_struct *link
    ....
} my_struct;

my_structこれで、コードのどこでも、の代わりに使用できますstruct my_struct

最後に、typedefを構造体定義から分離して、同じ効果を実現できます。

struct my_struct {
    int x;
    char *y;
    struct my_struct *link;
    ....
};
typedef struct my_struct my_struct;

David R.HansonのCインターフェイスと実装で述べられているように、「構造体、共用体、および列挙型タグは、変数、関数、および型名のスペースとは別の同じ名前空間を占めるため、この定義は有効です。」

于 2013-03-11T19:01:41.243 に答える