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

 
 
> 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
Ответов
Demeny
сообщение Mar 6 2008, 13:52
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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, и это тоже правильно !!!


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
Samodelkin
сообщение Mar 6 2008, 14:40
Сообщение #3


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

Группа: Участник
Сообщений: 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 был равен размеру структуры?????
Чем её обьявить?????
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 6 2008, 15:53
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Samodelkin
сообщение Mar 6 2008, 17:21
Сообщение #5


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

Группа: Участник
Сообщений: 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(;;)
    ;
}


Спасибо. Я все понял. Я примерно так уже и сделал. Чуть по другому, но смысл тот-же.
Хотя Ваш пример более красив по исполнению!!!! smile.gif
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   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


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

 


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


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