| Автор |
Съобщение |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
 Една молба, за тези, които пишат на C
Има следната структура:
struct TableHeader
{
unsigned char m_nDataOffset;
unsigned char m_nTableWidth;
unsigned char m_nTableHeight;
float m_fPhysicsX;
float m_fPhysicsY;
unsigned char m_nDivX;
unsigned char m_nDivY;
unsigned long m_nCheckSum;
unsigned short m_nDataSize;
};
Вижте, моля ви, какво връща sizeof(TableHeader) на вашия компилатор и какъв е самия компилатор.
|
| Сря Окт 06, 2004 10:36 pm |
|
 |
|
Мартин
Ранг: Минаващ
Регистриран на: Пон Сеп 27, 2004 9:20 am Мнения: 61 Местоположение: София
|
Microsoft Visual Studio 6.0
------------------------------
sizeof(unsigned char) = 1
sizeof(float) = 4
sizeof(unsigned long) = 4
sizeof(unsigned short) = 2
sizeof(TableHeader) = 24 (вместо 19, както се получава ако се направи проста аритметика)
Разликата идва от това, че при използването на структури всяка променлива заема кратен на 2 брой байтове.
|
| Чет Окт 07, 2004 9:24 am |
|
 |
|
Мартин
Ранг: Минаващ
Регистриран на: Пон Сеп 27, 2004 9:20 am Мнения: 61 Местоположение: София
|
Потърсих в Google повече информация, и се оказа че съм поизлъгал.
Q: Why returns 'sizeof()' a bigger size than the member variables actually need?
A: This is due to structure alignment which aligns the data structure by padding extra bytes so as to optimize for data transfer.
http://www.codeguru.com/forum/showthread.php?s=52d39246109637dc59a1b8af29388658&p=866887#post866887
|
| Чет Окт 07, 2004 9:43 am |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Ми да. Ти к'во очакваш. Сложи флоатовете най-горе, или пък сложи още един чар преди тях и всичко ще си заспи. В краен случай един "dummy" char преди тях.
BTW, в Delphi - то можеш да кажеш "packed record", за C не знам може ли. Ако някой знае, да подскаже, да не ни пишат двойка 
|
| Чет Окт 07, 2004 11:17 am |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
А, не съм го огледал както трябва. Ще трябва и по-долу да ги понаредиш, така да се каже.
|
| Чет Окт 07, 2004 11:19 am |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Оправих се.  Наистина това беше проблема - че се подравнява цялата структура да е кратна на 8 байта. Определя се чрез "Struct member alignment" на компилатора. И понеже sizeof на VC++ връща 24, пък на avr-gcc 19, се получаваха леки забозявания. 
|
| Чет Окт 07, 2004 11:57 am |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Ахааа. Ти май се мъчиш да се опитваш да пробваш да правиш комуникация, а ?
|
| Чет Окт 07, 2004 12:00 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Аз комуникацията съм я направил отдавна. Бозата се получава от това, че при подравняването VC оставя дупки в структурата, за което gcc няма как да знае. И за това някои от мемберите имаха странни стойности, когато ги четях от ЕЕПРОМ-а. 
|
| Чет Окт 07, 2004 12:29 pm |
|
|