Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: sizeof и указатель на структуру! Проблема!
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Samodelkin
Если к команде 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, и это ЛАЖА!!!
Qwertty
Цитата(Samodelkin @ Mar 6 2008, 12:54) *
IndexDataTX = (char*) TX_x16_i2c_01; //делаем IndexDataTX указателем на структуру.

Вы в этом уверены? В том что указатель ИМЕННО на структуру получили?
sizeof возвращает размер того, что ей передается в качестве параметра. Если это указатель, то его размер и вернется. Если нужен размер объекта, то объект и нужно передавать.
Код
X = sizeof(*PTR);
Samodelkin
Цитата(Qwertty @ Mar 6 2008, 14:21) *
Вы в этом уверены? В том что указатель ИМЕННО на структуру получили?
sizeof возвращает размер того, что ей передается в качестве параметра. Если это указатель, то его размер и вернется. Если нужен размер объекта, то объект и нужно передавать.
Код
X = sizeof(*PTR);


Да, уверен! Именно указатель на структуру я и получил, потому что что касается этого, то все работает. Но вот как сказать sizeof чтобы оно отдало размер того на что указывает указатель??????
Непомнящий Евгений
X = sizeof(*PTR);
но у вас не указатель на структуру, а указатель на char. Посему вы получите 1...
Samodelkin
Цитата(Непомнящий Евгений @ Mar 6 2008, 14:28) *
X = sizeof(*PTR);
но у вас не указатель на структуру, а указатель на char. Посему вы получите 1...


wacko.gif
zltigo
Цитата(Samodelkin @ Mar 6 2008, 12:54) *
и это ЛАЖА!!!

Какая такая лажа - что спросили, то и получили - спросили размер структуры - получили размер структуры. Спросили размер указателя на char (причем именно на char а не на структуру, что впрочем все равно, хоть void ) и получли размер указателя.
Цитата
Но вот как сказать sizeof чтобы оно отдало размер того на что указывает указатель??????

Указатель это просто адрес. Если Вам известно, что лежит по этому адресу скажите это sizeof().
Qwertty
Надо было сразу привести рабочий вариант smile.gif
Код
struct {
unsigned char KontursStatus[16];
}TX_x16_i2c_01б, *PTR;

PTR = &TX_x16_i2c_01; //делаем PTR указателем на структуру.

Buff_size = sizeof(*PTR); // Buff_size получит размер структуры
Samodelkin
Цитата(Qwertty @ Mar 6 2008, 14:45) *
Надо было сразу привести рабочий вариант smile.gif
Код
struct {
unsigned char KontursStatus[16];
}TX_x16_i2c_01б, *PTR;

PTR = &TX_x16_i2c_01; //делаем PTR указателем на структуру.

Buff_size = sizeof(*PTR); // Buff_size получит размер структуры


У меня несколько разных структур! Чтобы обрабатывать их одной функцией, то для этого мне и нужен указатель на структуру.
Так мне *PTR ставить одинаковым после каждой структуры ????? :

struct {
unsigned char KontursStatus[16];
}TX_x16_i2c_01, *PTR;
struct {
unsigned char KontursStatus[20];
}TX_x16_i2c_02, *PTR;
struct {
unsigned char KontursStatus[7];
}TX_x16_i2c_03, *PTR;

PTR = &TX_x16_i2c_01; //делаем PTR указателем на структуру.
Buff_size = sizeof(*PTR); // Buff_size получит размер структуры
PTR = &TX_x16_i2c_02; //делаем PTR указателем на структуру.
Buff_size = sizeof(*PTR); // Buff_size получит размер структуры
PTR = &TX_x16_i2c_03; //делаем PTR указателем на структуру.
Buff_size = sizeof(*PTR); // Buff_size получит размер структуры
Непомнящий Евгений
То, что вы написали - не скомпилится - у вас несколько определений PTR...

Если у вас несколько однотипных структур и в функциях вам нужно определять их размер - просто храните размер в первом байте структуры.
Примерно так:

Код
struct {
unsigned char size;
unsigned char KontursStatus[16];
}TX_x16_i2c_01;
TX_x16_i2c_01.size = sizeof(TX_x16_i2c_01);
struct {
unsigned char size;
unsigned char KontursStatus[20];
}TX_x16_i2c_02;
TX_x16_i2c_02.size = sizeof(TX_x16_i2c_02);
struct {
unsigned char size;
unsigned char KontursStatus[7];
}TX_x16_i2c_03;
TX_x16_i2c_03.size = sizeof(TX_x16_i2c_03);

void func(unsigned char *p)
{
  unsigned char sz = *p;
  ...  
}
Samodelkin
Цитата(Непомнящий Евгений @ Mar 6 2008, 15:26) *
То, что вы написали - не скомпилится - у вас несколько определений PTR...

Если у вас несколько однотипных структур и в функциях вам нужно определять их размер - просто храните размер в первом байте структуры.
Примерно так:

Код
struct {
unsigned char size;
unsigned char KontursStatus[16];
}TX_x16_i2c_01;
TX_x16_i2c_01.size = sizeof(TX_x16_i2c_01);
struct {
unsigned char size;
unsigned char KontursStatus[20];
}TX_x16_i2c_02;
TX_x16_i2c_02.size = sizeof(TX_x16_i2c_02);
struct {
unsigned char size;
unsigned char KontursStatus[7];
}TX_x16_i2c_03;
TX_x16_i2c_03.size = sizeof(TX_x16_i2c_03);

void func(unsigned char *p)
{
  unsigned char sz = *p;
  ...  
}


Всем спасибо за помощь! Буду пробовать!
beer.gif
InvisibleFed
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), чтобы обеспечить выравнивание ее членов по границе. Сам я если честно с таким никогда не сталкивался (а может мало пытался?..), но всякие умные источники (Герберд Шилдт, мои товарищи) утверждают. Так что вариант, который Вам предложили в последнем посте самый правильный.
Непомнящий Евгений
Цитата(InvisibleFed @ Mar 6 2008, 15:13) *
TX_x16_i2c_01, в вашем случае - это переменная типа описанной Вами структуры.
IndexDataTX = (char*) TX_x16_i2c_01; ...
Отсюда, компилятор просто не знает что ему подставить на место sizeof. А почему именно 2 - хз.

IndexDataTX - переменная типа char* (указатель на char).
sizeof(IndexDataTX) - это размер указателя на char - т.е. к примеру, 2 байта.
sizeof(*IndexDataTX) - это размер char - т.е. 1 байт.
Samodelkin
Цитата(InvisibleFed @ Mar 6 2008, 16:13) *
в общем случае, sizeof возвращает значение "как минимум". Т.е. фактический размер переменной может быть , скажем 11 байт, а в качестве размера Вы получите 16. В разных архитектурах компилятор может самолично увеличить размер структуры (то что возвращает sizeof), чтобы обеспечить выравнивание ее членов по границе. Сам я если честно с таким никогда не сталкивался (а может мало пытался?..), но всякие умные источники (Герберд Шилдт, мои товарищи) утверждают. Так что вариант, который Вам предложили в последнем посте самый правильный.


Спасибо за ликбез!
Но!!!
А как тогда в "общем случае" реально вычислить размер данных в структуре?
Мне например надо отправить в порт (UART например) данные из структуры, но получится что я отпарвляю одно количество байт, а там на самом деле другое!!!! И вместо недостающих данных пойдет "мусор"!!!!????
Qwertty
Цитата(InvisibleFed @ Mar 6 2008, 15:13) *
Т.е. фактический размер переменной может быть , скажем 11 байт, а в качестве размера Вы получите 16. В разных архитектурах компилятор может самолично увеличить размер структуры (то что возвращает sizeof), чтобы обеспечить выравнивание ее членов по границе. Сам я если честно с таким никогда не сталкивался (а может мало пытался?..), но всякие умные источники (Герберд Шилдт, мои товарищи) утверждают. Так что вариант, который Вам предложили в последнем посте самый правильный.

Вот именно из-за возможности выравнивания вариант с жестким указанием размера в первом поле и не годится. Изменим уровень оптимизации, поменяем компилятор, или поменяем платформу и придется во всех структурах менять это значение. У GCC еще есть возможность упаковывать структуры, с помощью ключей компиляции.
Samodelkin
Цитата(Qwertty @ Mar 6 2008, 17:29) *
Вот именно из-за возможности выравнивания вариант с жестким указанием размера в первом поле и не годится. Изменим уровень оптимизации, поменяем компилятор, или поменяем платформу и придется во всех структурах менять это значение. У GCC еще есть возможность упаковывать структуры, с помощью ключей компиляции.


Ну про жесткое указание никто не говорит, но вот получается что и sizeof тоже "врет" в некоторых случаях!!!! Вот и возникает вопрос, как безошибочно выяснить реальный обьем данных в структуре!!!!!????
Demeny
Цитата(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, и это тоже правильно !!!
bzx
У тебя путаница с указателями в голове... То что ты хочешь получить должно выглядить так:
Код
typedef struct {
unsigned char KontursStatus[16];
} TXx16;
...
TXx16    TX_x16_i2c_01;
...
IndexDataTX = (char*) &TX_x16_i2c_01;
Buff_size = sizeof (TX_x16_i2c_01);
Buff_size = sizeof(*(TXx16*)IndexDataTX);

На самом деле это фигня..., получается что надо знать априорно в обрабатываемой ф-ии к какому типу преобразовывать данный указатель и делать это всё на уровне препроцессора... странно...
Samodelkin
Цитата(Demeny @ Mar 6 2008, 17:52) *
Теперь правильно с точки зрения синтаксиса. И sizeof (TX_x16_i2c_01) равен 16, а sizeof(IndexDataTX[0]) зависит от того, каким типом указателя я объявлю переменную IndexDataTX. Если это указатель на char, то sizeof(IndexDataTX[0]) == 1, если это указатель на структуру, то и результат равен размеру структуры. В чём несоответствие ?
[/code]


Согласен, так оно и есть! Но КАК обьявить переменную IndexDataTX так чтобы это был указатель на структуру и результат sizeof был равен размеру структуры?????
Чем её обьявить?????
zltigo
Цитата(Qwertty @ Mar 6 2008, 16:29) *
Вот именно из-за возможности выравнивания вариант с жестким указанием размера в первом поле и не годится.

Годится, просто он должен инициализироваться через sizeof() smile.gif

Цитата(Samodelkin @ Mar 6 2008, 16:37) *
что и sizeof тоже "врет" в некоторых случаях!!!!
...
Чем её обьявить?????

Не врет. Никак. Испейте валерианки, и перечитайте топик с начала медленно и печально.
Сергей Борщ
Цитата(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(;;)
     ;
}
Samodelkin
Цитата(Сергей Борщ @ 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
InvisibleFed
Это все хорошо, но как тогда быть с тем, что sizeof, пусть даже теоретически, но "ВРЕТ"!? Вам известен размер структуры, запихиваете его в поле size этой структуры. И запихиваете, не то что выдает sizeof, а то что Вы как программист наверняка знаете. Вариант zltigo может обломиться опять же по причине того, что могут получиться реально разные по размеру переменные типа структуры с одним и тем же значением в поле size. В функцию передаете указатель на структуру. Теперь уместный вопрос: а как тогда определить внутри вызываемой функции конкретный тип структуры, ее размер? У меня нет ответа. =) Я примерно год назад разбирал код одной библиотеки (Jasper, JPEG2000). Код большой и красивый (коментариев мало, но структурированность хорошая для чистого C). Так вот там встретил вариант от которого плевался. Принцип на Ваш случай такой. Делать поле size первым полем структуры (всех) и, зная это, обращаться к этому полю, начиная с первого байта указаеля. Т.е. если size это 32 разряда int, то вот первых четыре байта и выдергивать из области памяти по указателю. Понимаю, выглядит ОООчень коряво, но так, как оказалось, делают даже крутые разработчики (тот кто написал Jasper для меня крут, достаточно чуток над кодом посидеть, чтобы это понять).
rezident
Цитата(InvisibleFed @ Mar 7 2008, 04:50) *
Понимаю, выглядит ОООчень коряво, но так, как оказалось, делают даже крутые разработчики (тот кто написал Jasper для меня крут, достаточно чуток над кодом посидеть, чтобы это понять).
Я не крутой программист, скорее даже наоборот smile.gif Но столкнувшись первый раз с проблемами применения incomplete array в структурах, я решил проблему подобным же образом.
Объявлял массив структур разного (заранее не известного) размера как простой одномерный массив байт с одновременной инициализацией его данными описания. Первым элементом в каждой структуре был байт, описывающий размер данной структуры. В самой программе имеется только указатель на этот массив структур. Обрабатывается массив последовательно и поэтому особых проблем с разбором его нет. Уже пару лет сопровождаю этот проект и проблем при составлении описания такой структуры под конкретную конфигурацию устройства я не испытываю.
Непомнящий Евгений
Цитата(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. Затраты сравнимые. Геморроя у вас конечно будет больше. Но с другой стороны, если вы это часто используете - переходите на С++.
zltigo
Цитата(InvisibleFed @ Mar 7 2008, 02:50) *
Это все хорошо, но как тогда быть с тем, что sizeof, пусть даже теоретически, но "ВРЕТ"!?

А как быть с тем, что начет того, что sizeof() врет, "врет" кто-то другой smile.gif? sizeof() четко и ясно выполняет свою функцию.
amw
Цитата(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 бит значения.

Хотите получить точное соответствие - используйте упакованные стрктуры.
InvisibleFed
Уважаемые, обратите внимание на ковычки до и после слова "врет". Ясно, что "sizeof возвращает размер структуры с учетом выравнивания". Но Вы посмотрите, что требуется уважаемому Samodelkin! Ему требуется определить фактически тип струткру передаваемых данных по ее размеру. Могут существовать две и более структур, значение которых sizeof вернет одинаковыми (хотя фактически типы и переменные имеют РАЗНЫЕ размеры). Samodelkin в качестве поля структуры приводит массив. Вот пример того, что может случится.

Код
struct {
    char array[3];
} struct_v1; // Размер типа для 32-х разрадной машины: 4

struct {
     char array[4];
} struct_v2; // Размер типа для 32-х разрадной машины: 4


И как теперь определить обработчик для типа данных? Совершенно очевиден смысл sizeof, но человек, задающий вопрос помоему объяснил для чего ему это надо - определить функцию-обработчик по размеру струткруры. Вот и получается, что сделать он это в предложенном варианте zltigo:
Цитата
"Вот именно из-за возможности выравнивания вариант с жестким указанием размера в первом поле и не годится."

Годится, просто он должен инициализироваться через sizeof().


не сможет (sizeof в обоих случаях вернет 4, которое Samodelkin запишет в специальное поле структуры... а что толку? Различить потом struct_v1 и struct_v2 по этому полю уже не сможет).
zltigo
Цитата(InvisibleFed @ Mar 7 2008, 15:10) *
что требуется уважаемому Samodelkin!

Меня вопросы извлечения "из ничего" сначала размера структуры, а затем еще и типа струтуры не интересуют в принципе. sizeof() делает свою работу и любые рассуждения и упреки, хоть в кавычках, хоть без, к тому, что он чего-то еще комуто не сказал, хотя оооочень надо совершенно бессмысленны.



Цитата(InvisibleFed @ Mar 7 2008, 15:10) *
сделать он это в предложенном варианте zltigo:
не сможет

Я предлагал, то, о чем в том момент шла речь - автоматическое (а не через дивную константу) размещение размера стуктуры в ней самой. Подчеркиваю именно это - не больше и не меньше, а не что либо другое.
InvisibleFed
Обсуждать по теме тут нечего. Я лично не понял ни назначения первой реплики zltigo, ни основания вырезания из контекста своих собственных слов во втором коментарии. Думаю Samodelkin уже со всем определился. Всем спасибо за дискуссию.
zltigo
Цитата(InvisibleFed @ Mar 7 2008, 16:09) *
Обсуждать по теме тут нечего.

Очень рад, что и Вы это наконец-то поняли.
radiofill
Цитата(Samodelkin @ Mar 6 2008, 12:54) *
Если к команде 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, и это ЛАЖА!!!




sizeof() возвращает размер указателя. повнимательней почитай руководство по си (сам с указателями долго путался...)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.