реклама на сайте
подробности

 
 
> sizeof и указатель на структуру! Проблема!
Samodelkin
сообщение Mar 6 2008, 09:54
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 102
Регистрация: 29-05-05
Из: Днепропетровск
Пользователь №: 5 520



Если к команде sizeof подставляю имя структуры, то все нормально, а если указатель на структуру, то она отдает размер = 2!!!!
Неужели никак нельзя передать sizeof указатель на структуру чтобы sizeof отдало реальный размер структуры????


struct {
unsigned char KontursStatus[16];
}TX_x16_i2c_01;

IndexDataTX = (char*) TX_x16_i2c_01; //делаем IndexDataTX указателем на структуру.

Buff_size = sizeof TX_x16_i2c_01; //если так, то Buff_size равет 16, и это правильно

Buff_size = sizeof(IndexDataTX[0]); //если так, то Buff_size равет 2, и это ЛАЖА!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
InvisibleFed
сообщение Mar 6 2008, 12:13
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469



TX_x16_i2c_01, в вашем случае - это переменная типа описанной Вами структуры.
IndexDataTX = (char*) TX_x16_i2c_01; // теперь вы делаете IndexDataTX указателем на эту (TX_x16_i2c_01) переменную. В первом случае , Вы действительно получаете 16, потому как получаете размер переменной. А вот во втором случае облом. Я могу ошибаться, но причина как мне кажется в том, что sizeof - это оператор времени компиляции. Во время компиляции на место него подсталяется обычное число (в чистом C89. В C99 это не так). Я очень сомневаюсь в том что факт присвоения
IndexDataTX = (char*) TX_x16_i2c_01;

выясняется во время компиляции. Отсюда, компилятор просто не знает что ему подставить на место sizeof. А почему именно 2 - хз.

И кстати, как я понял, Вы пытаетесь исходя из размера переменной структуры определить функцию обработчик для переменной этой структуры. Может для 8-разрядных контроллеров это и нормально, но в общем случае, sizeof возвращает значение "как минимум". Т.е. фактический размер переменной может быть , скажем 11 байт, а в качестве размера Вы получите 16. В разных архитектурах компилятор может самолично увеличить размер структуры (то что возвращает sizeof), чтобы обеспечить выравнивание ее членов по границе. Сам я если честно с таким никогда не сталкивался (а может мало пытался?..), но всякие умные источники (Герберд Шилдт, мои товарищи) утверждают. Так что вариант, который Вам предложили в последнем посте самый правильный.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Mar 6 2008, 13:29
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(InvisibleFed @ Mar 6 2008, 15:13) *
Т.е. фактический размер переменной может быть , скажем 11 байт, а в качестве размера Вы получите 16. В разных архитектурах компилятор может самолично увеличить размер структуры (то что возвращает sizeof), чтобы обеспечить выравнивание ее членов по границе. Сам я если честно с таким никогда не сталкивался (а может мало пытался?..), но всякие умные источники (Герберд Шилдт, мои товарищи) утверждают. Так что вариант, который Вам предложили в последнем посте самый правильный.

Вот именно из-за возможности выравнивания вариант с жестким указанием размера в первом поле и не годится. Изменим уровень оптимизации, поменяем компилятор, или поменяем платформу и придется во всех структурах менять это значение. У GCC еще есть возможность упаковывать структуры, с помощью ключей компиляции.
Go to the top of the page
 
+Quote Post
Samodelkin
сообщение Mar 6 2008, 13:37
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 102
Регистрация: 29-05-05
Из: Днепропетровск
Пользователь №: 5 520



Цитата(Qwertty @ Mar 6 2008, 17:29) *
Вот именно из-за возможности выравнивания вариант с жестким указанием размера в первом поле и не годится. Изменим уровень оптимизации, поменяем компилятор, или поменяем платформу и придется во всех структурах менять это значение. У GCC еще есть возможность упаковывать структуры, с помощью ключей компиляции.


Ну про жесткое указание никто не говорит, но вот получается что и sizeof тоже "врет" в некоторых случаях!!!! Вот и возникает вопрос, как безошибочно выяснить реальный обьем данных в структуре!!!!!????
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Samodelkin   sizeof и указатель на структуру! Проблема!   Mar 6 2008, 09:54
- - Qwertty   Цитата(Samodelkin @ Mar 6 2008, 12:54) In...   Mar 6 2008, 10:21
|- - Samodelkin   Цитата(Qwertty @ Mar 6 2008, 14:21) Вы в ...   Mar 6 2008, 10:27
- - Непомнящий Евгений   X = sizeof(*PTR); но у вас не указатель на структу...   Mar 6 2008, 10:28
|- - Samodelkin   Цитата(Непомнящий Евгений @ Mar 6 2008, 14...   Mar 6 2008, 10:34
- - zltigo   Цитата(Samodelkin @ Mar 6 2008, 12:54) и ...   Mar 6 2008, 10:37
- - Qwertty   Надо было сразу привести рабочий вариант Кодstruc...   Mar 6 2008, 10:45
|- - Samodelkin   Цитата(Qwertty @ Mar 6 2008, 14:45) Надо ...   Mar 6 2008, 10:58
- - Непомнящий Евгений   То, что вы написали - не скомпилится - у вас неско...   Mar 6 2008, 11:26
|- - Samodelkin   Цитата(Непомнящий Евгений @ Mar 6 2008, 15...   Mar 6 2008, 11:39
|- - Непомнящий Евгений   Цитата(InvisibleFed @ Mar 6 2008, 15:13) ...   Mar 6 2008, 12:27
|- - Samodelkin   Цитата(InvisibleFed @ Mar 6 2008, 16:13) ...   Mar 6 2008, 12:50
|- - zltigo   Цитата(Qwertty @ Mar 6 2008, 16:29) Вот и...   Mar 6 2008, 15:52
- - Demeny   Цитата(Samodelkin @ Mar 6 2008, 12:54) st...   Mar 6 2008, 13:52
|- - Samodelkin   Цитата(Demeny @ Mar 6 2008, 17:52) Теперь...   Mar 6 2008, 14:40
|- - Сергей Борщ   Цитата(Samodelkin @ Mar 6 2008, 16:40) Но...   Mar 6 2008, 15:53
|- - Samodelkin   Цитата(Сергей Борщ @ Mar 6 2008, 19:53) Д...   Mar 6 2008, 17:21
- - bzx   У тебя путаница с указателями в голове... То что т...   Mar 6 2008, 14:08
- - InvisibleFed   Это все хорошо, но как тогда быть с тем, что sizeo...   Mar 6 2008, 23:50
|- - rezident   Цитата(InvisibleFed @ Mar 7 2008, 04:50) ...   Mar 7 2008, 00:52
|- - Непомнящий Евгений   Цитата(InvisibleFed @ Mar 7 2008, 02:50) ...   Mar 7 2008, 05:16
|- - zltigo   Цитата(InvisibleFed @ Mar 7 2008, 02:50) ...   Mar 7 2008, 07:32
|- - amw   Цитата(InvisibleFed @ Mar 7 2008, 01:50) ...   Mar 7 2008, 08:45
- - InvisibleFed   Уважаемые, обратите внимание на ковычки до и после...   Mar 7 2008, 12:10
|- - zltigo   Цитата(InvisibleFed @ Mar 7 2008, 15:10) ...   Mar 7 2008, 12:32
- - InvisibleFed   Обсуждать по теме тут нечего. Я лично не понял ни ...   Mar 7 2008, 13:09
|- - zltigo   Цитата(InvisibleFed @ Mar 7 2008, 16:09) ...   Mar 7 2008, 15:44
- - radiofill   Цитата(Samodelkin @ Mar 6 2008, 12:54) Ес...   Mar 10 2008, 15:01


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01826 секунд с 7
ELECTRONIX ©2004-2016