|
sizeof и указатель на структуру! Проблема! |
|
|
|
 |
Ответов
|
Mar 6 2008, 13:52
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Цитата(Samodelkin @ Mar 6 2008, 12:54)  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, и это ЛАЖА!!! Как у кого, но у меня Ваш пример не компилируется вообще. Ошибка тут Код IndexDataTX = (char*) TX_x16_i2c_01; //делаем IndexDataTX указателем на структуру. Должно быть так. Код IndexDataTX = (char*) &TX_x16_i2c_01; //делаем IndexDataTX указателем на структуру. Теперь правильно с точки зрения синтаксиса. И sizeof (TX_x16_i2c_01) равен 16, а sizeof(IndexDataTX[0]) зависит от того, каким типом указателя я объявлю переменную IndexDataTX. Если это указатель на char, то sizeof(IndexDataTX[0]) == 1, если это указатель на структуру, то и результат равен размеру структуры. В чём несоответствие ? Цитата(Samodelkin @ Mar 6 2008, 16:37)  Ну про жесткое указание никто не говорит, но вот получается что и sizeof тоже "врет" в некоторых случаях!!!! Вот и возникает вопрос, как безошибочно выяснить реальный обьем данных в структуре!!!!!???? Ну так подсовывайте sizeof() правильный указатель и будете получать правильный результат. Код struct { unsigned char KontursStatus[16]; }TX_x16_i2c_01, *pTX_x16_i2c_01;
pTX_x16_i2c_01 = &TX_x16_i2c_01; //присваиваем pTX_x16_i2c_01 значение ссылки на структуру.
Buff_size = sizeof TX_x16_i2c_01; //если так, то Buff_size равет 16, и это правильно
Buff_size = sizeof(pTX_x16_i2c_01[0]); //если так, то Buff_size равет 16, и это тоже правильно !!!
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Mar 6 2008, 14:40
|

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

|
Цитата(Demeny @ Mar 6 2008, 17:52)  Теперь правильно с точки зрения синтаксиса. И sizeof (TX_x16_i2c_01) равен 16, а sizeof(IndexDataTX[0]) зависит от того, каким типом указателя я объявлю переменную IndexDataTX. Если это указатель на char, то sizeof(IndexDataTX[0]) == 1, если это указатель на структуру, то и результат равен размеру структуры. В чём несоответствие ? [/code] Согласен, так оно и есть! Но КАК обьявить переменную IndexDataTX так чтобы это был указатель на структуру и результат sizeof был равен размеру структуры????? Чем её обьявить?????
|
|
|
|
|
Mar 6 2008, 15:53
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Samodelkin @ Mar 6 2008, 16:40)  Но КАК обьявить переменную IndexDataTX так чтобы это был указатель на структуру и результат sizeof был равен размеру структуры????? Да никак!!! Указатель содержит ТОЛЬКО адрес. sizeof() выполняется на этапе компиляции, а не выполнения. Компилятор знает, какой тип имеет аргумент size и какой размер имеет объект такого типа. Если вы указателю НАСИЛЬНО через приведение типа присвоили адрес объекта другого типа, то это не значит, что изменился тип указателя. Вы присвоили только адрес, а тип при этом потеряли. Если указатель pTmp был указателем на char, то через этот указатель ваш объект выглядит как char и результат sizeof(*pTmp) будет равен размеру char независимо от того, какой размер имел исходный объект. Если я правильно понял вашу задумку, у вас есть некая функция передачи, и вы хотите с ее помощью передавать разные объекты. Тогда вам надо использовать sizeof не внутри этой функции, а при ее вызове: Код void send(void *pData, uint_fast8_t size) { // указатель объявлен как void* чтобы к нему без явных // приведений типа преобразовывались указатели любого типа uint8_t *pSrc = pData; // Отсылка идет побайтно, поэтому преобразовываем указатель к указателю на байт while(size--) { UART.transmit(*pData++); // отсылаем байт на который указывает указатель. } }
struct { uint32_t a; uint16_t b; uint8_t c; } TipaTest1;
uint8_t TipaTest2[10];
uint32_t TipaTest3;
void main() { send(&TipaTest1, sizeof(TipaTest1)); send(TipaTest2, sizeof(TipaTest2)); //имя массива само является указателем send(&TipaTest3, sizeof(TipaTest3)); for(;;) ; }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 6 2008, 17:21
|

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

|
Цитата(Сергей Борщ @ Mar 6 2008, 19:53)  Да никак!!! Указатель содержит ТОЛЬКО адрес. sizeof() выполняется на этапе компиляции, а не выполнения. Компилятор знает, какой тип имеет аргумент size и какой размер имеет объект такого типа. Если вы указателю НАСИЛЬНО через приведение типа присвоили адрес объекта другого типа, то это не значит, что изменился тип указателя. Вы присвоили только адрес, а тип при этом потеряли. Если указатель pTmp был указателем на char, то через этот указатель ваш объект выглядит как char и результат sizeof(*pTmp) будет равен размеру char независимо от того, какой размер имел исходный объект. Если я правильно понял вашу задумку, у вас есть некая функция передачи, и вы хотите с ее помощью передавать разные объекты. Тогда вам надо использовать sizeof не внутри этой функции, а при ее вызове: Код void send(void *pData, uint_fast8_t size) { // указатель объявлен как void* чтобы к нему без явных // приведений типа преобразовывались указатели любого типа uint8_t *pSrc = pData; // Отсылка идет побайтно, поэтому преобразовываем указатель к указателю на байт while(size--) { UART.transmit(*pData++); // отсылаем байт на который указывает указатель. } }
struct { uint32_t a; uint16_t b; uint8_t c; } TipaTest1;
uint8_t TipaTest2[10];
uint32_t TipaTest3;
void main() { send(&TipaTest1, sizeof(TipaTest1)); send(TipaTest2, sizeof(TipaTest2)); //имя массива само является указателем send(&TipaTest3, sizeof(TipaTest3)); for(;;) ; } Спасибо. Я все понял. Я примерно так уже и сделал. Чуть по другому, но смысл тот-же. Хотя Ваш пример более красив по исполнению!!!!
|
|
|
|
Сообщений в этой теме
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 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
|
|
|