|
sizeof и указатель на структуру! Проблема! |
|
|
|
 |
Ответов
|
Mar 6 2008, 23:50
|
Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469

|
Это все хорошо, но как тогда быть с тем, что sizeof, пусть даже теоретически, но "ВРЕТ"!? Вам известен размер структуры, запихиваете его в поле size этой структуры. И запихиваете, не то что выдает sizeof, а то что Вы как программист наверняка знаете. Вариант zltigo может обломиться опять же по причине того, что могут получиться реально разные по размеру переменные типа структуры с одним и тем же значением в поле size. В функцию передаете указатель на структуру. Теперь уместный вопрос: а как тогда определить внутри вызываемой функции конкретный тип структуры, ее размер? У меня нет ответа. =) Я примерно год назад разбирал код одной библиотеки (Jasper, JPEG2000). Код большой и красивый (коментариев мало, но структурированность хорошая для чистого C). Так вот там встретил вариант от которого плевался. Принцип на Ваш случай такой. Делать поле size первым полем структуры (всех) и, зная это, обращаться к этому полю, начиная с первого байта указаеля. Т.е. если size это 32 разряда int, то вот первых четыре байта и выдергивать из области памяти по указателю. Понимаю, выглядит ОООчень коряво, но так, как оказалось, делают даже крутые разработчики (тот кто написал Jasper для меня крут, достаточно чуток над кодом посидеть, чтобы это понять).
|
|
|
|
|
Mar 7 2008, 08:45
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(InvisibleFed @ Mar 7 2008, 01:50)  Это все хорошо, но как тогда быть с тем, что sizeof, пусть даже теоретически, но "ВРЕТ"!? sizeof() не врет. Он показывает сколько памяти фактически заняла структура. С учетом выравнивания для конкретной архитектуры. Например структура: Код struct mystruct { char a; int b; }; Далее предполагается что если sizeof(int) == 4. Для 8 битных МК sizeof(struct mystruct) == 5; Для 16 битных МК sizeof(struct mystruct) == 6; Для 32 битных МК sizeof(struct mystruct) == 8; Без специального указания каждое поле поле структуры располагается по адресу, наиболее удобному для процессора. Так например, для 32 бит МК расположение поля b по адресу 1 (ну со смещением 1) приведек тому, что для работы с ним нужно выполнит 4 команды побайтовой загрузки со сдвигом и OR. А расположение по адресу кратному четырем - одна команда загрузки 32 бит значения. Хотите получить точное соответствие - используйте упакованные стрктуры.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
Сообщений в этой теме
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 TX_x16_i2c_01, в вашем случае - это переменная тип... Mar 6 2008, 12:13 Непомнящий Евгений Цитата(InvisibleFed @ Mar 6 2008, 15:13) ... Mar 6 2008, 12:27 Samodelkin Цитата(InvisibleFed @ Mar 6 2008, 16:13) ... Mar 6 2008, 12:50 Qwertty Цитата(InvisibleFed @ Mar 6 2008, 15:13) ... Mar 6 2008, 13:29  Samodelkin Цитата(Qwertty @ Mar 6 2008, 17:29) Вот и... Mar 6 2008, 13:37  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 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 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
|
|
|