Отговори на тема  [ 8 мнения ] 
Една молба, за тези, които пишат на C 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Ми да. Ти к'во очакваш. Сложи флоатовете най-горе, или пък сложи още един чар преди тях и всичко ще си заспи. В краен случай един "dummy" char преди тях.
BTW, в Delphi - то можеш да кажеш "packed record", за C не знам може ли. Ако някой знае, да подскаже, да не ни пишат двойка :lol:


Чет Окт 07, 2004 11:17 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
А, не съм го огледал както трябва. Ще трябва и по-долу да ги понаредиш, така да се каже.


Чет Окт 07, 2004 11:19 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Оправих се. :) Наистина това беше проблема - че се подравнява цялата структура да е кратна на 8 байта. Определя се чрез "Struct member alignment" на компилатора. И понеже sizeof на VC++ връща 24, пък на avr-gcc 19, се получаваха леки забозявания. :)


Чет Окт 07, 2004 11:57 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Ахааа. Ти май се мъчиш да се опитваш да пробваш да правиш комуникация, а ?


Чет Окт 07, 2004 12:00 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Аз комуникацията съм я направил отдавна. Бозата се получава от това, че при подравняването VC оставя дупки в структурата, за което gcc няма как да знае. И за това някои от мемберите имаха странни стойности, когато ги четях от ЕЕПРОМ-а. :roll:


Чет Окт 07, 2004 12:29 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 8 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 15 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни