ileri dizisine bir gösterici C yapıları ilan

oy
1

Sorunun kodudur C. ileri bildirimleri hakkında bir sorum var

typedef struct yhash_s t_yhash;                          // forward declaration
struct yhash_s {
               size_t  size_h; 
               t_yhash (*yhash)[]                        // pointer to array of structures
               };

Kod gcc ile derlenmiş sonra, yakınır:

Hata: dizi tipi tam olmayan eleman tipinin 't_yhash' sahiptir {diğer adıyla 'yapı yhash_s'}

Ben dizinin boyutu hesaplanamaz (henüz) bilir ve olmadığını t_yhash anlıyorum ama mükemmel çözülebilir IMHO olmalıdır bilinmeyen henüz boyutta bir dizi için pointer hakkında soruyorum.

Bunu nasıl ileri beyanı düzeltmek ve kendisini struct mı?

Oluştur 13/01/2020 saat 21:59
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
4

Sorun bu dizi declarators eleman türü (C11 6.7.6.2/1) gibi bir tam olmayan tip olmayabilir olup. Ve t_yash(yani struct yhash_s) Yapı tanımının kapatma ayracı kadar tam değildir.

Bu kural aynı zamanda trivia başka bir parça sorumludur; o (struct tanımı tamamlanmadan önce) olması yasaldır:

void func( t_yhash *a );

ancak yasal olmayan var:

void func( t_yhash a[] );

ayarlama kuralı eksik eleman tipi kural için sadece iyi değilse çalışacak olsa da.

Muhtemelen dil tasarım işlevi prototip gibi bazı durumlarda izin vermek için bu kuralı detaylandırarak hafifçe geliştirilebilir, ancak açıkça dil tasarım komitesiyle ortaya çıkan bir şey değildi.

Ama bu kural olmadan, durumunuzun başka sorun olabilir; ibrenin boyutu bilinmiyor olabilir. Bu "yapı Y dizisine pointer" farklı bir boyuta sahip olmak üzere, "yapı X dizisine işaretçi" için (uygulamada mümkün olsa da), yasal olacaktır. Tüm işaretçiler aynı boyutta olmalıdır yapısına bir bu bir kural, ama diziye işaretçileri için böyle bir kural yoktur.

Cevap 13/01/2020 saat 22:24
kaynak kullanıcı

oy
0

Yayınınızdaki bu kısmına cevap olarak:

Bunu nasıl ileri beyanı düzeltmek ve kendisini struct mı?

Sen kullanabilirsiniz void *dizinizi saklamak için ve daha sonra geri dönüştürün.

typedef struct yhash_s t_yhash;
struct yhash_s {
               size_t  size_h;
               void *yhash;
               };

static inline t_yhash (*yhash(t_yhash y))[] {
    return y.yhash;
}

Fonksiyon sözdizimi çok geniş ise:

typedef t_yhash t_yhash_array[];

static inline t_yhash_array *yhash(t_yhash y) {
    return y.yhash;
}

Örneğin:

t_yhash x[10];
t_yhash y = { 10, &x };
assert(yhash(y) == &x);
Cevap 13/01/2020 saat 23:38
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more