2015-05-26 15 views
5

bir bu (geçersiz) 'e benzer bir yapı bir tane istiyorum boyutu:dizisi (USB tanımlayıcısı) unsuru olarak başlatılan bir dizi

const uint8_t uArray[] = { uint8_t(sizeof(uArray)), 1, 2, 3 }; 

ve uArray [0] 4 olması ve olmalıdır derleme zamanında otomatik olarak doldurulur, bu, genellikle ilk bayt değeri öğelerde boyut olan bir bayt dizisi olarak ifade edilen USB tanımlayıcılarının tanımıdır.

Bu, teorik olarak mümkün olmalıdır çünkü dizi zaten başlatılmış ancak bir şekilde bunu ifade edemiyorum.

Bunu çözmek için herhangi bir öneri bekliyoruz.

+0

Bir dizi olmak zorunda mı? Bir enum nasıl? –

+0

Değerleri nereden alıyorsunuz? Örnekte olduğu gibi değer oluşturuyor mu yoksa bunları ör. bir akımdan mı yoksa benzerlerinden mi? Farklı bir kapsayıcıda zaten depolanmışlarsa, boyutu oradan türetebilirsiniz. Sorunuza cevap vermiyor, ancak sorunu çözebilir. – Kif

+0

"* dizi zaten başlatıldı *" - iyi değil, dolayısıyla eksik olduğunu söyleyen hata. Sen tam ortasındasın. Büyüklüğü türetilmiş olmasına rağmen, muhtemelen daha az karmaşık ayrıştırma mantığına, yani beyan tamamlanana kadar değer hesaplamasını ertelemeye ihtiyaç duyacaktır. – luk32

cevap

4

Ben şartname http://open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf okumak ve paragraf 6.7.8.19 o başlatma başlatma listesi sırasıyla olur belirtiyor ve 6.7.8.22 de bilinmeyen boyutta bir dizi başlatıldı, boyutu tarafından belirlenir" diyor Açık başlatıcıya sahip en büyük endekslenmiş öğe. Başlatıcısı listesinin sonunda, dizi artık tamamlanmamış bir diziye sahip değil. " Bana göre, bu, ilk değerin başlatılması sırasında dizinin türünün (ve boyutunun) hala eksik olduğunu gösterir.

+0

** "* Başlatıcı listesinin sonunda, dizinin artık tamamlanmamış bir türü yok *" ** ima "int" [a =] = {1,2,3, int (sizeof (a))}; geçerli? – Nawaz

+0

Hayır, çünkü son öğenin değeri, dizi başlatıcı listesinin sonuna gelmeden önce belirlenmelidir. – Kif

+0

Bu, standart derleyici uygulamaları (özellikle GCC) ile bu mümkün değildir ve ben ya bir şekilde bayt saymak ya da değerlerini doldurmak için programda bir başlatma rutini yapmak zorunda olduğum anlamına gelir? –

İlgili konular