|
sizeof и указатель на структуру! Проблема! |
|
|
|
 |
Ответов
|
Mar 6 2008, 12:13
|
Местный
  
Группа: Свой
Сообщений: 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), чтобы обеспечить выравнивание ее членов по границе. Сам я если честно с таким никогда не сталкивался (а может мало пытался?..), но всякие умные источники (Герберд Шилдт, мои товарищи) утверждают. Так что вариант, который Вам предложили в последнем посте самый правильный.
|
|
|
|
|
Mar 6 2008, 13:29
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(InvisibleFed @ Mar 6 2008, 15:13)  Т.е. фактический размер переменной может быть , скажем 11 байт, а в качестве размера Вы получите 16. В разных архитектурах компилятор может самолично увеличить размер структуры (то что возвращает sizeof), чтобы обеспечить выравнивание ее членов по границе. Сам я если честно с таким никогда не сталкивался (а может мало пытался?..), но всякие умные источники (Герберд Шилдт, мои товарищи) утверждают. Так что вариант, который Вам предложили в последнем посте самый правильный. Вот именно из-за возможности выравнивания вариант с жестким указанием размера в первом поле и не годится. Изменим уровень оптимизации, поменяем компилятор, или поменяем платформу и придется во всех структурах менять это значение. У GCC еще есть возможность упаковывать структуры, с помощью ключей компиляции.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|