|
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, 05:16
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(InvisibleFed @ Mar 7 2008, 02:50)  Это все хорошо, но как тогда быть с тем, что sizeof, пусть даже теоретически, но "ВРЕТ"!? Вам известен размер структуры, запихиваете его в поле size этой структуры. И запихиваете, не то что выдает sizeof, а то что Вы как программист наверняка знаете. Я не могу понять - что значит "ВРЕТ"? sizeof возвращает размер структуры с учетом выравнивания. Этот размер может отличаться от суммы sizeof всех элементов структуры. Цитата Вариант zltigo может обломиться опять же по причине того, что могут получиться реально разные по размеру переменные типа структуры с одним и тем же значением в поле size. Ну так у двух разных структур могут быть одинаковые размеры... Ну и что? По размеру можно определить не тип структуры, а скорее ее "версию" - типа того как это сделано в winapi. Цитата В функцию передаете указатель на структуру. Теперь уместный вопрос: а как тогда определить внутри вызываемой функции конкретный тип структуры, ее размер? У меня нет ответа. =) Очень просто - первым элементом структуры идет что-то типа: Код typedef struct _TTypeAndSize { int type; int size; } TTypeAndSize;
typedef struct _TMyStruct { TTypeAndSize ts; int a; float b; } TMyStruct;
#DEFINE TYPE_MYSTRUCT 1
TMyStruct a; a.ts.type = TYPE_MYSTRUCT; a.ts.size = sizeof(a); a.a = 100; a.b = 200;
void func(void *p) { TTypeAndSize *pTS = (TTypeAndSize *)p; switch(pTS.type) { case TYPE_MYSTRUCT: break; } } Если размер для каждого типа фиксирован - обойдетесь только полем type. В С++ на этапе выполнения тип определяется по vptr. Затраты сравнимые. Геморроя у вас конечно будет больше. Но с другой стороны, если вы это часто используете - переходите на С++.
|
|
|
|
Сообщений в этой теме
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 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
|
|
|