очень хитрый вопрос
От: Молочный Леонид Николаевич  
Дата: 20.05.01 10:02
Оценка:
Есть такое дело ,объвляю структуру (одни данные )и к примеру мне нужно
заполнить её нулями вроде бы стандартная задача(использую memset),но делая
sizeof получаю размер на 4 байта больше это я потом вспомнил ,что это this
указатель, но просто из-за sizeof он у меня часто используется проблемы
возникают ,что мне делать подскажите ,как получить правильный размер ,так
как если это с то всё пучком если C++ проблемы.
и такое дело объявляю
struct {
unsigned char ver:4;
unsigned char len:4;
}
в памяти оно меняет октеты местами ,мне это не нужно ,хотя на самом деле это
было бы прваильно если это был бы один байт ,что мне делать ?


--
mailto: leon@ic.kharkov.ua
Re: очень хитрый вопрос
От: Аноним  
Дата: 20.05.01 11:14
Оценка:
Здравствуйте Молочный Леонид Николаевич, вы писали:

МЛН>struct {

МЛН>unsigned char ver:4;
МЛН>unsigned char len:4;
МЛН>}



typedef struct tagMyStruct
{
unsigned char ver;
unsigned char len;
}MYSTRUCT;

MYSTRUCT MyStruct;
memset((void*)&MyStruct,0,sizeof(MYSTRUCT));
Re: очень хитрый вопрос
От: Vitek  
Дата: 20.05.01 13:20
Оценка:
Здравствуйте Молочный Леонид Николаевич, вы писали:

МЛН>Есть такое дело ,объвляю структуру (одни данные )и к примеру мне нужно

МЛН>заполнить её нулями вроде бы стандартная задача(использую memset),но делая
МЛН>sizeof получаю размер на 4 байта больше это я потом вспомнил ,что это this
МЛН>указатель, но просто из-за sizeof он у меня часто используется проблемы
МЛН>возникают ,что мне делать подскажите ,как получить правильный размер ,так
МЛН>как если это с то всё пучком если C++ проблемы.
МЛН>и такое дело объявляю
МЛН>struct {
МЛН>unsigned char ver:4;
МЛН>unsigned char len:4;
МЛН>}
МЛН>в памяти оно меняет октеты местами ,мне это не нужно ,хотя на самом деле это
МЛН>было бы прваильно если это был бы один байт ,что мне делать ?

На C++Builder...
Октеты действительно меняет...
Но размер — 1 байт. И всё вроде даже логично.
Кстати о каком this идёт речь. Что это такое? (в данном контексте)

Вроде не класс. Обычная структура.
Почему ж тогда на Си++ проблемы (повторяю — у меня всё нормально)

Если проблемы с размером не связаны с описанной структурой, то...
Компиляторы имеют свойство... эээ... забыл как это по-русски...
Alignment что-ли.
Короче выравнивание происходит по размеру int'а (т.е. в Win32 на 4 байта).
Причём каждого параметра структуры (если их нельзя объединить).

struct st {
char v1;
char v2;
int v3;
};
Енто будет 8 байт (а не 6)
Первые 4 — char v1 и v2
Последние — int v3

struct st {
char v1;
int v3;
char v2;
};
А вот енто... ни за что не угадаешь — будет 12 байт (и не 6, и не 8)
Первые 4 — char v1
Вторые — int v3
Последние — char v2

Ээээ... такие фокусы нам ещё Коперфильд в институте на физике показывал

st a;
... = &a; // адрес структуры
... = &(a.v3); // адрес переменной v3
... = ((char*)&(s.v3)) — ((char*)&s); // смещение переменной v3 в структуре

--
Шутки шутками, но... если что надо спрашивай
Victor Dunaev (vitek@fromru.com)
Re[2]: очень хитрый вопрос
От: Аноним  
Дата: 29.05.01 12:15
Оценка:
Здравствуйте Vitek, вы писали:

V>Кстати о каком this идёт речь. Что это такое? (в данном контексте)

V>Вроде не класс. Обычная структура.

struct это уже давно класс.
Dan.
Re[3]: очень хитрый вопрос
От: Vitek  
Дата: 29.05.01 16:00
Оценка:
Здравствуйте Аноним, вы писали:

V>>Кстати о каком this идёт речь. Что это такое? (в данном контексте)

V>>Вроде не класс. Обычная структура.

А>struct это уже давно класс.

А>Dan.

Да!.. действительно :-(

И до этого добрались!.. изверги

Ну на х... структуру то было трогать.
Ну сделали же класс. Так нет же!.. и структуру в класс переделали.
Всё испортят

ДА ЗДРАВСТВУЕТ ЧИСТЫЙ СИ!
Re: очень хитрый вопрос
От: Edward Россия  
Дата: 30.05.01 06:28
Оценка:
Здравствуйте Молочный Леонид Николаевич, вы писали:

МЛН>Есть такое дело ,объвляю структуру (одни данные )и к примеру мне нужно

МЛН>заполнить её нулями вроде бы стандартная задача(использую memset),но делая
МЛН>sizeof получаю размер на 4 байта больше это я потом вспомнил ,что это this
МЛН>указатель, но просто из-за sizeof он у меня часто используется проблемы
МЛН>возникают ,что мне делать подскажите ,как получить правильный размер ,так
МЛН>как если это с то всё пучком если C++ проблемы.
МЛН>и такое дело объявляю
МЛН>struct {
МЛН>unsigned char ver:4;
МЛН>unsigned char len:4;
МЛН>}
МЛН>в памяти оно меняет октеты местами ,мне это не нужно ,хотя на самом деле это
МЛН>было бы прваильно если это был бы один байт ,что мне делать ?


МЛН>--

МЛН>mailto: leon@ic.kharkov.ua

Ты не мог бы объяснить что это за объявление структуры
struct {
unsigned char ver:4;
unsigned char len:4;
}, а именно, что это за двоеточия с циферками :)
насколько я знаю структуры объявляются вот так:
struct
{
unsigned char ver;
unsigned char len;
}
а у тебя что-то вроде "union" получилось, отсюда и все беды
Re: очень хитрый вопрос
От: IT Россия linq2db.com
Дата: 30.05.01 20:39
Оценка:
МЛН>Есть такое дело ,объвляю структуру (одни данные )и к примеру мне нужно
МЛН>заполнить её нулями вроде бы стандартная задача(использую memset),но делая
МЛН>sizeof получаю размер на 4 байта больше это я потом вспомнил ,что это this
МЛН>указатель, но просто из-за sizeof он у меня часто используется проблемы

this тут ни при чём, он в данных класса не появляется никогда ни при каких обстоятельствах. Ты наверное имел ввилу указатель на таблицу виртуальных методов? Но он создаётся компилятором только в случае объявления хотя бы одной виртуальной функции.

МЛН>возникают ,что мне делать подскажите ,как получить правильный размер ,так

МЛН>как если это с то всё пучком если C++ проблемы.
МЛН>и такое дело объявляю
МЛН>struct {
МЛН>unsigned char ver:4;
МЛН>unsigned char len:4;
МЛН>}
МЛН>в памяти оно меняет октеты местами ,мне это не нужно ,хотя на самом деле это
МЛН>было бы прваильно если это был бы один байт ,что мне делать ?

Скорее всего проблемы с выравниванием, попробуй поставить

#pragma pack(push,1)
struct {
unsigned char ver:4;
unsigned char len:4;
};
#pragma pack(pop)
Если нам не помогут, то мы тоже никого не пощадим.
Re: очень хитрый вопрос
От: Rush ok.novgorod.net/rush
Дата: 08.06.01 22:49
Оценка:
memset( this, 0, sizeof(*this) );
Re[2]: очень хитрый вопрос
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 18.06.01 09:43
Оценка:
Здравствуйте Edward, вы писали:

E>Здравствуйте Молочный Леонид Николаевич, вы писали:


МЛН>>Есть такое дело ,объвляю структуру (одни данные )и к примеру мне нужно

МЛН>>заполнить её нулями вроде бы стандартная задача(использую memset),но делая
МЛН>>sizeof получаю размер на 4 байта больше это я потом вспомнил ,что это this
МЛН>>указатель, но просто из-за sizeof он у меня часто используется проблемы
МЛН>>возникают ,что мне делать подскажите ,как получить правильный размер ,так
МЛН>>как если это с то всё пучком если C++ проблемы.
МЛН>>и такое дело объявляю
МЛН>>struct {
МЛН>>unsigned char ver:4;
МЛН>>unsigned char len:4;
МЛН>>}
МЛН>>в памяти оно меняет октеты местами ,мне это не нужно ,хотя на самом деле это
МЛН>>было бы прваильно если это был бы один байт ,что мне делать ?


МЛН>>--

МЛН>>mailto: leon@ic.kharkov.ua

E>Ты не мог бы объяснить что это за объявление структуры

E>struct {
E>unsigned char ver:4;
E>unsigned char len:4;
E>}, а именно, что это за двоеточия с циферками :)
E>насколько я знаю структуры объявляются вот так:
E>struct
E>{
E>unsigned char ver;
E>unsigned char len;
E>}
E>а у тебя что-то вроде "union" получилось, отсюда и все беды
Читайте manual...
А двоеточия это объявления битовых полй.(unsigned char ver:4 значит что ver -поле, содержащее первые четыре бита структуры; unsigned char len:4 — следующие четыре бита). Итого, структура состоит из двух полй, размером по четыре бита, то есть должна занимать 1 байт. Подчеркну, должна, а сколько она реально будет занимать зависит от параметров компилятора.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.