Özür: bir sabit boyutlu ifade edecektir:Diziler Bu kavramı anlamak için mücadele
(http://msdn.microsoft.com/pt-br/library/aa931918.aspx den)
typedef struct _FlashRegion {
REGION_TYPE regionType;
DWORD dwStartPhysBlock;
DWORD dwNumPhysBlocks;
DWORD dwNumLogicalBlocks;
DWORD dwSectorsPerBlock;
DWORD dwBytesPerBlock;
DWORD dwCompactBlocks;
} FlashRegion, *PFlashRegion;
bu FlashRegion yapı, bu başka bir yapı kullanılır: (dan: http://msdn.microsoft.com/pt-br/library/aa932688.aspx)
typedef struct _FlashInfoEx {
DWORD cbSize;
FLASH_TYPEflashType;
DWORD dwNumBlocks;
WORD dwDataBytesPerSector;
DWORD dwNumRegions;
FlashRegion region[1];
} FlashInfoEx, *PFlashInfoEx;
sorun, bir FlashInfoEx içinde FlashRegions değişken bir sayı olabilir. Özür hatalrı bu bir yere yapar fonksiyonu:
memcpy (pFlashInfoEx->region, g_pStorageDesc->pRegionTable,
g_pStorageDesc->dwNumRegions * sizeof(FlashRegion));
anlamına geliyor pFlashInfoEx (I işlev çağrısı içinde geçer ki) kopyalamadan bölgelerin bir miktarı;
Yani, dwNumRegions bir taneden büyükse, kod belleğin üzerine yazacaktır. Bu durumda, kodumda bir FlashRegion [FIXED_SIZE] oluşturmalı ve FlashInfoEx-> bölgesinde bir yer/üzerine yazmalı mıyım? Bunu nasıl yaparım?
sayesinde Marcelo
Wow, sizler burada hızlısınız! Yani, bu, bölgenin her zaman yapı hakkının son üyesi olması gerektiği anlamına mı geliyor? Derleyiciye bağlı olarak, bu bir risk değil mi? – Marcelo
Herhangi bir API ile etkileşime girebilecek yapıları tanımlarken, yapının tam olarak bellek düzenini tanımlayabilmeniz gerekir. Bence standart, yapı elemanlarının belirtilen sırada sipariş edilmesini gerektirir, ancak hizalamayı belirtmez. Pratikte tüm derleyiciler hizalama kontrolünü de sağlarlar. – Suma
Evet, bölge son olmalı. Risk? Sadece C'nin kendisi riskli olduğu için.Bu aslında dilin nasıl kullanılacağıdır. Modern dillerin bunu imkansız kılması için bir neden var, ancak bu, tasarım modelini C89 ve C90 araç setinden geriye doğru yormuyor. – DigitalRoss